2009-10-20 2 views
4

Привет я хочу, чтобы сделать своего рода бота для WLM, Но нормальный ControlSend в AutoIt не будет работатьРегулятором отправить на Windows Live Messenger для автоматического ввода текста

основной вопрос, как я могу отправить текст в окно 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 

Кто-нибудь знает, как получить что-то в этом текстовом поле без активации (так он может работать на заднем плане) и используя неудачную функцию, как отправить.

ИЛИ как я могу отправить текст окна жить окно мессенджера без активации

Thanks Matthy

ответ

0

Некоторые конструкции и интерфейсы делают его очень трудно, если не практически невозможно, AutoIt задействовать интерфейс для считывания управляющей информации. Я бы предложил использовать протокол WLM вручную через своего собственного клиента или использовать клиент, который не делает экран захватывающим текст трудно или невозможно.

0

Хорошо, может быть, наконец, ответ ... по крайней мере, этот тест приложение, которое я закодированы работает следующим образом:

Где-то в начале вашего скрипта, вы должны установить состояние вашего 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 
1

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 на окне с указанием координат с использованием пустой строки для параметра управления снова
  • в конце концов, просто Send/MouseClick с дополнительным BlockInput

Есть намного больше комбинаций, которые вы можете попробовать (особенно функции ControlX), которые иногда чудесным образом будут работать, но помните, что в конце концов все они - только оконные сообщения. Вы можете делать все в автоматизации с помощью функции _SendMessage, если вы знаете, что делаете.