Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 区分键盘和#x27;真实按键和虚拟按键_C#_Keyboard_Keypress - Fatal编程技术网

C# 区分键盘和#x27;真实按键和虚拟按键

C# 区分键盘和#x27;真实按键和虚拟按键,c#,keyboard,keypress,C#,Keyboard,Keypress,我正在用C#编写一个程序,它必须模拟键盘上的按键命令 问题是-我需要模拟“真实”的键盘按钮点击,而不是假点击。例如,据我所知: 当用户按下键盘上的任何按钮时,信号通过USB发送,然后通过键盘驱动程序继续 当使用API时(SendInput、SendKeys、KeyBoardEvent或其他),我们绕过USB和驱动程序,因此基本上可以通过全局钩子方法跟踪这些类型的按键 如何模拟真实的按键? > P>我没有C++知识,所以编写自定义驱动程序不是一个选项。 我不介意使用微控制器或任何额外的硬件

我正在用C#编写一个程序,它必须模拟键盘上的按键命令

问题是-我需要模拟“真实”的键盘按钮点击,而不是假点击。例如,据我所知:

  • 当用户按下键盘上的任何按钮时,信号通过USB发送,然后通过键盘驱动程序继续

  • 当使用API时(SendInput、SendKeys、KeyBoardEvent或其他),我们绕过USB和驱动程序,因此基本上可以通过全局钩子方法跟踪这些类型的按键

如何模拟真实的按键?

    > P>我没有C++知识,所以编写自定义驱动程序不是一个选项。

  • 我不介意使用微控制器或任何额外的硬件“解决方案”,只要它便宜

  • 也许可以通过USB电缆连接两台PC,以便从PC2向PC1发送真实的键盘按钮按下信号


那么方法是什么呢?

您可以通过全局键盘挂钩(WH\u keyboard\LL)识别SendInput()发送的键盘事件。 它的回调方法作为参数接收


如果在KBDLLHOOKSTRUCT.flags中设置了LLKHF_INJECTED标志,则键盘事件是通过SendInput()注入的。

您可以通过全局键盘挂钩(WH_keyboard_LL)识别通过SendInput()发送的键盘事件。 它的回调方法作为参数接收


如果在KBDLLHOOKSTRUCT.flags中设置了LLKHF_INJECTED标志,则键盘事件是用SendInput()注入的。

我无法理解您在这里的意思。如果您准备好了一个硬件解决方案,那不就是一个键盘吗?使用SendInput()注入的键盘事件与驱动程序生成的键盘事件是无法区分的。因此,它模拟了真实的按键操作,无法通过任何方式或方法来区分不同。DavidHeffernan我需要能够从一台电脑远程控制另一台电脑的键盘(更准确地说,是通过局域网)。所有按键都将由软件(C#WinForms)生成,而不是硬件(即键盘)。不管怎样,@HansPassant你百分之百确定吗?因为如果这是真的,我建议你写这篇评论作为对我问题的“回答”。我很乐意接受。@HansPassant-我当然不是这方面的专家,但在阅读之后,你的分析似乎并非在所有情况下都是100%正确的。我做了一些家庭作业,似乎GameGuard之类的工具可以阻止SendInput()生成的事件,所以基本上,在驾驶员层面上很容易检测到注射。我不明白你在这里的意思。如果您准备好了一个硬件解决方案,那不就是一个键盘吗?使用SendInput()注入的键盘事件与驱动程序生成的键盘事件是无法区分的。因此,它模拟了真实的按键操作,无法通过任何方式或方法来区分不同。DavidHeffernan我需要能够从一台电脑远程控制另一台电脑的键盘(更准确地说,是通过局域网)。所有按键都将由软件(C#WinForms)生成,而不是硬件(即键盘)。不管怎样,@HansPassant你百分之百确定吗?因为如果这是真的,我建议你写这篇评论作为对我问题的“回答”。我很乐意接受。@HansPassant-我当然不是这方面的专家,但在阅读之后,你的分析似乎并非在所有情况下都是100%正确的。我做了一些家庭作业,似乎GameGuard之类的工具可以阻止SendInput()生成的事件,所以基本上,在驱动程序级别上可以很容易地检测到注入。