windows下的句柄利用

什么是句柄

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

句柄能干嘛

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

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

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

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

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

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

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

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

#include<Windows.h>

int main()
{
	int i;
	i = 5;
	while (1)
	{
		printf("按钮按下倒计时:%d
", 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获得标题和类
百度云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);
	}

实现的效果如下所示:
时隐时现的百度云
按照这样的方式,还可以做很多效果之类的,但是还都是类似的,这里就不多做阐述了。

原文地址:https://www.cnblogs.com/cj5785/p/10664807.html