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 トーク ウィンドウ全体が 1 つのウィンドウなので、入力する追加のコントロールはありません。そのため、入力画面の座標で 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

テキストフィールドをアクティブ化せずに(バックグラウンドで実行できるように)、送信のような不完全な機能を使用して、そのテキストフィールドに何かを取得する方法を知っている人はいますか。

または、アクティブ化せずにWindows Liveメッセンジャーウィンドウにテキストを送信するにはどうすればよいですか

ありがとうマティー

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 はもちろん最も興味深いアプリケーションの 1 つです。Microsoft は、MSN クライアントを作成したときに、誰でも簡単にアプリケーションを自動化できるようにすべきではないと判断しました。これは主にスパムを防ぐために行われたと思います。初期の頃は、他の人々がまだプロトコルを公式に文書化していなかったので、うまくいきました。したがって、スパムを送信したい人は、今では高額な投資をしなければなりませんでした。

公式の MSN クライアント、または自動化に抵抗する他のアプリケーションの自動化を続行することにした場合は、試すことができるいくつかのトリックがあります。

  • 制御パラメーターを指定しない ControlSend (空の文字列 "" を使用)
  • コントロールパラメータに空文字列を再度使用して座標を指定してウィンドウをControlClick
  • 最終的に、オプションの BlockInput を使用して単純に Send/MouseClick

時には奇跡的に機能する組み合わせ (特に ControlX 関数) を試すことができますが、最終的にはすべて単なるウィンドウ メッセージであることを覚えておいてください。_SendMessage 関数を使用してオートメーションですべてを行うことができます。

于 2012-01-11T09:33:37.750 に答える
0

わかりました、おそらく最終的に答えです...少なくとも、私がコーディングしたこのテストアプリは次のように機能します:

スクリプトの最初のどこかで、WLM の状態を に設定する必要があります@SW_HIDEControlXxxx後で-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 に答える
0

特定の設計とインターフェースにより、AutoIt がインターフェースを利用して制御情報を読み取ることは、事実上不可能ではないにしても、非常に困難になります。独自のクライアントを介して手動で WLM プロトコルを使用するか、画面のテキストの取得が困難または不可能にならないクライアントを利用することをお勧めします。

于 2011-04-15T11:26:02.573 に答える