【问题标题】:What does the 0x80 code mean when referring to keyboard controls引用键盘控件时,0x80 代码是什么意思
【发布时间】:2010-04-30 18:36:30
【问题描述】:

在 C++ Windows 环境中引用键盘控件时,0x80 代码是什么意思?

例如,

if(GetKeyState('K') & 0x80) { 
    //do something 
}

谢谢大家!

【问题讨论】:

  • 我认为您的代码示例中有错字 - 它应该是 GetKeyState('K') & 0x8000
  • 它似乎在我的应用程序中正常工作?
  • “工作”是什么意思?如果你不知道它应该做什么,你怎么知道它在工作?
  • @Jacob,是的,我就是这么想的,奇怪的是它起作用了。
  • 这是典型的 Windows API。很多程序员都犯了这个错误(它一个糟糕的 API),所以他们在没有记录它的情况下修复了 API,并且还打开了第 7 位。更好的测试是 GetKeyState('K')

标签: c++ windows keyboard keystroke


【解决方案1】:

更新

一连串的反对票促使我进一步调查此事。以下是GetKeyState 的返回值(十六进制)的工作原理。我不太了解像k 这样的键的切换属性,但我假设它是从某个默认状态切换的。

0      Default State, key up
ff80    Default state, key down
1       Toggled, key up
ff81    Toggled, key down

所以只要需要设置高位并且低位有意义,就会添加0xff80。所以现在我们知道为什么0x80 方法有效——因为低字节的高位也被设置了!

旧答案

GetKeyState 返回一个SHORT,如果高位为1,则表示密钥已启动。带有0x80bitwise AND 操作只是检查该位是否为1,因为在二进制中0x8010000000

因此,如果GetKeyState('K') 返回的值的高位为1,则语句GetKeyState('K') & 0x80 将返回0x80,如果高位为0,则0 将返回。

【讨论】:

  • 但是,SHORT 的高位将是 0x8000
  • 那将是 BYTE 的高位,但函数返回 SHORT,即 16 位
  • 用解决方案更新了我的答案!
【解决方案2】:

MSDN documentation of the function 声明:

如果高位为1,则密钥为 向下;否则,它就起来了。

按位和 0x80 为您提供高位,if 检查结果是零还是非零,本质上检查该位的值。

然而,这个检查看起来像是一个错误,因为 GetKeyState() 返回一个 SHORT 并且要检查短路的高位,您需要按位和 0x8000。
所以我建议你用调试器检查返回值,并验证它在现实中是如何工作的。

【讨论】:

    【解决方案3】:

    我认为您的意思是 0x8000,而不是 0x80。如果是这种情况,您应该查阅文档 (http://msdn.microsoft.com/en-us/library/ms646301(VS.85).aspx),该文档对 GetKeyState 的返回值有以下说明:-

    返回值指定指定虚拟键的状态,如下:

    •如果高位为1,则key为down;否则,它就起来了。 •如果低位为1,则键被切换。一个键,如 CAPS LOCK 键,如果打开,它会被切换。如果低位为 0,则该键处于关闭状态且未切换。切换键时键盘上的切换键指示灯(如果有)将亮起,当键未切换时熄灭。

    据我所知,0x80 没有任何意义

    【讨论】:

    • 它会起作用,但你依赖于无证行为。 0x8000 更好。
    【解决方案4】:

    根据the documentation

    返回值指定指定虚拟键的状态:
    如果高位为1,则key为down;
    如果低位为 1,则切换键。 一个键,如 CAPS LOCK 键,如果打开,则切换。如果低位为 0,则该键处于关闭状态且未切换。切换键时键盘上的切换键指示灯(如果有)将亮起,当键未切换时熄灭。

    也许使用不可切换的键(例如“K”),低位 (模棱两可的术语 - 也许它们的意思是 0x0080 ?) 和高位 (0x8000) 位执行相同的操作东西?

    【讨论】:

    • MSDN 文档没有歧义 - SHORT 的高位是 0x8000。低位是 0x0001。我知道这是真的,因为当我使用过这个函数时,我通常用
    • @Stewart:我也是这么想的——但是,为什么这会奏效(如果它确实有效)? ...另外,您所说的与“低位”是0x0080还是0x0001无关..
    • 我认为我从来不需要低位。我怀疑代码“有效”,因为文档没有说明位 1 到 14 的含义。对于按下的不可切换键 0xfffe 将是文档含义内的完美值返回值
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-03
    • 1970-01-01
    • 2012-06-29
    • 2016-03-28
    相关资源
    最近更新 更多