• 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);
    	}
    

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

  • 相关阅读:
    分段、分页&&内存碎片、外存碎片
    mysql中的事务处理
    算法的在线演示网站
    为什么要使用树以及使用什么树
    平衡多叉树--B-Tree(B树)
    MVCC--多版本并发控制机制
    mysql中的锁
    平衡二叉树--红黑树(RB-Tree)
    平衡二叉树--AVL树
    自平衡方式--旋转
  • 原文地址:https://www.cnblogs.com/cj5785/p/10664808.html
Copyright © 2020-2023  润新知