Програмное "нажатие" кнопок приложения ?

Тема в разделе "WASM.WIN32", создана пользователем asmlamo, 28 сен 2004.

  1. asmlamo

    asmlamo Well-Known Member

    Публикаций:
    0
    Регистрация:
    18 май 2004
    Сообщения:
    1.734
    Допустим у меня работает некое приложение.

    Могу ли я из другой программы посылать сообщения которые бы имитировали действия пользователя ?

    Нажимали на кнопки приложения,заполняли текстовые поля, выбирали значения из радиобутоннов и т.д.

    Интересны примеры кода для XP, W2K.
     
  2. sl0n

    sl0n Мамонт дзена **

    Публикаций:
    0
    Регистрация:
    26 сен 2003
    Сообщения:
    703
    Можешь == RTFM
     
  3. shoo

    shoo New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2003
    Сообщения:
    1.537
    Адрес:
    Ukraine
    Можно посылать сообщения из другого приложения (но не все они будут обрабатываться). сначала тебе нужно найти хэндл окна (или утилитой типа spyxx, или через FindWindow - в зависимости от задачи), a далее - например, если это диалог и известен ид кнопки - посылаешь окну с этим хэндлом типа SendDlgItemMessage,hWnd,but_id,BM_CLICK,0,0 - и наблюдаешь эффект ;) также можно и тексты в эдиты вписывать, и т.п. если это чужое приложение, ид можно выяснить той же spyxx.
     
  4. CyberManiac

    CyberManiac New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2003
    Сообщения:
    2.473
    Адрес:
    Russia
    asmlamo:

    Допустим у меня работает некое приложение.

    Могу ли я из другой программы посылать сообщения которые бы имитировали действия пользователя ?



    Можно конечно. По крайней мере, я такое уже написал. Обычно это делается сообщениями Windows BM_CLICK и WM_SETTEXT (на самом деле полезных для автоматизации сообщений несколько больше), если номер не проходит - эмулируешь работу с клавиатурой (keybd_event вроде бы) и мышью.
     
  5. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    Вот совсем примитивный пример.

    Когда-то один чел на работе очень любил в пасьянс-косынку играть, написал такую вот фигню, что бы его отучить:


    Код (Text):
    1.  
    2. .386
    3. .model flat, stdcall
    4. option casemap :none
    5.  
    6. szText  MACRO   Name, Text:VARARG
    7. .data
    8. Name    db  Text,0
    9. .code
    10. ENDM
    11.  
    12. MsgBox  MACRO   HWnd, Message, MB_Title, uStyle
    13. local   t1, t2
    14.     szText  t1, Message
    15.     szText  t2, MB_Title
    16.     invoke  MessageBox, HWnd, ADDR t1, ADDR t2, uStyle
    17. ENDM
    18.  
    19. .data
    20. TreadID dd 0
    21. TargetClass db "Solitaire",0
    22.  
    23. .code
    24. ;this does some fun
    25. Play    proc    TargetHandle:DWORD
    26.     mov ebx, 3
    27. Rep1:   invoke  Sleep, 1000*10
    28.     invoke  PostMessage, TargetHandle, WM_COMMAND, 1000, 0
    29.     dec ebx
    30.     jnz Rep1
    31.     invoke  ShowWindow, TargetHandle,SW_MAXIMIZE
    32.     MsgBox  TargetHandle, "Матрица следит за тобой!", "The Matrix", MB_APPLMODAL or MB_ICONEXCLAMATION
    33.     invoke  ShowWindow, TargetHandle,SW_NORMAL
    34.     invoke  Sleep, 1000*10
    35. Rep3:   mov ebx, 10
    36. Rep2:   invoke  Sleep, 1000*1
    37. ;   invoke  ShowWindow, TargetHandle,SW_HIDE
    38.     invoke  PostMessage, TargetHandle, WM_COMMAND, 1000, 0
    39. ;   invoke  Sleep, 1000*1
    40. ;   invoke  ShowWindow, TargetHandle,SW_SHOW
    41.     dec ebx
    42.     jnz Rep2
    43.     MsgBox  TargetHandle, "Повторим?", "ГЫ-ГЫ-ГЫ!!!", MB_APPLMODAL or MB_ICONQUESTION or MB_RETRYCANCEL
    44.     cmp eax, IDRETRY
    45.     je  Rep3
    46.     invoke  PostMessage, TargetHandle, WM_QUIT, 0, 0        ; close window
    47.     invoke  ExitThread,eax
    48.     ret
    49. Play endp
    50.  
    51. ;proc runs from here
    52. start:  mov ebx, 1
    53. Find:   invoke  Sleep, 1000*5
    54.     invoke  FindWindow, ADDR TargetClass, 0
    55.     or  eax, eax
    56.     je  Find        ; target window not found
    57.     mov ecx, ebx
    58. TestFound:             
    59.     cmp [esp+ecx*4-4], eax  ; now look is it already found window?
    60.     je  Find    ; stop! no need to play twice
    61.     dec ecx
    62.     jnz TestFound
    63.     push    eax     ; for future use
    64.     invoke  CreateThread, 0, 0, Play, eax, 0, ADDR TreadID
    65.     inc ebx
    66.     jmp Find    ; wait for next one
    67. end start




    ЗЫ

    Вскоре он уволился..
     
  6. asmlamo

    asmlamo Well-Known Member

    Публикаций:
    0
    Регистрация:
    18 май 2004
    Сообщения:
    1.734
    Спасибо ....



    Надеюсь после того как я откомпилирую эту прогу меня не уволят ! :)))
     
  7. Bitfry

    Bitfry New Member

    Публикаций:
    0
    Регистрация:
    11 авг 2004
    Сообщения:
    54
    Адрес:
    Россия, Санкт-Петербург
    Если хочешь поглубже в этом разобраться, то есть такая программка girder называется, в основном я ее использую для пульта, в ней такие навороты по этому поводу.

    Раньше она была бесплатная, и где-то проскакивали даже исходники, а теперь денег хотят вот их новый сайт: http://www.promixis.com

    Там много кто плагины делает на смежные темы.