3

私は、Webブラウザーゲームと対話するC#アプリケーションを作成しており(悪意のある目的ではなく、自動化の課題のためだけに)、マウスを動かし、クリックしてから前のポイントに戻すことで対話を機能させています。

私が今やろうとしているのは、カーソルを動かさずにポイントをクリックすることです。これにより、実行中にマウスを動かしてもミスクリックが発生しなくなります。位置をクリックするために使用できるWindowFromPointフックとSendMessageフックを見つけました。テストでは、この組み合わせを機能させることができました。しかし、このフックの組み合わせをゲームが配置されているChrome Webブラウザーで機能させようとすると、クリックされません。

クロムが非常に複雑であるため、間違ったハンドルが収集されていると思います。しかし、私がそれが機能すると思ったのは、WindowFromPointが開いている現在のブラウザータブのハンドルを提供するので、SendMessageは必要な場所でクリックを実行できるようになるということです。

これが私が使用しているコードです。開始と終了は両方とも、クリックしたい位置にあるPointオブジェクトです。

IntPtr hWnd = WindowFromPoint(start);
if(hWnd != IntPtr.Zero) {
    SendMessage(hWnd, BM_CLICK, IntPtr.Zero, IntPtr.Zero);
    IntPtr hWnd2 = WindowFromPoint(end);
    SendMessage(hWnd2, BM_CLICK, IntPtr.Zero, IntPtr.Zero);
}

ブラウザタブでゲームをクリックするために私がしなければならないことは何かありますか?

4

1 に答える 1

1

それほど単純ではありません。

BM_CLICK メッセージは、ウィンドウ ハンドラの所有者が BM_CLICK メッセージを処理することを前提としています。これは、「低レベル」のメッセージ (マウスのダウン/アップ、キーボードの押下など) が処理されるときに生成される「高レベル」のメッセージです。ボタンなどの Windows 標準コントロールの場合、これは舞台裏で発生しますが、ブラウザー (またはフラッシュ プラグインなど) が標準の Win32 コントロールを使用してページをレンダリングするとは思わないため、マウス クリックを処理する場合と処理しない場合があります。キーボードを押して BM_CLICK イベントを発行します。

Visual Studio のほとんどのバージョン (一部の C++ Express のものも含む) には、Spy++ と呼ばれる探求を支援する素晴らしいツールがあります。このツールを使用すると、ウィンドウ ハンドル構造を「ウォーク」し、ウィンドウを選択し (Spy->Log Messages のやや奇妙なファインダー ツールを使用)、特定のウィンドウによって処理されたイベントをログに記録できます。

このツールによると、Chrome での質問の「C#」タグ ボタンを押してもハンドルは所有されず、レンダー コントロールのイベントを見ると、BM_CLICK イベントは作成されません。

于 2012-11-27T01:55:22.723 に答える