对应于《window核心编程》第五版的576页。
这个例子主要通过SetWindowsHookEx函数来将一个指定的DLL加载进目标进程,进而到达一些特殊的处理目的。DIPS这个例子实现的功能是保存桌面上所有图标的位置,使桌面的分辨率发生改变后仍然能够保持原来的布局不变。我们没有办法直接获取到这些图标的位置,因为我们的程序进程和桌面进程不是同一个,必须要将我们的dll放置在桌面的进程空间中才能访问桌面上的内容。
其思路如下:整个solution分为两个项目,第一个是一个exe的程序,用来将dll注入,并且通过给dll中的窗口发消息来和dll通信,控制dll的行为。第二个是一个dll程序,用来被注入到桌面进程中,实现桌面图标的保存。
主程序exe的思路如下:
通过findwindow来找到桌面的窗口句柄,然后再使用GetWindowThreadProcessId获取到窗口所属的线程,在这个线程上用SetWindowsHookEx来给这个线程挂接一个消息的hook,从而将我们的dll注入,通过给dll中的窗口发送WM_APP消息来控制dll的行为。
dll的思路如下:
在dll被注入后,创建一个对话框,不进行显示,用来维持消息循环。当接收到WM_app消息后,按照消息参数,读取或者保存桌面图标的位置。
注意:
两个进程之间的设置了共享的存储去用来存储 exe的线程Id和hook的句柄。
其实现在看起来不难,但是我调试这个程序还是花了点时间,所以总结一下。。。。。。
https://files.cnblogs.com/kwliu/22-DIPS.rar