如何捕获explorer重启的消息

在项目中,有时候可能会因为项目本身的原因,需要捕获explorer重启的消息,然后再做一些处理。
比如考虑以下情况的发生:
程序hook了windows 桌面窗口,子类化这个窗口,然后做一相关的处理,但是如果我重启了explorer,那就需要重新再hook一下,但如何截获explorer重启的消息呢?

我们可以用spy++来钩一下,看看什么消息发生了,如图:

图(1):

当然,你也可以尝试钩一下其它应用程序,比如notepad.exe,注意,在钩消息的时候,使用如下设置才能比较清楚的看到我们想要的消息。如图:

图(2)

通过图(1)我们可以看到,在explorer重启时,应用程序收到了一个注册消息,[Registered:"TaskbarCreated"] ,这个注册消息是根据字符串"TaskbarCreated"产生的。实际上,在安装了Internet Explorer 4.0及以上版本的Windows操作系统中,当explorer重启时,任务栏会被重新建立,此时,外壳(shell)会向所有顶层的应用程序发出通知消息,该消息是外壳以字符串"TaskbarCreated"为参数向系统注册获得的。
该消息的ID=RegisterWindowMessageW(L"TaskbarCreated"); 
该消息已经被系统注册过,因此,我们的应用程序在调用这个函数时,该函数会返回它对应的注册消息ID,这个ID是唯一的。 

因此,我们在程序中可以按以下方式来获取这个消息:
1. 定义一个消息,其值为RegisterWindowMessageW(L"TaskbarCreated")返回的结果;
2. 在应用程序的消息循环中接收该消息。

简要代码如下:
const UINT WM_TASKBARCREATED = RegisterWindowMessageW(L"TaskbarCreated"); BOOL CALLBACK MainDlgProc(HWND hWnd, UINT Message, WPARAM wPa, LPARAM lPa) { if (Message == WM_RECOVERTRAY) { // Do something MessageBox(GetForegroundWindow(), L"WM_RECOVERTRAY", L"WM_RECOVERTRAY", 0); } }

PS:其另外一个应用是任务栏通知图标的重建,见链接:http://blogold.chinaunix.net/u2/67530/showart_601500.html

 

 

你可能感兴趣的:(Win32)