我正在开发一个类似teamviewer的应用程序(需要移动另一台PC的光标并看到键盘的键入)。是否有可能从我的(客户端)端捕获事件(MouseMove,MouseButtonDown等)并将它们直接注入另一个(服务器端)?
我想知道是否存在类似win32的WPF函数:
SendMessage();
PostMessage();
SendInput();
如果没有,如何使用这些发送WPF事件??
提前致谢
答案 0 :(得分:2)
你可以把自己挂在这些冒泡的routed events上,即使它们被处理,即使它们在儿童控制中,也可以抓住所有事件。因此,将它们添加到视觉层次结构的顶部某处:)
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的例子。
希望它有所帮助。