在Windows Live Messenger上使用控件发送用于自动键入文本

时间:2009-10-20 23:00:44

标签: window autoit msn-messenger windows-live-messenger

您好我想为WLM制作一种机器人, 但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谈话窗口是一个窗口所以没有额外的控制输入那就是为什么我尝试在没有succ6的打字屏幕的坐标上的contolClick

这是摘要。

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窗口而不激活它

由于 Matthy

3 个答案:

答案 0 :(得分:1)

MSN故意抵制自动化。这不是Windows API的限制。如果您的目标是自动化MSN聊天,您可以通过直接发送TCP数据包,或通过自动化另一个支持MSN(Digsby,Pidgin等)的应用程序来实现这一目标,并且可以更好地实现自动化。

通过直接发送TCP数据包,您正在编写自己的程序,从头开始,外部世界就像MSN一样。有关于协议的用户自制文档。我过去使用过的一个是:http://www.hypothetic.org/docs/msn/notification/authentication.php但我完全不确定它是否仍然是最新的。如果您熟悉网络,TCP,数据包捕获和重放,那么我建议采用这条路线,因为这是最稳定,最长期的方法。 (我认为:最有趣。)

然而,并非所有项目都需要稳定和长期的方法。在我看来,你只是在搞乱自动化你碰巧在计算机上使用的一些应用程序,而MSN当然是更有趣的应用程序之一。微软决定,当他们构建MSN客户端时,任何人都不应该轻易尝试自动化应用程序。我认为这主要是为了防止垃圾邮件。在早期它起作用,因为其他人还没有公开记录协议。因此,任何想要发送垃圾邮件的人都必须付出高昂的代价。

如果您决定继续自动化官方MSN客户端或任何其他抵制自动化的应用程序,您可以尝试一些技巧:

  • ControlSend,未指定控制参数(使用空字符串“”)
  • ControlClick在窗口上指定坐标,再次使用空字符串作为控制参数
  • 最后,只需使用可选的BlockInput
  • 发送/ MouseClick

你可以尝试更多的组合(尤其是ControlX功能),有时奇迹般地可以工作,但请记住,最后它们都只是窗口信息。只要您知道自己在做什么,就可以使用_SendMessage函数自动完成所有操作。

答案 1 :(得分:0)

某些设计和接口使AutoIt很难(如果不是几乎不可能)进入接口以读取控制信息。我建议您通过自己的客户端手动使用WLM协议,或者使用不会使屏幕难以获取文本的客户端。

答案 2 :(得分:0)

好的,也许最后答案......至少我编码的这个测试应用如下:

在脚本开头的某处,您必须将WLM的状态设置为@SW_HIDE。稍后当您尝试执行ControlXxxx时,您首先在活动窗口上设置变量。现在,您可以选择阻止输入并激活隐藏窗口。它现在可以像您上面描述的那样工作,之后您重新激活最后一个活动窗口。 (可选)再次撤消输入块。

这应该以最少的breaktime来解决你的问题...你可以在此期间使用鼠标光标样式来模拟一些CPU负载,因此块输入不会太冒犯。但是动作如此之快,你甚至都不会认出来......(也许它会吞下一些按键)

试一试!

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