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

3
我是一名有用的助手,可以为您翻译文本。
我正在开发一个类似TeamViewer的应用程序(需要移动另一台计算机的光标并查看我的键盘输入)。是否可能从我的(客户端)端捕获事件(MouseMove、MouseButtonDown等),并直接将它们注入到另一个(服务器)端?
我想知道是否存在像这些win32一样的WPF函数:
SendMessage();
PostMessage();
SendInput();

如果不行,如何使用它们发送WPF事件?谢谢提前。

我会这样做:设置一个可以在服务器和客户端模式之间切换的应用程序(谁被监视和谁在控制)。接下来是流式传输桌面。之后,有两种方法:搜索如何设置鼠标和键盘钩子并将数据发送到服务器,或者使用悬停事件。你可能可以寻找一个已经编码了服务器和客户端的简单聊天代码来开始。很难处理这个问题,因为没有关于你进展到哪一步的信息。 - C4d
2
WPF是一种用户界面技术。您可以从C#/.Net应用程序中调用Win32 API。 - Lee Willis
1个回答

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..
}

“是的,您可以通过Interop在WPF中使用SendMessage、PostMessage和SendInput函数。”
“Interop”指的是跨操作系统或跨语言使用代码的技术。
[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);

然后,您只需使用Interop注入您的消息。是的,在WPF中也可以将自己钩子到winproc上。有关详细信息,请参见此帖子pinvoke.net是w32 C#互操作的良好来源,但某些东西告诉我您已经知道了这一点 :) 您可以在这里找到发送输入的示例。
希望对您有所帮助。

谢谢您的回答,我正在寻找一种解决方案,可以让我将客户端调度程序中的鼠标和键盘事件重定向到服务器调度程序,而不是模拟鼠标移动和键盘输入。与TeamViewer不同,我不需要共享(我的服务器的)显示屏。 - Alexander.It

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接