4

Windows のバックグラウンド アプリケーションにマウス クリックを送信する方法を探していました (つまり、ハンドルによって)。コードが機能していることを確認するために使用したテスト ウィンドウは、クリックを受け入れて処理しますが、ターゲット アプリケーションはそうしません (Spy++ にもかかわらず)。メッセージを表示します)。

何が原因でしょうか? そして、回避策はありますか?

これが私が使用しているC#コードです。

public enum WMessages : int
{
    WM_LBUTTONDOWN = 0x201,
    WM_LBUTTONUP = 0x202,

    WM_KEYDOWN = 0x100,
    WM_KEYUP = 0x101,

    WH_KEYBOARD_LL = 13,
    WH_MOUSE_LL = 14,
}

[return: MarshalAs(UnmanagedType.Bool)]
[DllImport("user32.dll", SetLastError = true)]
private static extern int PostMessage(HandleRef hWnd, UInt32 Msg, IntPtr wParam, IntPtr lParam);

public void SendClick(WMessages type, Point pos)
{
    switch(type)
    {
        case WMessages.WM_LBUTTONDOWN:
            PostMessage(new HandleRef(null, this.process.MainWindowHandle),
                (UInt32)WMessages.WM_LBUTTONDOWN, (IntPtr)0x1,
                (IntPtr)((pos.Y << 16) | (pos.X & 0xFFFF)));
            return;
        case WMessages.WM_LBUTTONUP:
            PostMessage(new HandleRef(null, this.process.MainWindowHandle),
                (UInt32)WMessages.WM_LBUTTONDOWN, (IntPtr)0x1,
                (IntPtr)((pos.Y << 16) | (pos.X & 0xFFFF)));
            return;
        default:
            return;
    }
}

SendClick(WMessages.WM_LBUTTONDOWN, Cursor.Position);
SendClick(WMessages,WM_LBUTTONUP, Cursor.Position);

これを達成することは可能ですか?これを達成するためのより良い方法はありますか?

注: 上記のコードは、アプリケーションがアクティブで、マウスが正しい位置に置かれている場合にも機能しません。また、特にバックグラウンド アプリケーションに入力を送信することも検討しているため、SendInput などは問題外です。

ありがとう

4

2 に答える 2

4
     public void SendClick(WMessages type, Point pos)
{
    switch(type)
    {
        case WMessages.WM_LBUTTONDOWN:
            PostMessage(new HandleRef(null, this.process.MainWindowHandle),
                (UInt32)WMessages.WM_LBUTTONDOWN, (IntPtr)0x1,
                (IntPtr)((pos.Y << 16) | (pos.X & 0xFFFF)));
            return;
        case WMessages.WM_LBUTTONUP:
            PostMessage(new HandleRef(null, this.process.MainWindowHandle),
                (UInt32)WMessages.WM_LBUTTONDOWN, (IntPtr)0x1, // <--(2) but you are telling to do WM_LBUTTONDOWN
                (IntPtr)((pos.Y << 16) | (pos.X & 0xFFFF)));
            return;
        default:
            return;
    }
}

SendClick(WMessages.WM_LBUTTONDOWN, Cursor.Position);
SendClick(WMessages.WM_LBUTTONUP, Cursor.Position); // <--(1) you are sending WM_LBUTTONUP

したがって、(1) を最初に読んでから (2) を読むだけで、問題は解決します

于 2014-01-20T22:57:13.573 に答える
2

PostMessageの代わりにSendMessage呼び出しを試しましたか?SendMessageは、すぐにウィンドウのハンドラーを呼び出します。PostMessageは、後で処理するためにメッセージをリストに追加します。

于 2011-10-08T08:20:29.657 に答える