【问题标题】:C# .NET - Difference between SendKeys, SendInput, SendMessage, InputInjector and Cursor.PositionC# .NET - SendKeys、SendInput、SendMessage、InputInjector 和 Cursor.Position 之间的区别
【发布时间】:2020-11-15 20:49:17
【问题描述】:

我正在学习和构建我的第一个 UWP 测试应用,需要一种模拟方法:

  • 相对鼠标移动
  • 绝对鼠标定位
  • 键盘输入(不一定是按键/释放键)
  • 微调 x&y 滚动(这样我可以任意滚动)

我遇到了以下方法来执行此操作,但无法确定哪些方法是现代的/最适合 UWP 应用程序,还是一般来说最适合我的目的:

  • SendKeys(某种形式的 SendInput 的 C# 包装器?)
  • SendInput(用于模拟事件的 win32 API,但它最适合 UWP 吗?)
  • SendMessage(用于直接输入重点应用程序?)
  • InputInjector(一种更现代但有限的模拟输入方式,不能绝对定位光标吗?)
  • Cursor.Position(光标移动定位功能)

有很多方法和方法可以解决这个问题,我不完全确定哪些方法最受 UWP 应用支持或推荐,或者产生最佳结果。

这个项目的目的是能够通过我的手机进行交互来控制我的电脑(移动鼠标、打字)。例如,我的手机变成了触控板,或者我可以输入手机的软键盘,然后它会输入我的 PC。 PC 在本地网络上托管一个服务器,电话将输入数据包发送到该服务器。服务器接收这些输入数据包,并执行它们(这是我需要能够模拟键盘/鼠标事件的地方)。非常类似于Remote Mouse

所以我的问题是:

  • 这些方法之间有什么区别? (比如 Windows 窗体或 Win32??)
  • 哪个最适合 UWP 应用/我的需要?
  • 有没有更好(未列出)的解决方案?

这是我第一次研究这些东西(C#、.NET、Windows 开发),所以任何和所有信息都非常有用。

感谢您的帮助!
丹:D

编辑

进一步研究表明,InputInjector 在 UWP 引用下,SendKeysCursor.Position 都在 .NET 引用下。这是否意味着InputInjector是最理想的?

【问题讨论】:

  • 你的最终目标是什么?模拟鼠标时你想达到什么目的?
  • @sommmen 刚刚进行了编辑以澄清,但本质上是为了执行它通过本地网络从手机接收的输入命令。
  • 您想要应用程序本身是可编程的,还是想要制作一个teamviewer 版本?也许为您想要的解释一个用例/用户故事,因为我认为您想采取什么路线很重要。此外,我之前使用 AutoIT 进行 Windows 自动化,我相信它也有 dll,因此您也可以将其集成到 .NET 应用程序中autoitscript.com/site
  • @sommmen 刚刚再次编辑。它看起来与 teamviewer 类似,但更专业于某些情况:它只在同一个本地网络上,它唯一的手机到电脑,手机“变成”外部输入设备(例如,在你的手机屏幕上拖动一个触控板,类似地在 PC 上移动鼠标)。如此接近Remote Mouse
  • @HansPassant 为答案干杯!您已链接到一个看起来用于测试的存储库,这不是我的应用程序的目的。这是否意味着真的没有任何正确的方法来模拟 UWP 应用程序中的输入事件?如果是这样,那么是否值得切换到 Win32 或其他东西?

标签: c# .net uwp


【解决方案1】:

经过一番研究,我发现 InjectedInput 是唯一包含在 UWP API 中的。

澄清一下,在开发 Windows 应用程序时,您必须在 Visual Studio 中选择一种“类型”来使用,无论是 WPF、Windows 窗体、Win32 还是 UWP。 UWP 是唯一(大部分)可以上传到 Microsoft Store 的。

这意味着我只能使用 UWP API 中的方法,在这种情况下,WinRT 是 UWP 的一部分,InjectedInput 是 WinRT 的一部分。

它支持使用"Absolute" 选项的绝对鼠标定位、使用"Move" 选项的相对鼠标移动以及使用InjectedInputMouseOptionsInjectedInputMouseInfo 中使用的"Wheel""HWheel" 选项进行滚动。键盘输入可以通过InjectedInputKeyOptionsInjectedInputKeyboardInfo 来完成。

使用"Option"变体类来修改输入的效果(例如选择要更改的选项),然后使用InputInjector及其TryCreate()方法对其进行实例化,以及相关的InjectMouseInputInjectKeyboardInput 执行输入注入。

This 示例代码及其相关的blog post 非常适合理解基本用法,它直接进入正题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-29
    • 1970-01-01
    • 1970-01-01
    • 2017-09-09
    • 2016-12-20
    • 1970-01-01
    相关资源
    最近更新 更多