什么是句柄

维基百科:在程序设计中,句柄(handle)是Windows操作系统用来标识被应用程序所建立或使用的对象的整数。其本质相当于带有引用计数的智能指针。当一个应用程序要引用其他系统(如数据库、操作系统)所管理的内存块或对象时,可以使用句柄

句柄能干嘛

在得到一个应用程序的句柄以后,几乎可以为所欲为,下面用两个例子来说明句柄能够做的一些事情。

利用句柄实现不可点击按钮的点击操作

在很多应用程序中,会存在一些不可点击的按钮,而这些按钮可以通过句柄来实现点击。例如注册按钮。还会有很多文本,而这些文本也可以被修改。

创建一个用于测试的MFC程序



在测试用例中,有一个不可点击的按钮,一个可点击的按钮,一个文本

利用VS的spy++功能查找程序句柄

打开spy++查找工具



拖动靶心,使其能够查找到不可点击按钮的句柄,如图所示,这里获取到不可点击按钮的句柄为:002008EE,注意这里使用的是16进制数表示的。

编写程序,调用windows的API改变按钮状态

#include<Windows.h>

int main()
{
int i;
i = 5;
while (1)
{
printf("按钮按下倒计时:%d\n", i);
Sleep(1000);
i--;
if (i == 0)
break;
}
printf("按钮按下");
//此处模拟的是按钮被按下
SendMessage(0x002008EE, WM_LBUTTONDOWN, 0, 0);
SendMessage(0x002008EE, WM_LBUTTONUP, 0, 0);
getchar();
return 0;
}



这样就实现了按钮状态的修改,灰色按钮也能按下了。

如果调用的是SetWindowTextA(0x00160858, "text change");函数,还可以改变标题:

以上操作存在的问题和解决方案

按照以上的方法确实可以修改任意元素,但每次程序启动以后,其句柄值会发生改变,这就需要获取一种固定的值。Windows中有API可以获得句柄。FindWindowA().程序一旦生成,其类便是固定的,此函数就是利用这个固定的类获得句柄。

此处我们使用一个带窗口的程序测试一下,就百度云好了,使用spy获得标题和类



编写功能,此处做一个时隐时现的例子

HWND win = FindWindowA("DuiHostWnd", "欢迎使用百度网盘");
if (win == NULL)
printf("not find");
else
while (1)
{
ShowWindow(win, SW_NORMAL);
Sleep(100);
ShowWindow(win, SW_HIDE);
Sleep(100);
}

实现的效果如下所示:



按照这样的方式,还可以做很多效果之类的,但是还都是类似的,这里就不多做阐述了。

windows下的句柄利用的更多相关文章

  1. Windows下MFC程序利用LockCop解决死锁

    死锁现象:在训练的时候,点击“终止”按钮时不时会发生死锁. 检测工具:LockCop.TRACE宏.::GetCurrentThreadID函数. 检测手段: 总结起来就是—— 第一步:用LockCo ...

  2. linux文件描述符fd(windows下的句柄)

    在Linux系统中一切皆可以看成是文件,文件又可分为:普通文件.目录文件.链接文件和设备文件 fd:file descriptor 文件描述符0,1,2分别给了标准输入.标准输出和错误输出. ls - ...

  3. windows下利用dll生成lib

    原来工程编译的一些dll库,这次项目需要静态库,偷懒想直接转化.看到网上一些教程,使用VC工具和建立lib项目来实现.有点麻烦.还有一种方法,仅仅利用工具和几条命令转化.来试试看.文章参考harrie ...

  4. windows下Redis安装及利用java操作Redis

    一.windows下Redis安装 1.Redis下载 下载地址:https://github.com/MicrosoftArchive/redis 打开下载地址后,选择版本 然后选择压缩包 下载 R ...

  5. 利用cygwin创建windows下的crontab定时任务

    要求 必备知识 熟悉基本编程环境搭建. 运行环境 windows 7(64位); Cygwin-1.7.35 下载地址 环境下载 什么是Cygwin Cygwin是一个在windows平台上运行的类U ...

  6. 利用SSH协议在Windows下使用PuTTY连接Ubuntu

    利用SSH协议在Windows下使用PuTTY连接Ubuntu Ubuntu部分 首先我们要为Ubuntu配置一下环境,让它支持ssh服务,我们要做的其实也很简单,就一下两步: 安装OpenSSH软件 ...

  7. windows下利用iis建立网站网站并实现局域共享

    博客园 首页 新随笔 联系 管理 订阅 随笔- 54  文章- 9  评论- 0  Windows下利用IIS建立网站并实现局域网共享 https://blog.csdn.net/qq_4148541 ...

  8. [技术博客] 利用Vagrant+virtualbox在windows下进行linux开发

    目录 加速box安装的方法 root账户登录 换源教程 安装rvm 访问rails server RubyMine连接虚拟机上的解释器 作者:庄廓然 在windows下进行linux开发:利用Vagr ...

  9. windows下利用virtual 安装 flask

    出处: https://segmentfault.com/a/1190000002450878 本文介绍Windows下如何从零开始搭建Python + Flask开发环境. 安装Python 2.7 ...

随机推荐

  1. node.js http模块和fs模块上机实验·

    httpserver const httpserver = require('http'); var server = httpserver.createServer(function (req,re ...

  2. struts2之单文件上传(7)

    前台页面jsp <!-- 拦截的时候用这个 <s:form action="uploadAction" enctype="multipart/form-dat ...

  3. 题解 [CF803C] Maximal GCD

    题面 解析 一开始以为这题很难的... 其实只要设\(d\)为\(a\)的最大公因数, 即\(a[i]=s[i]*d\), 因为\(n=\sum_{i=1}^{n}a[i]=\sum_{i=1}^ns ...

  4. python第三方库安装

    如安装jieba分词库 代码对Python 2/3均兼容 全自动安装:easy_install jieba或者pip install jieba / pip3 install jieba 半自动安装: ...

  5. 查看PublicKeyToken和生成PublicKeyToken

    http://hi.baidu.com/honfei/item/7777500b20d8ff8a02ce1bd2

  6. 使用 kubeadm 安装 kubernetes v1.16.0

    近日通过kubeadm 安装 kubernetes v1.16.0,踩过不少坑,现记录下安装过程. 安装环境: 系           统:CentOS Linux release 7.6 Docke ...

  7. shell编程之 ()[] {}

    shell脚本中各种括号的区别以及用法 2018年08月19日 14:55:33 M_QiJunChao 阅读数:273   最近学到了shell脚本编程,觉得脚本中的不同括号有不同的用处,以及有些括 ...

  8. 预处理、const、static与sizeof-用宏定义得到一个字的高位和低位字节

    1:代码如下: #define WORD_LO(XXX) ((byte) (word)(XXX) & 255) #define WORD_HI(XXX) ((byte) (word)(XXX) ...

  9. 手把手教你在Linux系统下安装MySQL

    在CentOS中默认安装有MariaDB,这个是MySQL的分支,但为了需要,还是要在系统中安装MySQL,而且安装完成之后可以直接覆盖掉MariaDB. 1. 下载并安装MySQL官方的 Yum R ...

  10. HearthBuddy中_settings.txt的更详细参数解释

    https://tieba.baidu.com/p/5275382967 默认的配置不是很合理,花了点时间读了下silverfish(也就是兄弟用的AI)的代码后也尝试修改了些参数,有没有效果仁者见仁 ...