1

我想要做的是有一个帮助应用程序,用户可以使用触摸输入来影响第二个应用程序。我已经能够将击键发送到第二个应用程序,但我遇到的问题是当我想按住一个按钮时。

例如,在我的应用程序中,我希望能够按住一个按钮来模拟 ctrl 键。在触摸此按钮时,我希望能够与第二个应用程序进行交互。如果用户放开按钮,那么 ctrl 键就会脱掉。我可以让这个工作,除非当用户在第二个应用程序上做任何事情时,被按住的按钮没有被按下(因为另一个应用程序获得了焦点)。

我不在乎我是否必须使用 WPF 或 Windows 窗体,只要我可以让它工作。也可以只接受 Windows 8 或 8.1(所有客户端都是 8.1)。

任何帮助,将不胜感激!

注意我在下面的评论中添加了。

第二个应用程序是我没有创建的,它可以是任何东西。一个场景是我的应用程序有一个 ctrl 按钮,例如,您可以按住该按钮,然后在 Outlook 中单击一个链接。或者在我的应用程序中按住 shift 按钮,同时在 Photoshop 中用钢笔绘制直线。我可以发送击键,但无法处理“按住”触摸命令。

4

2 回答 2

1

既然已经这么久了,我正在创建一个新的答案。我做了研究,我很确定我知道发生了什么。但在得出结论之前,我将提及我检查过的所有官方资源。

可能的打包解决方案

首先,新的Windows 输入模拟器可能会立即解决您的所有问题。如果您需要我将在下面讨论的 Windows API,请先检查PInvoke.net以查看他们是否有您尝试进行的调用的文档。

Windows API 方式

最好的起点是 MSDN 上的用户交互文章。那里有一堆新的 Winu8 Touch API,但您可能对旧版键盘输入文章感兴趣。

应用程序的每个窗口都必须有一个Windows 过程(又称Window 持有的资源。此过程还负责处理来自输入设备的消息,例如鼠标单击和键盘上的键。WindowsProcWM_QUIT

在您的情况下,您更感兴趣的是让 Window 认为没有来自键盘的消息。这就是SendInputAPI 调用的用途;它允许您将一系列INPUT消息(无论是键盘、鼠标还是其他输入设备)直接插入队列,而无需用户进行实际操作。这个简单的 API 调用专门接受MOUSEINPUTKEYBDINPUTHARDWAREINPUT消息。

对于键盘,当一个键被按下 ( WM_KEYDOWN) 和它被释放 ( WM_KEYUP) 时,您会收到一条消息,因此要确定像 那样的热键CTRL+C,您必须查看在a 之后但之前收到WM_KEYDOWN的字母的消息它的信息。CWM_KEYDOWNCTRLWM_KEYUP

管理输入设备消息

要模拟输入设备,请使用SendInputWM_KEYDOWN和/或WM_KEYUP消息传递给目标窗口。但不要忘记,一个应用程序可以有多个窗口。有 API 调用来获取不同的 Windows,但是在你可以使用它之前,你需要编写代码来找到它SendInput。a

要了解窗口对输入设备的看法,请使用GetAsyncKeyState. 如果您干预了与输入设备相关的 API,您可能无法信任它。

BlockInput一个窗口调用,它拒绝所有消息,除了SendInput来自阻止它的线程的调用。在大多数情况下,尽快重新启用输入是正确的。文档说,如果阻塞线程死亡,BlockInput则被禁用。一个类似但不那么苛刻的调用是EnableWindow阻止窗口接收输入焦点。

Windows 的 API 包括注册钩子的能力,它允许您指定消息的种类和/或某些要由用户指定的函数查看的窗口。

于 2014-12-23T09:16:03.663 回答
0

我真的很想知道为什么您需要在两个不同的应用程序中使用它,但这是我能想到的最好的。

在应用程序中,您应该能够订阅 KeyDown、KeyUp、Focus 和 Blur(失去焦点)。我不清楚这是一个实际的按钮还是它的触摸输入,但无论如何,假设 KeyDown 是用户“模拟”按下 ctrl 键时触发的任何事件,而 KeyUp 是触发的任何事件当用户停止“模拟”按下 ctrl 键时。

将 App1 设置为当它获得焦点时,它会与 App2 通信状态:沮丧或不沮丧。每次 KeyDown 或 KeyUp 触发时,向 App2 发送一条消息。

当 App1 的 Blur 事件触发时,停止向 App2 发送消息。即使 App1 不再按下按钮,App2 也不会知道它,并且可以继续表现得好像按钮被按下一样,直到 App2 重新获得焦点并可以返回再次发送消息。

如果是我,我会让 App2 与 App1 具有所有相同的逻辑,所以当 App2 进入焦点时,它开始自己处理向上/向下状态。当模糊/焦点事件发生时,您可能希望两个应用程序进行某种“握手”,以确保在切换时保持状态。当 App2 收到 Blur 事件时,它会将状态传递给 App1,他们再次握手,因此 App1 知道它现在负责管理状态。

这基本上是让应用程序通过“标签团队”进行合作。它们保持彼此之间的某些状态同步,当模糊/焦点事件触发时“移交”责任。由于您无法知道 Blur 会在 Focus 触发另一个应用程序之前触发另一个应用程序,因此您需要使用与此“模拟按钮”状态通信的相同机制来协调应用程序,以便它们不会相互干扰。

有些事情告诉我,这并不能完全解决您的问题,但听到它为什么不能完全解决问题肯定会让每个人都更接近于思考剩下的问题。让我知道扭曲的结局,嗯?

于 2013-11-07T04:42:41.987 回答