Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/340.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# keybd_事件KEYEVENTF_需要扩展密钥解释_C#_Pinvoke_Keyboard Events - Fatal编程技术网

C# keybd_事件KEYEVENTF_需要扩展密钥解释

C# keybd_事件KEYEVENTF_需要扩展密钥解释,c#,pinvoke,keyboard-events,C#,Pinvoke,Keyboard Events,信中说: KEYEVENTF_EXTENDEDKEY(0x0001):如果指定,扫描代码前面会有一个值为0xE0(224)的前缀字节 有人能解释一下这是什么意思吗 这两者之间的区别是什么: keybd_event(RIGHT, 0, 0, 0); keybd_event(RIGHT, 0, 2, 0); 这是: keybd_event(RIGHT, 0, 1 | 0, 0); keybd_event(RIGHT, 0, 1 | 2, 0); 因为当我执行这段代码时,我看不出有什么不同 还有,

信中说:

KEYEVENTF_EXTENDEDKEY(0x0001):如果指定,扫描代码前面会有一个值为0xE0(224)的前缀字节

有人能解释一下这是什么意思吗

这两者之间的区别是什么:

keybd_event(RIGHT, 0, 0, 0);
keybd_event(RIGHT, 0, 2, 0);
这是:

keybd_event(RIGHT, 0, 1 | 0, 0);
keybd_event(RIGHT, 0, 1 | 2, 0);
因为当我执行这段代码时,我看不出有什么不同

还有,“字节bScan”是什么意思?在描述中,它是:钥匙的硬件扫描代码。这意味着什么?

一个简单(但不完整)的解释是KEYEVENTF_EXTENDEDKEY的意思是“这个击键是从数字键盘发出的”

由于大多数程序在按“q”键上方的“1”时的行为与在数字键盘(扩展键)上按“1”时的行为相同,因此在模拟键盘输入时设置此标志时,通常不会看到任何差异

关注按键位置的程序通常会响应此标志


bScan值是原始硬件扫描码。有关扫描码的解释,请参见此处。像扩展键标志一样,大多数程序都不注意扫描码。如果程序希望将键盘视为一组按钮,则会显示这些值。

这是原始IBM PC上键盘布局的古老实现细节。这是1981年键盘的外观:

看起来不像今天的键盘。这样,额外的键被添加,如专用的光标键以及空格键右侧的Ctrl和Alt键。为了使其与直接读取键盘的现有软件兼容(这在当时是一种非常常见的犯罪),键盘控制器会报告那些扩展键,这些扩展键的扫描码相同,但前面有一个额外的特殊字节。因此,右侧的Ctrl键和Alt键的工作方式与左侧的相同,如果程序关心区别,那么它可以检测到前缀字节的差异。0xE0是该前缀


许多程序不关心你按了哪个键,他们只使用虚拟键代码,不关心它是否是扩展键。就像那些旧的MS Dos程序一样。这就是为什么你看不出有什么不同。既然你没有指定扫描代码,那就没什么区别了。Microsoft提供的一份详细文档描述了键盘扫描代码。

这里的两个答案都是错误的。 我不明白为什么人们投票给错误的答案

这两个答案都表明国旗无关紧要。这是完全错误的。而且这个标志与键盘无关

正确答案是只有01到7F的扫描代码,但虚拟钥匙的范围是01到FF

因此,随着键盘的发展,一些扫描码必须具有双重赋值。例如,在我的键盘上,扫描代码0x45分配给NumLock键和Pause键

为了区分它们,keyborard为NumLock键发送扩展键标志,但不为Pause键发送扩展键标志

还有其他几个键具有双重分配,例如所有媒体键

运行VisualStudio工具附带的Spy++并只过滤WM_KEYDOWN并启用“解码消息参数”,然后在文本编辑器中点击一些键

Spy++将向您显示设置了哪些键的标志,以及未设置哪些键的标志

这里是Spy++的输出:

P WM_KEYDOWN nVirtKey:VK_NUMLOCK cRepeat:1 ScanCode:45 fExtended:1 fAltDown:0 fRepeat:0 fUp:0
P WM_KEYDOWN nVirtKey:VK_PAUSE cRepeat:1 ScanCode:45 fExtended:0 fAltDown:0 fRepeat:0 fUp:0
另一个例子是扫描代码2E,它被分配给字母“C”和我键盘上的VK_VOLUME_DOWN

您必须以完全相同的方式进行编程,否则使用
keybd\u event()
的键盘注入将失败,因为命中的键不是您想要的键


不要信任
MapVirtualKeyx(MAPVK_VK_TO_VSC_EX)
(>=Vista),因为它不会为某些键返回扩展标志,尽管它们是扩展键,例如VK_LEFT。此函数中的另一个错误是,它返回VK_PAUSE键的扩展标志(E1),尽管此键未扩展。

非常感谢您的精彩解释。现在我更清楚了。另外,我在哪里可以得到EXTENDEDKEY的完整解释,是否有文章?这个答案是错误的。我不明白为什么人们投票给一个完全错误的答案??扩展标志与键盘完全无关。键盘上唯一需要此标志的键是VK_DIVIDE和VK_NUMLOCK。另一方面,还有其他需要此标志的键,它们与小键盘完全无关,比如VK_LWIN或VK_RIGHT或VK_VOLUME_DOWN。请看我的答案。这个答案有点欠缺。这与数字键盘本身无关。或者我在下面的评论:extended key标志指示击键消息是否源自增强型键盘上的一个附加键。扩展键包括键盘右侧的ALT键和CTRL键;数字键盘左侧集群中的INS、DEL、HOME、END、PAGE UP、PAGE DOWN和箭头键;NUM LOCK键;中断(CTRL+暂停)键;打印SCRN键;以及数字键盘中的除法(/)和输入键。如果密钥是扩展密钥,则设置扩展密钥标志我不知道您为什么在此处发布此文本?这是一个非常古老的描述(来自Windows 95时代),不再是最新的。这是不正确的。扩展键比您在帖子中列举的要多得多,例如,所有媒体键都不在键盘的右侧。我认为它仍然会添加到您的帖子中,如果您有显示所有扩展键的更新内容,请继续。我在互联网上搜索了很长一段时间,以获得完整的扩展密钥列表,但没有成功,或者使用了错误的数据(即使在MSDN中,您也会找到错误的信息)。因此,我建议点击键盘上的键,观察Spy++记录的内容。这是获取此信息最简单、最快捷的方法