0

win apiを使用してマウス/キーボードのエミュレーションを学習しようとしています。
sendmessage() 関数を使用してボタンクリックをエミュレートできることがわかりました。

さて、「再生」ボタンの座標を取得し ((60;100))、次のコードを使用してこのボタンを押しようとしています。

            int x = 60;
            int y = 100;
            int lParam = ((x << 16) | (y & 0xffff));

            int parentWindow = FindWindow("BaseWindow_RootWnd", "Main Window");//get main winamp window
            MessageBox.Show(parentWindow.ToString());//failed if 0

            SendMessage(parentWindow, WM_LBUTTONDOWN, IntPtr.Zero, new IntPtr(lParam));//send left mouse button down
            SendMessage(parentWindow, WM_LBUTTONUP, IntPtr.Zero, new IntPtr(lParam));//send left mouse button up

しかし、このコードは winamp には影響しません。

誰かが私が犯した間違いを指摘できますか? どんな助けでも大歓迎です!

psマウスをwinampの再生ボタンに移動したり、クリックしたり、元に戻したりすることは私には当てはまりません。
また、winamp の場合、ボタンのハンドルを取得することはできません。ボタン ハンドルでは SendMessage() はかなりうまく機能しますが、座標ではまったく機能しません。

追加#1

上記のコードは、最小化されている場合、winamp ウィンドウをアクティブにして表示します。しかし、再生ボタンはまだ押されたくありません;(

追加#2

上記のコードを実行した後に表示されるメッセージを次に示します。

spy++ のメッセージ

4

3 に答える 3

2

Winamp に現在の曲を再生/一時停止させるには、単純に Play/Pause メッセージを送信しますwinamp.h。の代わりに、WM_WA_IPCメッセージ (ユーザー メッセージ、別名)で送信する必要があります。WM_USERWM_LBUTTONDOWN

したがって、次のようにする必要があります。

SendMessage(parentWindow, WM_USER, IntPtr.Zero, new IntPtr(40046));

詳細はこちらこちらこちら

于 2012-07-25T14:10:49.170 に答える
1

まあ、winamp ウィンドウでマウス クリックをシミュレートするには、ハードウェア マウスでクリックしたときに何が起こっているかを正確に行う必要があります。spy++ から次のことがわかりました。
ここに画像の説明を入力

したがって、マウスクリックをエミュレートするには、次のことが必要です。

  1. 上記のスクリーンショットの「P」は、メッセージが PostMessage() から取得されたことを示しているため ( msdn によると)、代わり2 PostMessage()回呼び出します。SendMessage()
  2. 最初の PostMessage() のパラメータは次のとおりです。
    - 最初のパラメータ - Winamp ウィンドウ ハンドル (この場合は005E09FA)
    - 2 番目のパラメータ - マウスの左ボタンが押されたときのイベントの winapi コード( WM_LBUTTONDOWN = 0x201)
    - 3 番目のパラメータ - MK_LBUTTON = 0x1(渡す必要があるようです。誰かが理由を説明してくれると助かります)
    - 4番目のパラメータ - マウスボタンを押したいポイントの座標(このパラメータは次のように計算できます - ((Y << 16) | X)
  3. 2 番目のPostMessage() のパラメーターは次の とおり
    です 。または - 4 番目のパラメーター - マウス ボタンを離したいポイントの座標 (クリックを有効にしたい場合は、最初の PostMessage() のようにする必要があります。このパラメーターは次のように計算できます - ) 005E09FA
    WM_LBUTTONUP = 0x202
    0IntPtr.Zero
    ((Y << 16) | X)

ご意見をお寄せいただきありがとうございます。

于 2012-07-26T15:52:32.550 に答える
0

SendInput()ウィンドウメッセージを偽造するのではなく、他のアプリケーションに入力を送信するために使用する必要があります。

于 2012-07-25T14:10:33.833 に答える