首页
社区
课程
招聘
[原创]利用钩子函数来注入DLL的一个具体应用:点击桌面不同图标,播放相应音符
发表于: 2011-6-27 21:17 18017

[原创]利用钩子函数来注入DLL的一个具体应用:点击桌面不同图标,播放相应音符

2011-6-27 21:17
18017

最近看核心编程,看到DLL注入这一章,有一个Desktop Item Positon Saver(DIPS)的例子,这个例子是使用窗口挂钩来将一个DLL注入到Explorer.exe的地址空间中,来保存和恢复图标位置。
于是便想根据这个例子自己改造一下,正好前段时间看到在 Google 的首页上,谷歌为了纪念电吉他之父莱斯·保罗 96 周年诞辰,特意做了一个很有意思的Doodle,这个 谷歌电吉他Logo可以让用户在其上面弹奏吉他,于是便想利用桌面图标来编一个类似的程序,点击不同的图标,发出不同的吉他音色的音符。
下面把编程的大概思路说一下:
首先就是找到桌面ListView控件的窗口句柄,刚开始在这里就遇到了问题。
核心编程这本书上讲到Windows外壳有一个类别为ProgMan的窗口,这个ProgMan窗口有且只有一个类别为SHELLDLL_DefView的子窗口。这个子窗口同样有且只有一个子窗口,子窗口的类别为SysListView32,这个SysListView32窗口就是桌面的ListView控件窗口。
于是我便利用了它的代码:
HWND hWndLV =GetFirstChild(GetFirstChild(
      FindWindow(TEXT("ProgMan"), NULL)));
但发现运行不正确,于是便使用spy++查看,发现我的SysListView32窗口是位于类为WorkerW的窗口下。难道这是win7系统更改的?我也不清楚。因此,如果大家下载下来我的源代码后,如果运行不成功,最好用spy++查看一下窗口信息,看一看SysListView32控件到底是谁的子窗口,如果是ProgMan的子窗口,那么大家需要把MouseHookApp.cpp文件中的
HWND hWndLV;
   EnumWindows(EnumWindowsProc,(LPARAM)&hWndLV);

EnumWindowsProc函数注释掉,
取消HWND hWndLV =GetFirstChild(GetFirstChild(
      FindWindow(TEXT("ProgMan"), NULL)));这一代码的注释。
我发现类名为WorkerW的窗口不是唯一的,因此不能使用FindWindows了,改用了EnumWindows函数。
HWND hWndLV;
   EnumWindows(EnumWindowsProc,(LPARAM)&hWndLV);

其中的EnumWindowsProc函数实现如下:

BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam){
	if(hwnd)
	{
		TCHAR classname[128];
		GetClassName(hwnd, classname, 128);
		if(!_tcscmp(classname, _T("WorkerW") ) )
		{
			HWND &hWndLV = *(HWND *)lParam;
			TCHAR childClassName[128];
			HWND hChildWnd = GetWindow(hwnd, GW_CHILD);
			while(hChildWnd)
			{
				GetClassName(hChildWnd, childClassName, 128);
				if(!_tcscmp(childClassName, _T("SHELLDLL_DefView")))
				hWndLV = GetFirstChild(hChildWnd);
				chASSERT(IsWindow(hWndLV));
				return false;
			}
		}
	}
	
	return true;
}

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

上传的附件:
收藏
免费 7
支持
分享
最新回复 (19)
雪    币: 2271
活跃值: (2160)
能力值: (RANK:400 )
在线值:
发帖
回帖
粉丝
2
核心编程我也看过, 但是没写出像LZ那么好玩的程序, 失败啊。
希望LZ以后能改进通用性的同时能分享你的学习心得。
2011-6-28 10:28
0
雪    币: 210
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
看过,很好,感谢楼主分享!
2011-6-28 12:31
0
雪    币: 677
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
只装了vc6  鸭梨很大
2011-6-28 13:42
0
雪    币: 271
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
wep
5
不错,挺好的应用。
2011-6-28 14:41
0
雪    币: 220
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
嗯 曾经谷歌的这个小动作我也留意过
2011-6-28 20:18
0
雪    币: 327
活跃值: (30)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
7
上班的电脑,只装了vc6。今晚是不能试玩了!
2011-6-28 21:07
0
雪    币: 338
活跃值: (103)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
8
恩 那个电吉他很赞 不知道怎么做的 谁可以讲讲啊
2011-6-28 22:05
0
雪    币: 256
活跃值: (79)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
9
对啊,我也想看看google的那个电吉他的原理。是不是用ajax实现的?
2011-6-28 23:26
0
雪    币: 256
活跃值: (79)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
10
多谢斑竹,以后会分享的
2011-6-28 23:31
0
雪    币: 143
活跃值: (61)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
11
如果楼主学过WINDOWS GDI那这个软件肯定更出色^_^
2011-6-29 07:24
0
雪    币: 1602
活跃值: (14)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
没放bin啊,一时之间找不到编译器``
鼠标钩子,学以致用啊
2011-7-1 05:30
0
雪    币: 217
活跃值: (30)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
LZ挺有创意,从来没有想过这么玩。佩服。
2011-7-2 09:44
0
雪    币: 149
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
厉害啊,我也看过核心编程,就没有这么多的想法。向楼主学习
2011-7-2 10:21
0
雪    币: 7
活跃值: (333)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
15
编码风格不错。
既然win32下,就用大写FALSE替代false吧。
2011-7-3 23:56
0
雪    币: 216
活跃值: (144)
能力值: ( LV10,RANK:160 )
在线值:
发帖
回帖
粉丝
16
mark~~,有点意思~~
2011-7-4 17:36
0
雪    币: 261
活跃值: (83)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
17
very very very good!
好!
能否指点一下在linux下如何运行你这个程序?
手头已经没有windows的机器了,可否书写一份linux下的源码?
2011-7-6 08:32
0
雪    币: 256
活跃值: (79)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
18
多谢回复。现在还是个菜,linux没接触过,以后又机会一定要学习一下linux
2011-7-6 14:46
0
雪    币: 49
活跃值: (71)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
鼠标钩子!!! 正好能用上!
2011-7-6 19:24
0
雪    币: 777
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
看起来蛮有创意的。
2011-7-13 11:27
0
游客
登录 | 注册 方可回帖
返回
//