Допустим у меня работает некое приложение. Могу ли я из другой программы посылать сообщения которые бы имитировали действия пользователя ? Нажимали на кнопки приложения,заполняли текстовые поля, выбирали значения из радиобутоннов и т.д. Интересны примеры кода для XP, W2K.
Можно посылать сообщения из другого приложения (но не все они будут обрабатываться). сначала тебе нужно найти хэндл окна (или утилитой типа spyxx, или через FindWindow - в зависимости от задачи), a далее - например, если это диалог и известен ид кнопки - посылаешь окну с этим хэндлом типа SendDlgItemMessage,hWnd,but_id,BM_CLICK,0,0 - и наблюдаешь эффект также можно и тексты в эдиты вписывать, и т.п. если это чужое приложение, ид можно выяснить той же spyxx.
asmlamo: Допустим у меня работает некое приложение. Могу ли я из другой программы посылать сообщения которые бы имитировали действия пользователя ? Можно конечно. По крайней мере, я такое уже написал. Обычно это делается сообщениями Windows BM_CLICK и WM_SETTEXT (на самом деле полезных для автоматизации сообщений несколько больше), если номер не проходит - эмулируешь работу с клавиатурой (keybd_event вроде бы) и мышью.
Вот совсем примитивный пример. Когда-то один чел на работе очень любил в пасьянс-косынку играть, написал такую вот фигню, что бы его отучить: Код (Text): .386 .model flat, stdcall option casemap :none szText MACRO Name, Text:VARARG .data Name db Text,0 .code ENDM MsgBox MACRO HWnd, Message, MB_Title, uStyle local t1, t2 szText t1, Message szText t2, MB_Title invoke MessageBox, HWnd, ADDR t1, ADDR t2, uStyle ENDM .data TreadID dd 0 TargetClass db "Solitaire",0 .code ;this does some fun Play proc TargetHandle:DWORD mov ebx, 3 Rep1: invoke Sleep, 1000*10 invoke PostMessage, TargetHandle, WM_COMMAND, 1000, 0 dec ebx jnz Rep1 invoke ShowWindow, TargetHandle,SW_MAXIMIZE MsgBox TargetHandle, "Матрица следит за тобой!", "The Matrix", MB_APPLMODAL or MB_ICONEXCLAMATION invoke ShowWindow, TargetHandle,SW_NORMAL invoke Sleep, 1000*10 Rep3: mov ebx, 10 Rep2: invoke Sleep, 1000*1 ; invoke ShowWindow, TargetHandle,SW_HIDE invoke PostMessage, TargetHandle, WM_COMMAND, 1000, 0 ; invoke Sleep, 1000*1 ; invoke ShowWindow, TargetHandle,SW_SHOW dec ebx jnz Rep2 MsgBox TargetHandle, "Повторим?", "ГЫ-ГЫ-ГЫ!!!", MB_APPLMODAL or MB_ICONQUESTION or MB_RETRYCANCEL cmp eax, IDRETRY je Rep3 invoke PostMessage, TargetHandle, WM_QUIT, 0, 0 ; close window invoke ExitThread,eax ret Play endp ;proc runs from here start: mov ebx, 1 Find: invoke Sleep, 1000*5 invoke FindWindow, ADDR TargetClass, 0 or eax, eax je Find ; target window not found mov ecx, ebx TestFound: cmp [esp+ecx*4-4], eax ; now look is it already found window? je Find ; stop! no need to play twice dec ecx jnz TestFound push eax ; for future use invoke CreateThread, 0, 0, Play, eax, 0, ADDR TreadID inc ebx jmp Find ; wait for next one end start ЗЫ Вскоре он уволился..
Если хочешь поглубже в этом разобраться, то есть такая программка girder называется, в основном я ее использую для пульта, в ней такие навороты по этому поводу. Раньше она была бесплатная, и где-то проскакивали даже исходники, а теперь денег хотят вот их новый сайт: http://www.promixis.com Там много кто плагины делает на смежные темы.