Кликер для определенного окна

Тема в разделе "WASM.BEGINNERS", создана пользователем Flasher, 25 июн 2010.

  1. Flasher

    Flasher Member

    Публикаций:
    0
    Регистрация:
    31 янв 2004
    Сообщения:
    640
    Доброго времени суток.
    Задача:
    Эмуляция нажатия левой кнопки мыши в определенном окне в цикле, чтобы если даже это окно свернуто или скрыто, нажатие там работало.

    1) Нахожу окно (Calc)
    2) Получаю координаты курсора (GetCursorPos)
    3) Получаю размеры окна (GetWindowRect) и высчитываю координаты курсора относительно нашего окна
    4) Отправляю по этим координатам WM_MOUSEMOVE/WM_LBUTTONDOWN/WM_LBUTTONUP

    Код (Text):
    1. .686p
    2. .mmx
    3. .model flat,stdcall
    4. option casemap:none
    5.  
    6. include \masm32\include\ntdll.inc
    7. includelib \masm32\lib\ntdll.lib
    8. include \masm32\include\kernel32.inc
    9. includelib \masm32\lib\kernel32.lib
    10. include \masm32\include\user32.inc
    11. includelib \masm32\lib\user32.lib
    12.  
    13. .code
    14. FindWnd proc hWnd:DWORD,lParam:DWORD
    15.      local pt:POINT
    16.      local rect:RECT
    17.      local Buffer[1024]:byte
    18.        invoke GetWindowText,hWnd,addr Buffer,sizeof Buffer
    19.        lea eax,Buffer
    20.         .if dword ptr [eax] == 'claC'
    21.            invoke GetCursorPos,addr pt
    22.            invoke GetWindowRect,hWnd,addr rect
    23.            mov eax,pt.y
    24.            sub eax,rect.top
    25.            mov pt.y,eax
    26.            mov ecx,pt.x
    27.            sub ecx,rect.left
    28.            mov pt.x,ecx
    29. ;---------------------
    30.            mov eax,pt.y
    31.            shl eax,16
    32.            mov eax,pt.x
    33.            mov edi,eax
    34.  
    35.            invoke SendMessage,hWnd,WM_MOUSEMOVE,0,edi
    36.            invoke SendMessage,hWnd,WM_LBUTTONDOWN,MK_LBUTTON,edi
    37.            invoke SendMessage,hWnd,WM_LBUTTONUP,MK_LBUTTON,edi
    38.      
    39.            mov eax,0
    40.            ret
    41.         .endif
    42.        mov eax,1
    43.        ret
    44. FindWnd endp
    45.  
    46. start proc
    47.        invoke Sleep,2000
    48.        invoke EnumWindows,offset FindWnd,0
    49.        invoke ExitProcess,0
    50. start endp
    51. end start
    Специально поставил 2 сек задержку чтобы курсор успели навести на какую-нитькнопку в калкуляторе, и если бы прога работала, эта кнопка бы нажималась.

    Вопрос, что нет так в коде?
     
  2. Flasher

    Flasher Member

    Публикаций:
    0
    Регистрация:
    31 янв 2004
    Сообщения:
    640
    Код (Text):
    1.            mov eax,pt.y
    2.            shl eax,16
    3.            mov eax,pt.x
    4.            mov edi,eax
    Вероятно надо заменить на

    Код (Text):
    1.            mov eax,pt.y
    2.            shl eax,16
    3.            mov ax,word ptr pt.x
    4.            mov edi,eax
    Но всё еще не кликает.
     
  3. osox

    osox New Member

    Публикаций:
    0
    Регистрация:
    13 ноя 2009
    Сообщения:
    280
    может enumchildwindows а им уже слать wm_lbutton* ? а если вы родительскому отправляете то тогда сразу слать wm_command с ид
    контрола ?
     
  4. Flasher

    Flasher Member

    Публикаций:
    0
    Регистрация:
    31 янв 2004
    Сообщения:
    640
    У основного окна нет подокон, это игра.
    Может всё-таки в коде что-то нетак? :)
     
  5. osox

    osox New Member

    Публикаций:
    0
    Регистрация:
    13 ноя 2009
    Сообщения:
    280
    а проверить ? повесть спая на окно где хотим клик сделать и выполнить ваш код и посмотреть придут нет ваши сообщения