编程论坛

 找回密码
 立即注册
广告联系qq1031180668广告位
查看: 132|回复: 1

[c/c++] vc++全局的判断某个键按下还是抬起,非线程

[复制链接]
  • ta_mind

    2018-8-17 21:57
  • classn_01: 71 classn_02

    [LV.6]常住居民II

    983

    主题

    1704

    帖子

    3353

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    3353

    最佳新人活跃会员热心会员推广达人宣传达人灌水之王突出贡献优秀版主荣誉管理论坛元老

    发表于 2018-8-7 05:24:35 | 显示全部楼层 |阅读模式
    #define KEYDOWN(vk_code) ((GetAsyncKeyState(vk_code) & 0x8000) ? 1 : 0)
    #define KEYUP(vk_code) ((GetAsyncKeyState(vk_code) & 0x8000) ? 0 : 1)



    逻辑键状态:使用 GetKeyState,GetKeyboardState,等函数得到的逻辑键状态,模拟按下按键;
    GetAsyncKeyState
    函数功能:读取的是物理键状态,也就是不管你怎么鼠标键盘映射,它只读取实际的按键状态。MSDN上给出了例子很恰当For example, the call GetAsyncKeyState(VK_LBUTTON) always returns the state of the left physical mouse button, regardless of whether it is mapped to the left or right logical mouse button.也就是说如果你重新设置了映射,GetAsyncKeyState还是只读取物理状态;
    GetAsyncKeyState
    的返回值:表示两个内容,一个是最高位bit的值,代表这个键是否被按下,按下为1,抬起为0;一个是最低位bit的值,在windowsCE下要忽略(参考自MSDNIf the most significant bit is set, the key is down. The least significant bit is not valid in Windows CE, and should be ignored.)
    Asynchronous
    :英文意思是异步的


    SHORT GetKeyState(int nVirtKey);
    SHORT GetAsyncKeyState(int vKey);
    BOOL GetKeyboardState(PBYTE lpKeyState);
    三个取key status的函数的最大区别是:
    第一个:是从windows消息队列中取得键盘消息,返回key status.
    第二个:是直接侦测键盘的硬件中断,返回key status.
    第三个:是当从windows消息队列中移除键盘消息时,才返回key status.

    keybd_event函数,是模拟键盘击键,一次完整的击键模拟事件,是"按下"和"弹起"两个消息,所以 keybd_event(VK_F12,0,0,0);keybd_event(VK_F12,0,KEYEVENTF_KEYUP,0); 完成了一次完整的点击 F12 的事件。

    GetAsyncKeyState()函数,是直接侦测键盘的硬件中断。(有些人说,是一种“实时性”的侦测,这种说法,感觉不对,比如你调用 Sleep(),就算是中断一年的时间,只要在这期间程序还在运行,它都可以把那个键的状态侦测出来)。自上一次调用

    GetAsyncKeyState()函数以来(在某些循环中,N次调用GetAsyncKeyState(),它每次检查的,都是自上次调用之后,键的状态),若键已被按过,则返回1,否则,返回0;有些资料显示:倘若输入焦点从属于与调用函数的输入线程不同的另一个线程,则返回零(例如,在另一个程序拥有输入焦点时,应该返回零)。实验证明,这种说法并不完全,函数实际是在大部份范围内工作的,只有少数是另外)。

    ---------------
    附:
    VC++编译器,计算~10,得出的结果是-11。为什么不是5呢
    10的二进制表示为1010,按位取反应该为0101,也就是十进制的5,为什么会得出-11?

    VC是32位编译器,所以
    10 = 00000000 00000000 00000000   00001010
    ~10 = 11111111 11111111   11111111   11110101 =   -11
    可以通过掩码(位与) 与15位与
    15 = 00000000 00000000 00000000   00001111
    ~10 = 00000000 00000000 00000000   00000101   =   -11
    附:
    VK_LBUTTON             鼠标左键                      0x01
    VK_RBUTTON             鼠标右键                      0x02
    VK_CANCEL              Ctrl + Break                  0x03
    VK_MBUTTON             鼠标中键                      0x04
    VK_BACK                Backspace 键       0x08
    VK_TAB                 Tab 键                        0x09
    VK_RETURN              回车键                        0x0D

    VK_SHIFT               Shift 键                      0x10
    VK_CONTROL             Ctrl 键                       0x11
    VK_MENU                Alt 键                 0x12
    VK_PAUSE               Pause 键                      0x13
    VK_CAPITAL             Caps Lock 键                  0x14
    VK_ESCAPE              Esc 键                        0x1B
    VK_SPACE               空格键         0x20
    VK_PRIOR               Page Up 键                    0x21
    VK_NEXT                Page Down 键                  0x22
    VK_END                 End 键                        0x23
    VK_HOME                Home 键                       0x24
    VK_LEFT                左箭头键                      0x25
    VK_UP                  上箭头键                      0x26
    VK_RIGHT               右箭头键                      0x27
    VK_DOWN                下箭头键                      0x28
    VK_SNAPSHOT            Print Screen 键               0x2C
    VK_Insert              Insert 键                     0x2D
    VK_Delete              Delete 键                     0x2E
    '0' – '9'             数字 0 - 9                    0x30 - 0x39
    'A' – 'Z'             字母 A - Z                    0x41 - 0x5A
    VK_LWIN                左WinKey(104键盘才有)         0x5B
    VK_RWIN                右WinKey(104键盘才有)         0x5C
    VK_APPS                AppsKey(104键盘才有)          0x5D
    VK_NUMPAD0            小键盘 0 键                    0x60
    VK_NUMPAD1            小键盘 1 键                    0x61
    VK_NUMPAD2            小键盘 2 键                    0x62
    VK_NUMPAD3            小键盘 3 键                    0x63
    VK_NUMPAD4            小键盘 4 键                    0x64
    VK_NUMPAD5            小键盘 5 键                    0x65
    VK_NUMPAD6            小键盘 6 键                    0x66
    VK_NUMPAD7            小键盘 7 键                    0x67
    VK_NUMPAD8            小键盘 8 键                    0x68
    VK_NUMPAD9            小键盘 9 键                    0x69
    VK_F1 - VK_F24        功能键F1 – F24               0x70 - 0x87
    VK_NUMLOCK            Num Lock 键                   0x90
    VK_SCROLL             Scroll Lock 键                0x91
    本文作者:郁金香


    不积跬步,无以至千里

    classn_11

    0

    主题

    42

    帖子

    88

    积分

    注册会员

    Rank: 2

    积分
    88
    发表于 2018-8-13 14:35:26 | 显示全部楼层
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    手机版|Archiver|小黑屋|sitemap|编程论坛 - 一个单纯的编程学习交流论坛 ( 豫ICP备15032706号 )

    GMT+8, 2018-10-21 01:27 , Processed in 1.117481 second(s), 24 queries .

    Powered by Discuz! X3.4

    © 2001-2013 Comsenz Inc.

    快速回复 返回顶部 返回列表