WM_COMMAND

Discussion in 'WASM.BEGINNERS' started by vg, Sep 25, 2007.

  1. vg

    vg New Member

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

    Asterix New Member

    Blog Posts:
    0
    Joined:
    Feb 25, 2003
    Messages:
    3,576
    найти главное окно искомого процесса, получить его хэндл и послать сообщение
     
  3. wasm_test

    wasm_test wasm test user

    Blog Posts:
    0
    Joined:
    Nov 24, 2006
    Messages:
    5,582
    vg
    EnumWindows / GetWindowProcessThreadId. найдешь нужное окно и пошлешь сообщение
     
  4. Geen

    Geen New Member

    Blog Posts:
    0
    Joined:
    Jul 23, 2007
    Messages:
    51
    SendMassage и хоть паинт , хоть посткуит ... что хочешь.
     
  5. wasm_test

    wasm_test wasm test user

    Blog Posts:
    0
    Joined:
    Nov 24, 2006
    Messages:
    5,582
    Geen
    он знает только имя процесса. а надо хендл окна
     
  6. Mi256

    Mi256 New Member

    Blog Posts:
    0
    Joined:
    Sep 24, 2007
    Messages:
    116
    только имя? ну тогда вот попробуй напр. такой метод:

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

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

    wasm_test wasm test user

    Blog Posts:
    0
    Joined:
    Nov 24, 2006
    Messages:
    5,582
    кстати это как.. чето не припомню такой апишки.
    имхо надо перебирать все окна и сравнивать возвращенный PID от GetWindowThreadProcessId с найденным через toolhelp
     
  8. Mi256

    Mi256 New Member

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

    wasm_test wasm test user

    Blog Posts:
    0
    Joined:
    Nov 24, 2006
    Messages:
    5,582
    мб ты про GetWindowThreadProcessId? Но возвращает она не хендл.

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

    Mi256 New Member

    Blog Posts:
    0
    Joined:
    Sep 24, 2007
    Messages:
    116
    да нет нето...
    Возьму дизассемблер и посмотрю


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

    Freeman New Member

    Blog Posts:
    0
    Joined:
    Feb 10, 2005
    Messages:
    1,385
    Location:
    Ukraine
    насколько помню, сообщение посылается окну, а не треду. не через TID, а через hwnd...
     
  12. Aspire

    Aspire New Member

    Blog Posts:
    0
    Joined:
    May 19, 2007
    Messages:
    1,028
    ЗЫ. А бить никого в kernel32 не надо) )))))))) Извините, за оффтоп. 5 баллов )))))
     
  13. wasm_test

    wasm_test wasm test user

    Blog Posts:
    0
    Joined:
    Nov 24, 2006
    Messages:
    5,582
    FreeManCPM
    ну исчо есть PostThreadMessage. но к окну слабо относится afair

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

    Mi256 New Member

    Blog Posts:
    0
    Joined:
    Sep 24, 2007
    Messages:
    116
    вот же нагрузили блин...

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

    vg New Member

    Blog Posts:
    0
    Joined:
    Apr 16, 2007
    Messages:
    475
    Чего-то я не до конца понял.

    Нахожу нужный процесс через toolhelp
    Code (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

    Blog Posts:
    0
    Joined:
    Oct 2, 2003
    Messages:
    4,300
    Location:
    Ukraine
    EnumWindows + GetWindowThreadProcessId. Собственно, в #3 уже прозвучал ответ.
     
  17. kero

    kero Модератор SOURCES & 2LZ Staff Member

    Blog Posts:
    0
    Joined:
    Apr 4, 2006
    Messages:
    1,074
    Location:
    Москва
    А в Дескриптор главного окна из HINSTANCE уже прозвучало, что EnumWindows поможет не всегда :)
    Помните -
    1) "message-only windows", +
    2) "главное окно" может и не быть top-level, которые EnumWindows только и энумит.
     
  18. IceStudent

    IceStudent Active Member

    Blog Posts:
    0
    Joined:
    Oct 2, 2003
    Messages:
    4,300
    Location:
    Ukraine
    kero
    Ну так у автора не абстрактная, а вполне конкретная цель. Значит, будет смотреть уже по обстоятельствам.
     
  19. Mi256

    Mi256 New Member

    Blog Posts:
    0
    Joined:
    Sep 24, 2007
    Messages:
    116
    из msdn прочитал по поводу окон:

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

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

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