получение hWnd вызвавшего из DLL

Тема в разделе "WASM.WIN32", создана пользователем Jupiter, 13 мар 2005.

  1. Jupiter

    Jupiter Jupiter

    Публикаций:
    0
    Регистрация:
    12 авг 2004
    Сообщения:
    532
    Адрес:
    Russia
    получение hWnd вызвавшего из DLL



    без поиска по имени класса и заголовка окна



    если dll грузят по LoadLibrary, я могу узнать хэндл основного модуля через invoke GetModuleHandle, NULL



    есть ли простой способ получить hWnd вызвавшего меня (DLL) приложения.

    опять же таки - с учётом того, что имя класса и заголовок не применимы.
     
  2. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine
    Хендл окна твоего процесса чтоли, а если окон 20 штук, то которого из них тебе нужен хендл?
     
  3. Jupiter

    Jupiter Jupiter

    Публикаций:
    0
    Регистрация:
    12 авг 2004
    Сообщения:
    532
    Адрес:
    Russia


    именно



    их не 20. это раз.

    и мне нужен хэндл основного окна. это два.
     
  4. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    Jupiter

    Каковы критерии, определяющие, что окно основное?
     
  5. Jupiter

    Jupiter Jupiter

    Публикаций:
    0
    Регистрация:
    12 авг 2004
    Сообщения:
    532
    Адрес:
    Russia


    оно единственное (по крайней мере на момент инициализации dll)
     
  6. shoo

    shoo New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2003
    Сообщения:
    1.537
    Адрес:
    Ukraine


    не имеет родителя, видимо...
     
  7. Jupiter

    Jupiter Jupiter

    Публикаций:
    0
    Регистрация:
    12 авг 2004
    Сообщения:
    532
    Адрес:
    Russia
    дело в том, что мне нужен _общий_ метод определения hWnd основного окна вызвавшего меня приложения, причём учитывая, что возможно меня могут вызывать только один раз при инициализации dll, т.е. основное приложение вообще не намерено передавать мне какие бы то ни было параметры.

    DllMain и всё
     
  8. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    shoo

    не имеет родителя

    Owner или Parent?

    Например, эквалайзер, список воспроизведения в winamp'е не имеют Parent, но имеют Owner.



    Jupiter

    Список окон конкретного приложения определять умеешь?
     
  9. n0p

    n0p 10010000b

    Публикаций:
    0
    Регистрация:
    7 май 2003
    Сообщения:
    256
    Адрес:
    Новосиbeerск
    Вы уклоняетесь от темы всеми правдами и неправдами.

    Вопрос был: как из ДЛЛ узнать хоть что-то о вызвавшем процессе. Вопрос сей и меня гложет уже давно, так что если кто знает или думает что знает - делитесь мыслями.
     
  10. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    n0p

    По-моему уже давно намекнули, перебрать все окна, найти таким образом нужное определяя и сравнивая PID процесса
     
  11. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    Вот примерный код, но есть странность, код иногда находит какое-то другое окно у приложения у которого окно всего одно %)
    Код (Text):
    1. .486
    2. .model flat, stdcall
    3. option casemap:none
    4.  
    5. include \masm32\include\windows.inc
    6. include \masm32\include\kernel32.inc
    7. include \masm32\include\user32.inc
    8. includelib \masm32\lib\user32.lib
    9. includelib \masm32\lib\kernel32.lib
    10.  
    11. include \masm32\macros\macros.inc
    12.  
    13.  
    14. EnumWindowsFunc  PROTO  :DWORD, :DWORD
    15.  
    16. .DATA
    17.  
    18. format  db "hWnd: %08lX",0
    19.  
    20. .DATA?
    21.  
    22. sBuff  db 20 dup (?)
    23.  
    24.  
    25. .CODE
    26.  
    27. ALIGN DWORD
    28. DllEntry proc hi:DWORD, reason:DWORD, reserved1:DWORD
    29. option PROLOGUE:NONE
    30. option EPILOGUE:NONE
    31.   .IF (DWORD PTR [esp+8]) == DLL_PROCESS_ATTACH
    32.       invoke EnumWindows, OFFSET EnumWindowsFunc, $invoke(GetCurrentProcessId)
    33.   .ENDIF
    34.   xor eax, eax
    35.   inc eax
    36.   ret (sizeof DWORD)*3
    37. option PROLOGUE:PROLOGUEDEF
    38. option EPILOGUE:EPILOGUEDEF
    39. DllEntry Endp
    40.  
    41.  
    42. ALIGN DWORD
    43. EnumWindowsFunc proc hwnd, lParam
    44. LOCAL dwProcessId:DWORD
    45.  
    46.   invoke GetWindowThreadProcessId, hwnd, ADDR dwProcessId
    47.   mov ecx, lParam
    48.   .IF dwProcessId == ecx
    49.      invoke wsprintf, OFFSET sBuff, OFFSET format, hwnd
    50.      invoke MessageBox, 0, OFFSET sBuff, 0, MB_OK or MB_ICONINFORMATION
    51.      xor eax, eax
    52.   .ELSE
    53.      xor eax, eax
    54.      inc eax
    55.   .ENDIF
    56.   ret
    57. EnumWindowsFunc endp
    58.  
    59.  
    60. End DllEntry
     
  12. Jupiter

    Jupiter Jupiter

    Публикаций:
    0
    Регистрация:
    12 авг 2004
    Сообщения:
    532
    Адрес:
    Russia
    Asterix

    огромное спасибо!



    сколько ни пытался, глюк не воспроизвёл ;)
     
  13. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    Jupiter

    > сколько ни пытался, глюк не воспроизвёл ;)

    Убери xor eax,eax после MessageBox и посмотри сколько раз вызовется и какие хэндлы покажет, сравни их с показываемыми Spy++ например.
     
  14. Jupiter

    Jupiter Jupiter

    Публикаций:
    0
    Регистрация:
    12 авг 2004
    Сообщения:
    532
    Адрес:
    Russia
    Asterix

    хм... действительно...

    но у меня всегда самый первый хэндл - как раз тот, который нужно? а вот все отсальные... я их вообще не нахожу среди хэндлов окна



    короче, самый первый найденный хэнд и есть то, что нужно

    проверил на многих прогах - работает
     
  15. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    Гы, иногда первый хэндл приходит левый, так что без проверки заголовка окна никак не обойтись..
     
  16. Jupiter

    Jupiter Jupiter

    Публикаций:
    0
    Регистрация:
    12 авг 2004
    Сообщения:
    532
    Адрес:
    Russia
    Asterix

    в том то и дело, что ни заголовок, ни имя класса заранее не известны (я об этом уже несколько раз написал ;)
     
  17. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    Asterix

    .DATA

    format db "hWnd: %08lX",0

    .DATA?

    sBuff db 10 dup (?)


    Imho буфер нужен не меньше 15 байт.

    strlen("hWnd: ") = 6 + 8 из %08lX + 1 - нуль-символ.
     
  18. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    q_q

    Ты прав. Я эту строчку с "копи-пастал" из другого исходника, забыл поправить размер.
     
  19. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    Asterix

    Т.е. в другом исходнике тоже ошибка?
     
  20. Jupiter

    Jupiter Jupiter

    Публикаций:
    0
    Регистрация:
    12 авг 2004
    Сообщения:
    532
    Адрес:
    Russia
    q_q



    ошибка повсюду, она среди нас