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

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://www.rhkb.cn/news/62555.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Win10 Synaptics触摸板无法实现双指单击模拟鼠标右键点击的解决办法

Win10 synaptics触摸板无法实现双指单击模拟鼠标右键点击的解决办法 系统软硬件环境&#xff1a;win10专业版 1709&#xff0c;触摸板驱动程序版本19.4.18.22 通常win10的触摸板可以实现的手势功能可以参考微软的技术支持网页&#xff0c;地址是&#xff1a;https://support.…

winapi模拟鼠标按住左键拖动

继前文《windows下通过uiAutomation技术获取ui元素》介绍获取ui元素信息后&#xff0c;还需要对信息进行修改&#xff0c;但是 uiAutomation 技术并未提供可修改的 api&#xff0c;只能另辟他径看看了。 以 camera raw 为例&#xff0c;已知的是可将鼠标放在指定区域位置&#…

c#控制windows 鼠标移动、点击和输入

c#控制windows 鼠标移动、点击和输入 首先可以使用ViewWizard获取窗口的类名和TitleMouseHookHelper 鼠标相关的函数主函数调用MouseHookHelper实现鼠标点击和字符输入可能遇到的问题 首先可以使用ViewWizard获取窗口的类名和Title ViewWizard下载地址&#xff1a;https://dow…

手势控制鼠标进行操作的方法和源码

网上有不少用手势控制鼠标移动进行简单操作的视频 于是我也做了一个 实现方法简述&#xff1a; 1、肤色检测找到手势区域&#xff0c;&#xff08;加上kalman滤波等会提高准确度&#xff0c;但也会影响实时性&#xff09;&#xff0c; 2、判断手势&#xff0c;只有两种&…

手势识别控制鼠标和键盘

项目已经及上传github&#xff0c;需者自取。 https://github.com/grey-wood-wolf/Gesture-recognition-mouse-and-keyboard-control 完成人&#xff1a;李政廉 黄鑫杰 傅英伦 实现功能 实现左右手的手势识别&#xff0c;并非触摸控制鼠标的移动和点击&#xff0c;以及键盘上下…

【Parsec】远程控制鼠标消失不可见的解决方法

转载连接&#xff1a;https://www.cnblogs.com/cowmax/p/13577769.html 一、问题描述 通过在云端的主机上部署 frp 服务&#xff0c;实现「使用Windows 远程桌面&#xff08;RDP&#xff09;从互联网侧访问内网的主机」。但是&#xff0c;使用 Windows 自带的远程桌面工具 RD…

员工离职倾向尽在公司掌握,争议发生后,监控系统研发商悄悄下架相关服务

你上班时会使用公司WiFi还是自己的流量呢&#xff1f;如果你平时经常用公司的网络摸鱼&#xff0c;那你现在可要注意了&#xff0c;因为你的上网记录很有可能都被监控下来了。 事情经过 上周&#xff0c;有一个网友发帖称自己开工第一天就被裁&#xff0c;原因竟是领导知道了…

2017 年 IT 界最严重的裁员事件汇总

程序猿&#xff08;微信号&#xff1a;imkuqin&#xff09; 猿妹 整编 裁员年年都有&#xff0c;今年特别多从微软、Oracle、IBM&#xff0c;到思科、HPE&#xff0c;再到雅虎、stackoverflow&#xff0c;无论是处于转型变革中的老牌巨头&#xff0c;还是日渐成熟的创新型公司&…

这可能是2018年IT界规模最大的裁员事件了

作者&#xff1a;焱公子&#xff0c;发型光芒万丈的跨界理工男。多年500强&#xff0c;专注写职场。解薄情人世&#xff0c;书深情故事。 来自&#xff1a;焱公子&#xff08;ID&#xff1a;Yangongzi2015&#xff09; 这可能是2018年IT界规模最大的裁员事件了。近日&#xff0…

阿里最新发布2023版Java八股文PDF版,是真的很强

大家好&#xff0c;今天给大家分享一套 阿里10w字 Java 面试手册。266页&#xff0c;涵盖基础篇、JVM篇、多线程并发篇、Spring篇、MyBatis篇、SpringBoot篇、MySQL篇、SpringCloud篇、Dubbo篇、Nginx篇、MQ篇、数据结构与算法篇、Linux篇、Zookeeper篇、Redis篇、分布式篇、网…

