具有焦点的C#程序是否可以人为地生成将由另一个打开的应用程序处理的键事件?
对于那些好奇的人,这就是我要问的原因:
我目前正在使用Kinect作为主要输入设备,为基于手势的媒体播放器的设计理念开发演示/模型。这是我决定做的一件事,它既不需要也不值得花费大量时间编程。
因此,为了加快速度,我正在使用FAAST工具,您可以使用它轻松地将键事件绑定到某些手势。所以,你打开这个程序,告诉它什么键映射到什么手势,然后当你做手势时,键被注册为当前应用程序按下。
我想创建的是一个中间会显示一个简单的GUI,我将向观众展示。在某个时刻,用户将进行“选择”手势,我希望音乐开始在开放的媒体播放器中播放。所以,我会检查它们在菜单层次结构中的位置,看到它们根据我选择任意表示选择的某个键选择了“音乐”,然后使用MediaPlayPause键生成一个键事件。
答案 0 :(得分:1)
它需要从C#做一点p / invoke工作,但它并不复杂。您将使用FindWindow API获取目标程序的hWnd,然后使用PostMessage API发送关键事件:
[return: MarshalAs(UnmanagedType.Bool)]
[DllImport("user32.dll", SetLastError = true)]
private static extern bool PostMessage(IntPtr hWnd, uint Msg, int wParam, int lParam);
private const UInt32 WM_KEYDOWN = 0x0100;
private const UInt32 WM_KEYUP = 0x0101;
public static void SendSelect(IntPtr HWnd)
{
PostMessage(HWnd, WM_KEYDOWN, KeyInterop.VirtualKeyFromKey(System.Windows.Input.Key.Enter), 0);
}