Использование контроля отправки на Windows Live Messenger Для автоматического ввода текста
Привет я хочу сделать своего рода бот для WLM, но обычный autosend в autoit не будет работать
Основной вопрос: как я могу отправить текст в окно Windows Live Messenger, не активируя его?
Пример: есть кто-то в WLM с активным окном под названием "Joop", которое я делаю:
ControlClick("Joop","","[CLASS:DirectUIHWND; INSTANCE:2]","Left",1,322,507)
ControlSend("Joop","","[CLASS:DirectUIHWND; INSTANCE:2]","Hi Joop")
это не работает, однако, когда я делаю это
WinActivate("Joop","")
ControlClick("Joop","","[CLASS:DirectUIHWND;INSTANCE:2]","Left",1,322,507)
ControlSend("Joop","","[CLASS:DirectUIHWND; INSTANCE:2]","Hi Joop")
это работает, однако теперь его активировано, что я не хочу. есть проблема с окном, все окно разговора MSN - одно окно, поэтому нет никакого дополнительного контроля для ввода, поэтому я попробовал contolClick по координатам экрана ввода без succ6
это резюме.
Text:
Position: 0, 28
Size: 882, 607
ControlClick Coords: 282, 180
Style: 0x56000000
ExStyle: 0x00010000
Handle: 0x00190916
>>>> Mouse <<<<
Position: 1885, 557
Cursor ID: 0
Color: 0xFFFFFF
>>>> StatusBar <<<<
>>>> Visible Text <<<<
>>>> Hidden Text <<<<
CVoiceVideoAvatarHostWindow
Кто-нибудь знает, как получить что-то в этом текстовом поле, не активируя его (чтобы он мог работать в фоновом режиме) и используя хромую функцию, такую как send.
ИЛИ как я могу отправить текст в окно Windows Live Messenger, не активируя его
Спасибо мати
3 ответа
MSN целенаправленно сопротивляется автоматизации. Это не ограничение Windows API. Если ваша цель - автоматизировать чат MSN, вы можете сделать это либо путем прямой отправки пакетов TCP, либо с помощью автоматизации другого приложения, которое поддерживает MSN (Digsby, Pidgin и т. Д.) И которое лучше работает с автоматизацией.
Посылая пакеты TCP напрямую, вы пишете свою собственную программу с нуля, которая во внешнем мире ведет себя так же, как MSN. Есть пользовательская документация о протоколе. Тот, который я использовал в прошлом, находится здесь: http://www.hypothetic.org/docs/msn/notification/authentication.php но я совершенно не уверен, что он все еще актуален. Если вы знакомы с сетью, TCP, захватом и воспроизведением пакетов, тогда я советую пойти по этому пути, так как это наиболее стабильный и долгосрочный подход. (И я думаю: самое веселое.)
Однако не все проекты требуют стабильного и долгосрочного подхода. Мне кажется, что вы просто возились с автоматизацией некоторых приложений, которые у вас были на вашем компьютере, и MSN, конечно, является одним из наиболее интересных. Microsoft решила, что когда они создают клиент MSN, никому не должно быть легко попробовать автоматизировать приложение. Я думаю, что это было сделано в основном для предотвращения спама. В первые дни это работало, потому что другие люди еще не документировали протокол публично. И поэтому каждый, кто хотел спамить, должен был сделать дорогостоящие инвестиции.
Если вы решите продолжить автоматизацию официального клиента MSN или любого другого приложения, которое не поддается автоматизации, есть несколько хитростей, которые вы можете попробовать:
- ControlSend без указания параметра управления (используйте пустую строку "")
- ControlClick в окне с указанием координат с использованием пустой строки для параметра управления снова
- В конце концов, просто отправить /MouseClick с необязательным BlockInput
Есть гораздо больше комбинаций, которые вы можете попробовать (особенно функции ControlX), которые иногда чудесным образом сработают, но помните, что в конечном итоге все они являются просто сообщениями окна. Вы можете делать все автоматизировано с помощью функции _SendMessage, если вы знаете, что делаете.
Некоторые конструкции и интерфейсы делают AutoIt очень трудным, если не практически невозможным, использование интерфейса для считывания управляющей информации. Я бы предложил либо использовать протокол WLM вручную через свой собственный клиент, либо использовать клиент, который не делает экранный захват текста трудным или невозможным.
Хорошо, возможно, наконец-то ответ... по крайней мере, это тестовое приложение, которое я написал, работает следующим образом:
Где-то в начале вашего скрипта вы должны установить состояние вашего WLM на @SW_HIDE
, Позже, когда вы пытаетесь сделать ControlXxxx
-все, что вы сначала установите переменную в вашем активном окне. Теперь вы можете при желании заблокировать ваш ввод и активировать скрытое окно. Теперь он работает так, как вы описали выше, и после этого вы активируете свое последнее активное окно. При желании снова отмените входной блок.
Это должно решить ваш вопрос с наименьшим перерывом в работе... тем временем вы можете поиграть со своим стилем курсора мыши, чтобы имитировать некоторую нагрузку на процессор, чтобы ввод блока не слишком нарушал. Но действие настолько быстрое, что вы даже не узнаете его... (возможно, оно проглотит некоторые нажатия клавиш)
Попробуйте!
Opt("WinTitleMatchMode", 2)
#include <GuiConstantsEx.au3>
$GUI = GUICreate("Beispiel HiddenApp", 392, 323)
$ed = GUICtrlCreateEdit("nix", 1, 1, 390, 321)
GUISetState()
Sleep(1000)
GUISetState(@SW_HIDE, $GUI)
WinActivate("SciTE")
Sleep(1000)
BlockInput(1)
$act = WinActive("[ACTIVE]")
WinActivate($GUI)
ControlClick($GUI, "", $ed, "primary", 1, 50, 50)
ControlSend($GUI, "", $ed, "before{Alt}{Tab}after")
WinActivate($act)
BlockInput(0)
Sleep(1000)
GUISetState(@SW_SHOW, $GUI)
While 1
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE
ExitLoop
Case Else
;;;
EndSwitch
WEnd