WM_COMMAND

Тема в разделе "WASM.BEGINNERS", создана пользователем vg, 25 сен 2007.

  1. vg

    vg New Member

    Публикаций:
    0
    Регистрация:
    16 апр 2007
    Сообщения:
    475
    Можно ли послать сообщение WM_COMMAND от одной проги к другой(получатель), если я знаю имя процесса получателя? Если можно, то как?
     
  2. Asterix

    Asterix New Member

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

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    vg
    EnumWindows / GetWindowProcessThreadId. найдешь нужное окно и пошлешь сообщение
     
  4. Geen

    Geen New Member

    Публикаций:
    0
    Регистрация:
    23 июл 2007
    Сообщения:
    51
    SendMassage и хоть паинт , хоть посткуит ... что хочешь.
     
  5. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Geen
    он знает только имя процесса. а надо хендл окна
     
  6. Mi256

    Mi256 New Member

    Публикаций:
    0
    Регистрация:
    24 сен 2007
    Сообщения:
    116
    только имя? ну тогда вот попробуй напр. такой метод:

    1) перебрать все ring3 не скрытие процессы с помощью напр. toolhelp;
    2) сравнивать имя нужного процеса со всеми по очереди;
    3) когда найдено - тоже из toolhelp получить PID;
    4) по PID взять хендл главного треда процеса;
    5) послать етой треде WM_command;

    длинновато, но должно получится :)
     
  7. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    кстати это как.. чето не припомню такой апишки.
    имхо надо перебирать все окна и сравнивать возвращенный PID от GetWindowThreadProcessId с найденным через toolhelp
     
  8. Mi256

    Mi256 New Member

    Публикаций:
    0
    Регистрация:
    24 сен 2007
    Сообщения:
    116
    возможно из toolhelp вытянуть ID Треда а ето уже ближе...
    я не очень-то помню но по-моему чтото вроде GetThreadByPID или какая то другая апи с ID-приставкой возвращает именно хендл [да должна же бить в kernel32 ... :) ]
    А если он хочет послать к-нибуть службе "без окон" ?
    Если окно есть а функция не поможет, то уш действительно - сделать как говорил Great
     
  9. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    мб ты про GetWindowThreadProcessId? Но возвращает она не хендл.

    ЗЫ. А бить никого в kernel32 не надо)
     
  10. Mi256

    Mi256 New Member

    Публикаций:
    0
    Регистрация:
    24 сен 2007
    Сообщения:
    116
    да нет нето...
    Возьму дизассемблер и посмотрю


    БЫТЬ!!! :))) я-украинец всё-таки
     
  11. Freeman

    Freeman New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2005
    Сообщения:
    1.385
    Адрес:
    Ukraine
    насколько помню, сообщение посылается окну, а не треду. не через TID, а через hwnd...
     
  12. Aspire

    Aspire New Member

    Публикаций:
    0
    Регистрация:
    19 май 2007
    Сообщения:
    1.028
    ЗЫ. А бить никого в kernel32 не надо) )))))))) Извините, за оффтоп. 5 баллов )))))
     
  13. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    FreeManCPM
    ну исчо есть PostThreadMessage. но к окну слабо относится afair

    Aspire
    стараемся)
     
  14. Mi256

    Mi256 New Member

    Публикаций:
    0
    Регистрация:
    24 сен 2007
    Сообщения:
    116
    вот же нагрузили блин...

    Да, реально, сообщения обрабатывает только окно. Ну тогда получаем из тулхелп только process ID и перебираем всё окна как говорил Great. А найдя окно - далее уже легче послать ему сообщение. Трудная задача (поетому и код большой) - если есть только имя процеса, а если процесс не имеет окон - тогда вообще врятли послать удастся...
    О тулхелпе есть статья на васме.
     
  15. vg

    vg New Member

    Публикаций:
    0
    Регистрация:
    16 апр 2007
    Сообщения:
    475
    Чего-то я не до конца понял.

    Нахожу нужный процесс через toolhelp
    Код (Text):
    1. .data
    2.    cFormat   db "%s",0
    3.    needname  db "proga.exe",0
    4. .data?
    5.    uProcess  PROCESSENTRY32 <>
    6.    hSnapshot dd ?
    7.    tBuffer   db 255 dup(?)
    8.  
    9.     invoke CreateToolhelp32Snapshot,TH32CS_SNAPPROCESS,0
    10.         mov    hSnapshot,eax
    11.         mov    uProcess.dwSize,sizeof PROCESSENTRY32
    12.         invoke Process32First,eax,addr uProcess
    13.         jmp    GetRunningApps_Chk
    14. GetRunningApps_Loop:
    15.         invoke wsprintf,addr tBuffer,addr  cFormat,addr  uProcess.szExeFile
    16.         invoke lstrcmp,addr tBuffer,addr needname
    17. .IF eax==0
    18.         здесь нужно определить handle окна процесса и послать сообщение
    19. .ENDIF
    20.         invoke Process32Next,hSnapshot,addr uProcess
    21. GetRunningApps_Chk:
    22.         test   eax,eax
    23.         jnz    GetRunningApps_Loop               ; if eax!=0 loop
    24.         invoke CloseHandle,hSnapshot
    А как определить handle окна процесса?
     
  16. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    EnumWindows + GetWindowThreadProcessId. Собственно, в #3 уже прозвучал ответ.
     
  17. kero

    kero Модератор SOURCES & 2LZ Команда форума

    Публикаций:
    0
    Регистрация:
    4 апр 2006
    Сообщения:
    1.074
    Адрес:
    Москва
    А в Дескриптор главного окна из HINSTANCE уже прозвучало, что EnumWindows поможет не всегда :)
    Помните -
    1) "message-only windows", +
    2) "главное окно" может и не быть top-level, которые EnumWindows только и энумит.
     
  18. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    kero
    Ну так у автора не абстрактная, а вполне конкретная цель. Значит, будет смотреть уже по обстоятельствам.
     
  19. Mi256

    Mi256 New Member

    Публикаций:
    0
    Регистрация:
    24 сен 2007
    Сообщения:
    116
    из msdn прочитал по поводу окон:

    EnumWindows - перечисляет всё топ-окна в системе;
    EnumChildWindows - перечисляет все дочерние окна принадлежащие данному;
    EnumThreadWindows - перечисляет все не дочерние (тоесть главные) окна заданого треда.

    И другие ( возможно пригодятся ;) )

    GetTopWindow -> GetNextWindow ->... все главные окна z-последовательности