получение hWnd вызвавшего из DLL без поиска по имени класса и заголовка окна если dll грузят по LoadLibrary, я могу узнать хэндл основного модуля через invoke GetModuleHandle, NULL есть ли простой способ получить hWnd вызвавшего меня (DLL) приложения. опять же таки - с учётом того, что имя класса и заголовок не применимы.
дело в том, что мне нужен _общий_ метод определения hWnd основного окна вызвавшего меня приложения, причём учитывая, что возможно меня могут вызывать только один раз при инициализации dll, т.е. основное приложение вообще не намерено передавать мне какие бы то ни было параметры. DllMain и всё
shoo не имеет родителя Owner или Parent? Например, эквалайзер, список воспроизведения в winamp'е не имеют Parent, но имеют Owner. Jupiter Список окон конкретного приложения определять умеешь?
Вы уклоняетесь от темы всеми правдами и неправдами. Вопрос был: как из ДЛЛ узнать хоть что-то о вызвавшем процессе. Вопрос сей и меня гложет уже давно, так что если кто знает или думает что знает - делитесь мыслями.
n0p По-моему уже давно намекнули, перебрать все окна, найти таким образом нужное определяя и сравнивая PID процесса
Вот примерный код, но есть странность, код иногда находит какое-то другое окно у приложения у которого окно всего одно %) Код (Text): .486 .model flat, stdcall option casemap:none include \masm32\include\windows.inc include \masm32\include\kernel32.inc include \masm32\include\user32.inc includelib \masm32\lib\user32.lib includelib \masm32\lib\kernel32.lib include \masm32\macros\macros.inc EnumWindowsFunc PROTO :DWORD, :DWORD .DATA format db "hWnd: %08lX",0 .DATA? sBuff db 20 dup (?) .CODE ALIGN DWORD DllEntry proc hi:DWORD, reason:DWORD, reserved1:DWORD option PROLOGUE:NONE option EPILOGUE:NONE .IF (DWORD PTR [esp+8]) == DLL_PROCESS_ATTACH invoke EnumWindows, OFFSET EnumWindowsFunc, $invoke(GetCurrentProcessId) .ENDIF xor eax, eax inc eax ret (sizeof DWORD)*3 option PROLOGUE:PROLOGUEDEF option EPILOGUE:EPILOGUEDEF DllEntry Endp ALIGN DWORD EnumWindowsFunc proc hwnd, lParam LOCAL dwProcessId:DWORD invoke GetWindowThreadProcessId, hwnd, ADDR dwProcessId mov ecx, lParam .IF dwProcessId == ecx invoke wsprintf, OFFSET sBuff, OFFSET format, hwnd invoke MessageBox, 0, OFFSET sBuff, 0, MB_OK or MB_ICONINFORMATION xor eax, eax .ELSE xor eax, eax inc eax .ENDIF ret EnumWindowsFunc endp End DllEntry
Jupiter > сколько ни пытался, глюк не воспроизвёл Убери xor eax,eax после MessageBox и посмотри сколько раз вызовется и какие хэндлы покажет, сравни их с показываемыми Spy++ например.
Asterix хм... действительно... но у меня всегда самый первый хэндл - как раз тот, который нужно? а вот все отсальные... я их вообще не нахожу среди хэндлов окна короче, самый первый найденный хэнд и есть то, что нужно проверил на многих прогах - работает
Asterix в том то и дело, что ни заголовок, ни имя класса заранее не известны (я об этом уже несколько раз написал
Asterix .DATA format db "hWnd: %08lX",0 .DATA? sBuff db 10 dup (?) Imho буфер нужен не меньше 15 байт. strlen("hWnd: ") = 6 + 8 из %08lX + 1 - нуль-символ.