在没有焦点的情况下将鼠标输入发送到另一个应用程序

时间:2019-01-16 04:34:07

标签: input io mouse sendmessage postmessage

我将尝试尽可能清楚地描述我的问题和疑问,

我正在尝试创建一个程序,该程序允许您将两个键盘和鼠标插入一台计算机,并通过将它们的输入拆分到不同的应用程序窗口来同时玩同一游戏的两个副本。我在网上找不到合适的工具,所以我自己做。

从我的所有研究和测试看来,SendMessage和PostMessage似乎是我最好的选择。我一直在拦截WM_INPUT消息,并将其发送到所需的应用程序,到目前为止,它在某种程度上一直在起作用。

我有两个视频可帮助您了解我遇到的问题: 第一个简单地显示了我的程序在将输入发送到Chrome时的预期效果。当我滚动并单击InputMapper窗口时,您可以看到Chrome对叠加光标做出了反应,就像我在其上滚动一样。 Video 1: Nice

第二个视频向我展示了与游戏客户端完全相同的操作,由于某种原因,它工作不正常。它只是简单地不能与虚拟光标一起使用,但是它确实会响应 real 光标,即使窗口在技术上没有焦点(这告诉我PostMessage可以正常工作,但它仍在工作)只是拒绝确认虚拟光标而不是真实光标所在位置的点击)。 Video 2: Not Quite

所以我的问题很简单:在两种情况下我都使用相同的代码,但是两个应用程序的响应方式不同,因此不适用于游戏客户端。有谁知道我为什么会出现这种行为? 似乎由于某种原因,游戏仍然将点击记录为真实光标所在的位置,而不是我发送的L_PARAM的位置。

要给出我的代码来处理鼠标单击事件的示例,请转到这里:

private void m_MouseButtonDown(object sender, InputDevice.MouseControlEventArgs e)
    {
        if (e.Mouse.deviceHandle != MouseHandle1)
            return;

        uint L_Param_Window = (uint)(cursorPosX + ((int)cursorPosY << 16));

        uint W_Param = 0;
        switch (e.Mouse.buttonMessage)
        {
            case WM_LBUTTONDOWN:
                W_Param = (uint)MouseButtons.LEFT;
                break;
            case WM_MBUTTONDOWN:
                W_Param = (uint)MouseButtons.MIDDLE;
                break;
            case WM_RBUTTONDOWN:
                W_Param = (uint)MouseButtons.RIGHT;
                break;
        }

        // Send Messages
        PostMessage(applicationHandle1, e.Mouse.buttonMessage, (IntPtr)W_Param, (IntPtr)L_Param_Window);
    }

谢谢。

编辑:修复了视频链接,因为我注意到我是个假人

编辑2:更新是因为我对程序进行了一些改进,希望我的问题更加清楚 另外:我有一个理论,也许 这样做是因为游戏客户端中光标的图像如何变化。因此,也许其中的某些潜在方面破坏了我正在尝试做的事情。

1 个答案:

答案 0 :(得分:0)

您可以通过提供句柄,使用Sendmessage将消息键盘或消息鼠标发送到特定的句柄,但是问题是要确定消息的来源:发送此消息的设备是什么?要区分输入设备,您需要使用Raw Input API。 Thas需要一些技巧。...