Windows编程捕获特定窗口及键盘鼠标消息模拟

article/2025/10/29 16:53:46

Windows编程捕获特定窗口及键盘鼠标消息模拟

  • 一、简介
  • 二、使用到的API简介
  • 三、获取Windows记事本的编辑区窗口的句柄并模拟输入操作
    • 1、分析
    • 2、代码一
    • 3、代码二
  • 四、后记

一、简介

窗口是Windows的核心组件,Windoows下的绝大部分应用都是利用Windows提供的原生窗口,通过一些GUI编程框架(如Qt,MFC)加以渲染来生成的。本质上讲,这些框架都是基于Windows提供的一些API函数作进一步封装来实现的。

对于一个应用程序最重要的功能就是与人的交互,使得我们可以通过键盘输入和鼠标输入来实现对应用程序的控制。

Windows是利用消息(Message)来实现窗口与用户的输入之间通信的,当应用程序在内存中初始化注册成功后,操作系统会为应用程序创建一个消息队列,应用程序通过在消息队列中取出消息来判断要执行的相应操作,具体如下:
在这里插入图片描述

  • ① 操作系统捕获用户的键盘或者鼠标输入。
  • ② 操作系统根据当前的焦点窗口判断当前用户的输入是属于哪一个应用的,然后将消息投递到相应的应用程序的消息队列中。
  • ③ 应用程序调用GetMessage()函数从消息队列中获取一条消息,根据消息的类型(比如按下鼠标左键,按下w键等)进行处理。
  • ④ 应用程序调用DispatchMessage()函数将消息回传给操作系统。
  • ⑤ 操作系统收到应用程序的回传之后,调用应用程序的窗口过程函数处理这条消息。

二、使用到的API简介

这里主要是使用Windows提供的API,利用以上的消息机制,来模拟操作系统给某一个应用程序发送消息。

使用到的API函数在<Windows.h>头文件中,使用到了以下函数:

  • FindWindow()函数:遍历当前内存中的所有注册窗口,根据相关信息搜索匹配的窗口,返回窗口的句柄。
  • FindWindowEx()函数:根据传入的父窗口(句柄),搜索满足相关条件的子窗口(控件也是窗口),找到第一个即退出,返回窗口的句柄。
  • PostMessage()函数:向指定窗口的消息队列发送消息,可以指定消息的类型,类似以上过程②。
  • GetWindow()函数:根据传入的窗口(句柄)以及输入的关系信息,查找满足条件的窗口,返回窗口的句柄。
  • EnumChildWindows()和EnumChildProc()函数:其中EnumChildProc()函数是EnumChildWindows()的回调函数,EnumChildWindows()会穷举传入窗口(句柄)的所有子窗口,而EnumChileProc()回调函数接收到每个子窗口的句柄,然后进行相关的操作。

以上函数的具体方法可以查阅MSDN官方文档。

三、获取Windows记事本的编辑区窗口的句柄并模拟输入操作

1、分析

主要包括以下几个步骤:

  1. 获取记事本窗口的句柄。
  2. 遍历记事本窗口的所有子窗口,找到编辑区子窗口。
  3. 向编辑区子窗口的消息队列发送消息。
  4. 子窗口作出响应。

2、代码一

#include <iostream>
#include <Windows.h>
using namespace std;int main()
{HWND htext = FindWindow(NULL, L"无标题 - 记事本");  //找到记事本窗口的句柄if (!htext){cout << "not find text!" << endl;return 0;}HWND hchild = FindWindowEx(htext, NULL, L"Edit", NULL);  //找到记事本的编辑区子窗口if (!hchild){cout << "not find child!" << endl;return 0;}/*像编辑区发送按键按下的消息,内容分别hello world*/PostMessage(hchild, WM_KEYDOWN, 0x48, 0);PostMessage(hchild, WM_KEYDOWN, 0x45, 0);PostMessage(hchild, WM_KEYDOWN, 0x4c, 0);PostMessage(hchild, WM_KEYDOWN, 0x4c, 0);PostMessage(hchild, WM_KEYDOWN, 0x4f, 0);PostMessage(hchild, WM_KEYDOWN, VK_SPACE, 0);PostMessage(hchild, WM_KEYDOWN, 0x57, 0);PostMessage(hchild, WM_KEYDOWN, 0x4f, 0);PostMessage(hchild, WM_KEYDOWN, 0x52, 0);PostMessage(hchild, WM_KEYDOWN, 0x4c, 0);PostMessage(hchild, WM_KEYDOWN, 0x44, 0);return 1;
}

