【发布时间】:2019-06-10 03:37:00
【问题描述】:
我会尽量清楚地描述我的问题和疑问,
我正在尝试创建一个程序,允许您将两个键盘和鼠标插入一台计算机,并通过将它们的输入拆分到不同的应用程序窗口来同时玩同一游戏的两个副本。我在网上没有找到很好的工具,所以我正在制作自己的。
从我所有的研究和测试来看,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:已更新,因为我对程序进行了一些改进,希望我的问题更清楚 另外:我有一个理论,可能它这样做是因为光标的图像在游戏客户端中的变化。所以也许有某种潜在的方面正在破坏我正在尝试做的事情。
【问题讨论】:
标签: input io mouse sendmessage postmessage