Доброго времени суток. Задача: Эмуляция нажатия левой кнопки мыши в определенном окне в цикле, чтобы если даже это окно свернуто или скрыто, нажатие там работало. 1) Нахожу окно (Calc) 2) Получаю координаты курсора (GetCursorPos) 3) Получаю размеры окна (GetWindowRect) и высчитываю координаты курсора относительно нашего окна 4) Отправляю по этим координатам WM_MOUSEMOVE/WM_LBUTTONDOWN/WM_LBUTTONUP Код (Text): .686p .mmx .model flat,stdcall option casemap:none include \masm32\include\ntdll.inc includelib \masm32\lib\ntdll.lib include \masm32\include\kernel32.inc includelib \masm32\lib\kernel32.lib include \masm32\include\user32.inc includelib \masm32\lib\user32.lib .code FindWnd proc hWnd:DWORD,lParam:DWORD local pt:POINT local rect:RECT local Buffer[1024]:byte invoke GetWindowText,hWnd,addr Buffer,sizeof Buffer lea eax,Buffer .if dword ptr [eax] == 'claC' invoke GetCursorPos,addr pt invoke GetWindowRect,hWnd,addr rect mov eax,pt.y sub eax,rect.top mov pt.y,eax mov ecx,pt.x sub ecx,rect.left mov pt.x,ecx ;--------------------- mov eax,pt.y shl eax,16 mov eax,pt.x mov edi,eax invoke SendMessage,hWnd,WM_MOUSEMOVE,0,edi invoke SendMessage,hWnd,WM_LBUTTONDOWN,MK_LBUTTON,edi invoke SendMessage,hWnd,WM_LBUTTONUP,MK_LBUTTON,edi mov eax,0 ret .endif mov eax,1 ret FindWnd endp start proc invoke Sleep,2000 invoke EnumWindows,offset FindWnd,0 invoke ExitProcess,0 start endp end start Специально поставил 2 сек задержку чтобы курсор успели навести на какую-нитькнопку в калкуляторе, и если бы прога работала, эта кнопка бы нажималась. Вопрос, что нет так в коде?
Код (Text): mov eax,pt.y shl eax,16 mov eax,pt.x mov edi,eax Вероятно надо заменить на Код (Text): mov eax,pt.y shl eax,16 mov ax,word ptr pt.x mov edi,eax Но всё еще не кликает.
может enumchildwindows а им уже слать wm_lbutton* ? а если вы родительскому отправляете то тогда сразу слать wm_command с ид контрола ?
а проверить ? повесть спая на окно где хотим клик сделать и выполнить ваш код и посмотреть придут нет ваши сообщения