运行结果如下:
在这里插入图片描述
可以看到在记事本中成功输入了hello world,完全由代码生成的。

3、代码二

除了以上利用FindWindowEx()函数查找子窗口外,还可以利用EnumChildWindows()函数来遍历所有窗口,对所有子窗口进行操作。以下是代码:

#include <iostream>
#include <string.h>
#include <Windows.h>
using namespace std;
//对枚举的子窗口进行操作
BOOL CALLBACK EnumChildProc(HWND hchild, LPARAM lparam)
{wchar_t cls_name[50];GetClassName(hchild, cls_name, 50);  //获取子窗口的类名wprintf(L"%s", cls_name);      //将子窗口的类名打印到屏幕wchar_t* p = wcsstr(cls_name, (wchar_t*)lparam);  //判断查找到的子窗口是否是编辑区窗口if (p == NULL){return TRUE;}else{/*像编辑区发送按键按下的消息,内容分别hello world*/PostMessage(hchild, WM_KEYDOWN, 0x48, 0);PostMessage(hchild, WM_KEYDOWN, 0x45, 0);PostMessage(hchild, WM_KEYDOWN, 0x4c, 0);PostMessage(hchild, WM_KEYDOWN, 0x4c, 0);PostMessage(hchild, WM_KEYDOWN, 0x4f, 0);PostMessage(hchild, WM_KEYDOWN, VK_SPACE, 0);PostMessage(hchild, WM_KEYDOWN, 0x57, 0);PostMessage(hchild, WM_KEYDOWN, 0x4f, 0);PostMessage(hchild, WM_KEYDOWN, 0x52, 0);PostMessage(hchild, WM_KEYDOWN, 0x4c, 0);PostMessage(hchild, WM_KEYDOWN, 0x44, 0);return TRUE;}
}int main()
{HWND htext = FindWindow(NULL, L"无标题 - 记事本");  //找到记事本窗口的句柄if (!htext){cout << "not find text!" << endl;return 0;}wchar_t class_name[] = { L"Edit" };   //设定要编辑区窗口的类名EnumChildWindows(htext, EnumChildProc, (LPARAM)class_name);  //枚举所有子窗口,在EnumChildProc函数中对这些窗口一一操作return 1;
}

以下是运行结果:
在这里插入图片描述
可以看到也得到了正确的结果,另外通过命令行发现输出了记事本的编辑区窗口的类名是:Editmsctls_statusbar32。

四、后记

基于这种方法,可以编写一些软件的注册机。例如一些软件可能需要输入激活码,这时可以写一个注册机,通过穷举输入到窗口中,来暴力破解软件的激活码。


http://chatgpt.dhexx.cn/article/SATWJTW7.shtml

相关文章

【Windows编程】实时捕捉屏幕

实时捕捉屏幕 主要分为三个部分 获取屏幕 // 两个函数都可以进行位图复制&#xff0c;不过StretchBlt可以按照位图进行拉伸或者压缩 BitBlt(HDC hdc,int x,int y,int cx,int cy,HDC hdcSrc,int x1,int y1,DWORD rop); 或者 StretchBlt(HDC hdcDest,int xDest,int yDest,int …

Windows编程初步(一)

