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

Discussion in 'WASM.BEGINNERS' started by Flasher, Jun 25, 2010.

  1. Flasher

    Flasher Member

    Blog Posts:
    0
    Joined:
    Jan 31, 2004
    Messages:
    640
    Доброго времени суток.
    Задача:
    Эмуляция нажатия левой кнопки мыши в определенном окне в цикле, чтобы если даже это окно свернуто или скрыто, нажатие там работало.

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

    Code (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

    Blog Posts:
    0
    Joined:
    Jan 31, 2004
    Messages:
    640
    Code (Text):
    1.            mov eax,pt.y
    2.            shl eax,16
    3.            mov eax,pt.x
    4.            mov edi,eax
    Вероятно надо заменить на

    Code (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

    Blog Posts:
    0
    Joined:
    Nov 13, 2009
    Messages:
    280
    может enumchildwindows а им уже слать wm_lbutton* ? а если вы родительскому отправляете то тогда сразу слать wm_command с ид
    контрола ?
     
  4. Flasher

    Flasher Member

    Blog Posts:
    0
    Joined:
    Jan 31, 2004
    Messages:
    640
    У основного окна нет подокон, это игра.
    Может всё-таки в коде что-то нетак? :)
     
  5. osox

    osox New Member

    Blog Posts:
    0
    Joined:
    Nov 13, 2009
    Messages:
    280
    а проверить ? повесть спая на окно где хотим клик сделать и выполнить ваш код и посмотреть придут нет ваши сообщения