4

嗨,我想为 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

有谁知道如何在不激活它(因此它可以在后台运行)并使用像发送这样的蹩脚函数的情况下在该文本字段中获取内容。

或者我如何在不激活的情况下将文本发送到 Windows Live Messenger 窗口

谢谢马蒂

4

3 回答 3

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 发送/鼠标点击

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

于 2012-01-11T09:33:37.750 回答
0

某些设计和界面使 AutoIt 很难(如果不是几乎不可能)利用该界面读取控制信息。我建议要么通过您自己的客户端手动使用 WLM 协议,要么使用不会使屏幕抓取文本变得困难或不可能的客户端。

于 2011-04-15T11:26:02.573 回答
0

好的,也许终于有答案了……至少我编写的这个测试应用程序的工作原理如下:

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

那应该以最少的中断时间解决您的问题……您可以同时使用鼠标光标样式来模拟一些 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
于 2012-01-10T12:33:29.860 回答