Handle окна
Модераторы: d-view, Моторокер, Avada, CaptainFlint, Nik
Handle окна
Подскажите, кто знает,
Как можно получить Хэндл окна Командера из DLL-ки
Т.Е
BOOL APIENTRY DllMain( HANDLE __hModule,
__hModule - есть, можно ли с него Хэндл окна получить????
Как можно получить Хэндл окна Командера из DLL-ки
Т.Е
BOOL APIENTRY DllMain( HANDLE __hModule,
__hModule - есть, можно ли с него Хэндл окна получить????
- Моторокер
- Сообщения: 1517
- Зарегистрирован: Пт май 06, 2005 08:22
- Откуда: г. Пермь (читается Перьмь)
- Контактная информация:
Как узнать, что именно этот экземпляр вызвал dll?D1P писал(а):Длл - плагин TC или что-то другое? И чем FindWindow не подходит?
HWND FindWindow("TTOTAL_CMD",nil);
Триды просмотривать?
Может как-то проще можно?
Хочу из плагина галочку снять «Отдельные архивы для каждого файла»
плагины для Total Commander, статьи Graphics Converter; NSCopy; SEO HTML; KillOK; Плагин на Delphi
ПармаСруб - строительство домов и бань в Перми
ПармаСруб - строительство домов и бань в Перми
- DeathStalker
- Сообщения: 331
- Зарегистрирован: Пт сен 01, 2006 10:53
- Откуда: Санкт-Петербург
Функция возвращает хэндел процесса который загрузил dll (сам не пользовался:))
Справка Win32 Developer's References писал(а):The GetModuleHandle function returns a module handle for the specified module if the file has been mapped into the address space of the calling process.
HMODULE GetModuleHandle(
LPCTSTR lpModuleName // address of module name to return handle for
);
Parameters
lpModuleName
Points to a null-terminated string that names a Win32 module (either a .DLL or .EXE file). If the filename extension is omitted, the default library extension .DLL is appended. The filename string can include a trailing point character (.) to indicate that the module name has no extension. The string does not have to specify a path. The name is compared (case independently) to the names of modules currently mapped into the address space of the calling process.
If this parameter is NULL, GetModuleHandle returns a handle of the file used to create the calling process.
Return Values
If the function succeeds, the return value is a handle to the specified module.
If the function fails, the return value is NULL. To get extended error information, call GetLastError.
Remarks
The returned handle is not global, inheritable, or duplicative, and it cannot be used by another process.
The handles returned by GetModuleHandle and LoadLibrary can be used in the same functions ¾ for example, GetProcAddress, FreeLibrary, or LoadResource. The difference between the two functions involves the reference count. LoadLibrary maps the module into the address space of the calling process, if necessary, and increments the module's reference count, if it is already mapped. GetModuleHandle, however, returns the handle of a mapped module without incrementing its reference count.
Note that the reference count is used in FreeLibrary to determine whether to unmap the function from the address space of the process. For this reason, use care when using a handle returned by GetModuleHandle in a call to FreeLibrary because doing so can cause a dynamic-link library (DLL) module to be unmapped prematurely.
This function must also be used carefully in a multithreaded application. There is no guarantee that the module handle remains valid between the time this function returns the handle and the time it is used by another function. For example, a thread might retrieve a module handle by calling GetModuleHandle. Before the thread uses the handle in another function, a second thread could free the module and the system could load another module, giving it the same handle as the module that was recently freed. The first thread would then be left with a module handle that refers to a module different than the one intended.
Гугль - это Матрица, чем меньше его спрашивать, тем слабее будут машины во время Великой Битвы
TC10.00b6 x86 Windows 10 x64 (Windows 7 x64)
TC10.00b6 x86 Windows 10 x64 (Windows 7 x64)
- CaptainFlint
- Сообщения: 6239
- Зарегистрирован: Вт дек 14, 2004 22:34
- Контактная информация:
- Maximus
- Сообщения: 927
- Зарегистрирован: Чт апр 07, 2005 10:51
- Откуда: Украина, Кировоградская обл., г. Знаменка
- Контактная информация:
Код: Выделить всё
dwThreadID = GetCurrentThreadId();
EnumThreadWindows(dwCurThreadID,(WNDENUMPROC)EnumThreadWndProc,0);Код: Выделить всё
BOOL CALLBACK EnumThreadWndProc(HWND hWindow,LPARAM lParam)
{
char WindowText[256];
GetWindowText(hWindow,WindowText,256);//это просто чтобы посмотреть, какие окна ловятся
char WindowClass[256];
GetClassNameA(hWindow,WindowClass,256);//это тоже
if(IsWindowVisible(hWindow))
{
//это чтобы поймать видимое в данный момент окно. Не помню как работает, если активено модальное окно
//если не прокатит -- придется придумать другой способ
hRetWnd=hWindow;
return false;
}
if(hWindow==NULL) return false;
return true;
}Листер тоже создает окно верхнего уровня в том же потоке. Поэтому я бы посоветовал для большей надежности заменить проверку IsWindowVisible, на сравнение имени класса
Код: Выделить всё
GetClassName(hWindow,WindowClass,256);
if (strcmp(WindowClass,"TTOTAL_CMD")==0)
{
...
}
Доброго всем времени суток. Тут уже довольно много написано о получении дескриптора окна Total Commander, но все же хочу спросить:
Есть несколько методов для получения этого дескриптора, каким из них предпочтительней пользоваться? Я приведу три из них, которые с моей точки зрения, "имеют смысл быть"
1. Проще всего использовать функцию FindWindow( "TTOTAL_CMD", NULL ) в том месте где нужно получить дескриптор, это еще удобно тем, что не нужно использовать глобальные переменные (хотя в данном случае это не очень страшно, так как дескриптор будет один для всех ). Но!!! Но, поскольку эта функция ищет окна в их Z порядке начиная с верху, нужно быть точно уверенным что в данный момент "нужный" экземпляр Total Commander - а использовался последним среди всех, возможно, открытых!!!
2. Гораздо надежней использовать поиск окна по классу, в процессе в котором этот плагин запущен (Пример выше, в посте от Maximus с поправкой от VadiMGP)... Но метод на много более громоздкой, и подразумевает использование глобальных переменных ( эх... как без них сложно
)
3. Использовать параметр MainWin из функции FsExecuteFile()... Тут нужно немного уточнить... Почему то, при первом обращении к плагину (для каждой сессии Total Commander), она вызывается с пустой строкой в качестве параметра RemoteName. Я пытался найти описание этого случая в спецификации, но там ни слова... Если кто-то имеет более подробную спецификацию, отпишите пожалуйста!!! Так как это наиболее простой способ получить дескриптор окна!!!
Есть несколько методов для получения этого дескриптора, каким из них предпочтительней пользоваться? Я приведу три из них, которые с моей точки зрения, "имеют смысл быть"
1. Проще всего использовать функцию FindWindow( "TTOTAL_CMD", NULL ) в том месте где нужно получить дескриптор, это еще удобно тем, что не нужно использовать глобальные переменные (хотя в данном случае это не очень страшно, так как дескриптор будет один для всех ). Но!!! Но, поскольку эта функция ищет окна в их Z порядке начиная с верху, нужно быть точно уверенным что в данный момент "нужный" экземпляр Total Commander - а использовался последним среди всех, возможно, открытых!!!
2. Гораздо надежней использовать поиск окна по классу, в процессе в котором этот плагин запущен (Пример выше, в посте от Maximus с поправкой от VadiMGP)... Но метод на много более громоздкой, и подразумевает использование глобальных переменных ( эх... как без них сложно
3. Использовать параметр MainWin из функции FsExecuteFile()... Тут нужно немного уточнить... Почему то, при первом обращении к плагину (для каждой сессии Total Commander), она вызывается с пустой строкой в качестве параметра RemoteName. Я пытался найти описание этого случая в спецификации, но там ни слова... Если кто-то имеет более подробную спецификацию, отпишите пожалуйста!!! Так как это наиболее простой способ получить дескриптор окна!!!
VinSmile
Первый вызов с пустой строкой сделан для FTP плагинов и устанавливает "MODE I". Зачем это нужно Гислер когда-то говорил, но я не помню.
1. Он пригоден только если речь идет о работе из FS-плагина. Для остальных типов плагинов нужен другой метод.
2. Он годится только если ты железно уверен, что тебе не потребуется окно ТС до того, как будет вызвана функция FsExecuteFile() в первый раз. Иначе он бесполезен.
А в методе 2, кстати, глобальные переменные вовсе не обязательны. Исключительно дело вкуса.
Первый вызов с пустой строкой сделан для FTP плагинов и устанавливает "MODE I". Зачем это нужно Гислер когда-то говорил, но я не помню.
Да, но этот метод имеет свои недостатки.VinSmile писал(а):Так как это наиболее простой способ получить дескриптор окна!
1. Он пригоден только если речь идет о работе из FS-плагина. Для остальных типов плагинов нужен другой метод.
2. Он годится только если ты железно уверен, что тебе не потребуется окно ТС до того, как будет вызвана функция FsExecuteFile() в первый раз. Иначе он бесполезен.
А в методе 2, кстати, глобальные переменные вовсе не обязательны. Исключительно дело вкуса.