阿里原来这么容易就能进去…

最近和阿里的一个老朋友闲聊&#xff0c;感触颇深&#xff0c;据他说公司近期招聘的测试工程师&#xff0c;大多数候选人都有一个“通病”&#xff1a;在工作2-3年的时候遇到瓶颈&#xff0c;而且是一道很难跨越的坎。 为什么会遇到这种情况&#xff1f;因为大部分测试工程师在…

二战阿里巴巴成功上岸,准备了小半年,要个28k应该也算不上很高吧~

先说下我基本情况&#xff0c;本科不是计算机专业&#xff0c;现在是学通信&#xff0c;然后做图像处理&#xff0c;可能面试官看我不是科班出身没有问太多计算机相关的问题&#xff0c;因为第一次找工作&#xff0c;阿里的游戏专场又是最早开始的&#xff0c;就投递了&#xf…

阿里巴巴原来这么容易就能进去…

最近和阿里的一个老朋友闲聊&#xff0c;感触颇深&#xff0c;据他说公司近期招聘的测试工程师&#xff0c;大多数候选人都有一个“通病”&#xff1a;在工作2-3年的时候遇到瓶颈&#xff0c;而且是一道很难跨越的坎。 为什么会遇到这种情况&#xff1f;因为大部分测试工程师在…

这是一篇能够教会你运营阿里巴巴国际站的文章

对于很多跨境人来说&#xff0c;运营真的是一个让人头疼的大事情。不知道要从哪个方面下手&#xff0c;不知道要往哪方面努力等等问题都是很常见的&#xff0c;所以今天龙哥就解剖一下阿里巴巴国际站的运营方法&#xff0c;简单地给大家讲一下要掌握哪些方面的知识。运营这条路…

威洛特:狗狗骨折如何应急的去处理?

狗狗这种喜欢活蹦乱跳的动物&#xff0c;真的一不小心可能就把自己骨头折了。骨折会影响狗狗的身体健康和正常生活&#xff0c;必须及时治疗。接下来威洛特就给大家分享一些狗狗骨折的相关注意事项。 一、狗狗骨折的应急处理 当狗狗骨折的时候&#xff0c;它的骨头很可能错位了…

安全狗的绕过

环境&#xff1a; phpstudy2018 安全狗apache版 sqllabs靶场 安全狗绕过思路&#xff1a; 安全狗是基于正则匹配的绕过&#xff0c;所以总是能够绕过其正则匹配实现sql的命令执行&#xff0c;需要对数据库语句灵活掌握。经过对安全狗的fuzz&#xff0c;测试其拦截规则&#xff…

Android Watchdog 狗子到底做了啥

作者&#xff1a;流浪汉kylin 原文链接&#xff1a;https://juejin.cn/post/7215498393429983291 前言 有一定开发经验的或多或少有听过Watchdog&#xff0c;那什么是Watchdog呢&#xff1f;Watchdog又称看门狗&#xff0c;看门狗是育碧开发的一款游戏&#xff0c;目前已出到《…

python程序编程代码大全,python编程代码详解

大家好&#xff0c;本文将围绕python程序编程代码大全展开说明&#xff0c;python编程游戏代码是一个很多人都想弄明白的事情&#xff0c;想搞清楚python代码大全简单需要先了解以下几个事情。 1、python编程例子有哪些&#xff1f; python编程经典例子&#xff1a; 1、画爱心…

宝峰数科带你读懂数字家庭的真正内涵

由建标〔2021〕28号文《关于加快发展数字家庭提高居住品质的指导意见》开启的数字家庭国家建设已有一年多&#xff0c;但仍有不少人不能清晰理解数字家庭与早已存在的智能家居、智慧家庭、全屋智能等传统智能之间的区别&#xff0c;业内对数字家庭的认识还不够深入、有待提高。…

易观数科代码埋点、全埋点、可视化埋点

讲埋点的文章那么多&#xff0c;我们为什么还要写它&#xff1f;首先&#xff0c;这不是一篇纯技术文章&#xff0c;而是从一个非技术人员的角度&#xff0c;希望通过浅显的语言描述&#xff0c;让运营同学能快速了解概念。 此外&#xff0c;目前市面的埋点文章&#xff0c;要…