第一节:安装帮助文档 使用C语言进行Windows开发,必然使用到WindowsSDK。Windows SDK指Windows开发人员工具包,是为使用C语言开发Windows程序所提供的工具集。里面提供的工具异常全面丰富,很少有人能全部了解,在开发Windows应用程序时,应同时使用MSDN,即俗称Windows开发…

Windows编程

Windows编程基础 Windows系统级开发&#xff0c;简称Win32 应用程序分类 在Windows这个操作系统平台上&#xff0c;共有三类应用程序控制台程序Console Dos程序&#xff0c;本身没有窗口&#xff0c;通过Windows DOS窗口执行 窗口程序 拥有自己的窗口&#xff0c;可以与用户…

【Windows编程】windows窗口创建过程详解

文章目录 前言1 应用程序的分类2 应用程序分类的对比3 编译工具4 windows库文件和头文件5 WinMain函数和MessageBox函数初始6 窗口类7 窗口类的分类8 注册窗口类函数9 注册窗口类的结构体10 注册全局和局部窗口类11 创建窗口的函数12 创建一个windows的过程步骤13 创建一个子窗…

windows系统编程1——线程和进程

学习视频链接 03进程的创建_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1Fd4y1G7Td?p3&vd_source0471cde1c644648fafd07b54e303c905 目录 一、创建线程 二、线程间同步 2.1 线程不同步的结果 2.2 原子操作上锁 2.3 临界区 2.4 内核对象 三、线程间通信…

day01 windows编程入门

文章目录 window编程基本概念Windows常见的数据类型字符串的处理 第一个windows程序的编写 window编程基本概念 Windows编程的本质就是使用好操作系统&#xff0c;想要用好操作系统必不可少的秘籍----MSDN。 Windows编程主要分为两种&#xff1a; 1、控制台编程(CUI) 2、图形界…

10行代码带你入门Windows编程

Windows编程——Hello World 开发工具效果展示源代码主函数主函数参数HINSTANCEhInstanccehPreInstanceLPSTRlpCmdLinenCmdShowMessageBox 小知识 开发工具 Visual Studio 2013 效果展示 源代码 #include <Windows.h> //头文件//主函数 int WINAPI WinMain(HINSTANC…

使用VS Code进行Qt开发

使用VS Code进行Qt开发 文章目录 使用VS Code进行Qt开发测试环境步骤1. 将Qt的bin目录添加到环境变量2. 安装VS Code扩展3. 使用Qt Creator创建CMake项目4. 在VS Code中打开项目5. 构建并运行项目7. 调试项目 一些小问题 Qt Creator界面不美观&#xff0c;而VS Code更漂亮一些。…

Qt开发CAN通信的环境配置

Qt开发CAN通信的环境配置 目录 1 开发环境 1 1.1 编程环境 1 1.2 工程设置 1 1.3 调试窗口设置 2 1.4 依赖库 2 1.5 源代码的适配 3 2 运行及硬件环境 3 2.1 CAN设备 3 2.4 运行支持文件 3 3 故障解决 4 3.1 转到槽函数失败 4 1 开发环境 1.1 编程环境 工程采用Windows系统下的…

Qt开发必备技术栈学习路线和资料

简介 本文为&#xff1a;C QT 学习路线大纲资料&#xff08;文章底部&#xff09; Qt 可以做什么&#xff1f; Qt 虽然经常被当做一个 GUI 库&#xff0c;用来开发图形界面应用程序&#xff0c;但这并不是 Qt 的全部&#xff1b;Qt 除了可以绘制漂亮的界面&#xff08;包括控…

WIndows下搭建Qt开发环境 -- Qt 、Qt Creater 安装、配置

