Можно ли послать сообщение WM_COMMAND от одной проги к другой(получатель), если я знаю имя процесса получателя? Если можно, то как?
только имя? ну тогда вот попробуй напр. такой метод: 1) перебрать все ring3 не скрытие процессы с помощью напр. toolhelp; 2) сравнивать имя нужного процеса со всеми по очереди; 3) когда найдено - тоже из toolhelp получить PID; 4) по PID взять хендл главного треда процеса; 5) послать етой треде WM_command; длинновато, но должно получится
кстати это как.. чето не припомню такой апишки. имхо надо перебирать все окна и сравнивать возвращенный PID от GetWindowThreadProcessId с найденным через toolhelp
возможно из toolhelp вытянуть ID Треда а ето уже ближе... я не очень-то помню но по-моему чтото вроде GetThreadByPID или какая то другая апи с ID-приставкой возвращает именно хендл [да должна же бить в kernel32 ... ] А если он хочет послать к-нибуть службе "без окон" ? Если окно есть а функция не поможет, то уш действительно - сделать как говорил Great
мб ты про GetWindowThreadProcessId? Но возвращает она не хендл. ЗЫ. А бить никого в kernel32 не надо)
вот же нагрузили блин... Да, реально, сообщения обрабатывает только окно. Ну тогда получаем из тулхелп только process ID и перебираем всё окна как говорил Great. А найдя окно - далее уже легче послать ему сообщение. Трудная задача (поетому и код большой) - если есть только имя процеса, а если процесс не имеет окон - тогда вообще врятли послать удастся... О тулхелпе есть статья на васме.
Чего-то я не до конца понял. Нахожу нужный процесс через toolhelp Код (Text): .data cFormat db "%s",0 needname db "proga.exe",0 .data? uProcess PROCESSENTRY32 <> hSnapshot dd ? tBuffer db 255 dup(?) invoke CreateToolhelp32Snapshot,TH32CS_SNAPPROCESS,0 mov hSnapshot,eax mov uProcess.dwSize,sizeof PROCESSENTRY32 invoke Process32First,eax,addr uProcess jmp GetRunningApps_Chk GetRunningApps_Loop: invoke wsprintf,addr tBuffer,addr cFormat,addr uProcess.szExeFile invoke lstrcmp,addr tBuffer,addr needname .IF eax==0 здесь нужно определить handle окна процесса и послать сообщение .ENDIF invoke Process32Next,hSnapshot,addr uProcess GetRunningApps_Chk: test eax,eax jnz GetRunningApps_Loop ; if eax!=0 loop invoke CloseHandle,hSnapshot А как определить handle окна процесса?
А в Дескриптор главного окна из HINSTANCE уже прозвучало, что EnumWindows поможет не всегда Помните - 1) "message-only windows", + 2) "главное окно" может и не быть top-level, которые EnumWindows только и энумит.
kero Ну так у автора не абстрактная, а вполне конкретная цель. Значит, будет смотреть уже по обстоятельствам.
из msdn прочитал по поводу окон: EnumWindows - перечисляет всё топ-окна в системе; EnumChildWindows - перечисляет все дочерние окна принадлежащие данному; EnumThreadWindows - перечисляет все не дочерние (тоесть главные) окна заданого треда. И другие ( возможно пригодятся ) GetTopWindow -> GetNextWindow ->... все главные окна z-последовательности