需要发送鼠标和键盘事件WPF C#

时间:2014-09-25 11:26:07

标签: c# wpf winapi events input

我正在开发一个类似teamviewer的应用程序(需要移动另一台PC的光标并看到键盘的键入)。是否有可能从我的(客户端)端捕获事件(MouseMove,MouseButtonDown等)并将它们直接注入另一个(服务器端)?

我想知道是否存在类似win32的WPF函数:

SendMessage();
PostMessage();
SendInput();

如果没有,如何使用这些发送WPF事件??

提前致谢

1 个答案:

答案 0 :(得分:2)

你可以把自己挂在这些冒泡的routed events上,即使它们被处理,即使它们在儿童控制中,也可以抓住所有事件。因此,将它们添加到视觉层次结构的顶部某处:)

WPF处理程序

AddHandler(KeyUpEvent, new KeyEventHandler(OnKeyUp), true);
AddHandler(MouseUpEvent, new MouseButtonEventHandler(OnMouseUp), true);

private void OnMouseUp(Object sender, MouseButtonEventArgs e)
{
    // Post/Send message, SendInput or whatever here..
}

private void OnKeyUp(Object sender, KeyEventArgs e)
{
    // Post/Send message, SendInput or whatever here..
}

是的,您可以通过互操作在WPF中使用SendMessage,PostMessage和SendInput函数。

互操作

[DllImport("user32.dll", CharSet = CharSet.Auto)]
private static extern bool PostMessage(IntPtr hWnd, int Msg, IntPtr wParam, IntPtr lParam);

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

[DllImport("user32.dll")]
internal static extern UINT SendInput(UINT nInputs, [MarshalAs(UnmanagedType.LPArray), In] INPUT[] pInputs, int cbSize);

然后你只需使用互操作注入你的消息。是的,也可以将自己挂在WPF中的winproc上。 See this post了解详情。

pinvoke.net是w32 C#interop的一个很好的来源,但有些东西告诉我你已经知道这个:)你有一个发送输入here的例子。

希望它有所帮助。