[本文发布于https://blog.csdn.net/Stack_/article/details/122491885&#xff0c;未经许可不得转载&#xff0c;转载须注明出处] 一、需要下载安装哪些文件 1Qt SDK&#xff0c;即Qt官方提供的API2编辑器、UI设计器 – Qt Creater3编译器 其中Qt Creater是可以被Visual Studi…

Qt开发MQTT(一) 之Qt官方Qt MQTT

概述 Qt开发MQTT程序有两种方式&#xff0c;一个是Qt官方提供的基于MQTT的封装&#xff0c;一个是第三方&#xff08;EMQ&#xff09;开发的用于Qt调用MQTT的接口&#xff0c;二者使用方法大同小异&#xff0c;并且均提供了源码。那么&#xff0c;这里先来介绍第一种&#xff…

Qt开发之Rust篇(一)

本文运行环境&#xff1a; 操作系统&#xff1a;Windows 11 专业版Visual Studio版本&#xff1a;Visual Studio 2022 PreviewQt版本&#xff1a;Qt 5.14.2 1、安装C编译器 除了 Rust 自己的构建工具之外&#xff0c;您还需要设置 C 编译器、Qt 和 CMake。 在 Windows 上&am…

【Qt】ubuntu下Qt开发环境的搭建

下载对应版本的Qt开发环境 Qt官网下载地址&#xff1a;https://download.qt.io 国内镜像下载地址&#xff1a;https://mirrors.cloud.tencent.com/qt/ 。建议用镜像下载速度快。集成安装包在 official_releases/qt 目录下&#xff0c;新地址&#xff1a;https://download.q…

QT开发环境简介、安装以及搭建VS2019环境

文章目录 1、QT简介2、 QT的安装1、下载QT安装包2、安装QT1、安装qt creator2、设置qt账号3、选择安装路径4、选择组件5、同意许可协议&#xff0c;下一步6、菜单快捷方式7、点击安装&#xff0c;等待安装完成8、安装完成 3、qt creator创建工程1、打开软件2、新建项目3、选择Q…

Qt开发框架介绍

Qt: 基于C++跨平台的软件开发框架 Languages: C++, Python, Qt QML, Javascript Qt支持的平台有:Windows, Linux, macOS Qt Quick技术: 描述性UI设计语言(QML)作为前端, C++作为后端. 适用于基于触摸操作的界面的开发, 轻松实现优美、现代的界面. 默认使用GPU进行图形渲染.…

用QT开发安卓应用

QT官网参考链接 https://doc.qt.io/qt-5/android.html 这里的指示是QT5的&#xff0c;和QT6有点不同。 安装QT 下载地址QT6&#xff1a;http://download.qt.io/archive/qt/6.0/6.0.0/single/ 安装后&#xff0c;会多出一个Qt文件夹&#xff0c;里边包含了Qt Creator.app和…

【QT基础入门】1、QT开发环境搭建

文章目录 一、学习所需要的软件 二、安装 VS2012 三、win10 下安装 QT 一、学习所需要的软件 Visual Studio 2012Qt SDK 4.7.4Qt Creator 2.4.1 Visutal Studio 2012 用于学习 Windows 上 GUI 程序设计的原理体会使用 C/C 编写 GUI 窗口应用程序展现 Qt 对于 Windows 窗口开…

UOS搭建QT开发环境

需要注意的是&#xff0c;UOS与其他ubantu系统不同&#xff0c;UOS本身是基于QT开发的&#xff0c;所以当安装的QT版本高于UOS开发者使用的版本时&#xff0c;在使用过程中会出现各种问题。 以下以 UOS家庭版&#xff08;系统环境搭建参考本人上一篇博客 搭建国产化统信UOS操作…

VS2019 Qt开发环境搭建与配置

目录 更新说明 学习Qt、安装Qt环境的困扰 问题1&#xff1a;该选什么操作系统&#xff0c;该用MinGW还是msvc ? 问题2&#xff1a;如果用visual studio该安装哪个qt版本&#xff1f; 问题3&#xff1a;Qt开发商业软件需要付费授权吗&#xff1f; Visual studio Qt 安装步骤…