google的快速搜索按钮放在了任务栏上,引来了众多人的兴趣。大家不知道这个是如何实现的。
把程序放在任务栏好像不难实现,但是如果拖动任务栏好像这个按钮仍然能保持好的状态,比较难实现。估计是进入到了
window的内核,截获了消息。
以下为网友的研究结果:
在改变任务栏的位置或者大小的过程中,涉及到几个比较关键的消息:
WM_SIZING
WM_WINDOWPOSCHANGING
WM_NCCALCSIZE
WM_WINDOWPOSCHANGED
WM_MOVE
WM_SIZE
经过测试,发现有以下规律:
1.当通过直接拖动任务栏而使任务栏发生变化时,任务栏会依次收到以上列出的消息;
2.当在另外一个程序里面通过代码改变任务栏时,任务栏收到的消息会缺少WM_MOVE和WM_SIZE消息。
关于WM_WINDOWPOSCHANGED消息,MSDN里有如下解释:
The WM_WINDOWPOSCHANGED message is sent to a window whose size, position, or place in the Z order has changed as a result of a call to the SetWindowPos function or another window-management function.
Parameters
wParam
This parameter is not used.
lParam
Pointer to a WINDOWPOS structure that contains information about the window's new size and position.
Remarks
By default, the DefWindowProc function sends the WM_SIZE and WM_MOVE messages to the window. The WM_SIZE and WM_MOVE messages are not sent if an application handles the WM_WINDOWPOSCHANGED message without calling DefWindowProc. It is more efficient to perform any move or size change processing during the WM_WINDOWPOSCHANGED message without calling DefWindowProc.
根据以上解释,任务栏在收到WM_WINDOWPOSCHANGED消息之后,位置和大小已经改变。lParam参数中包含有新的位置和大小信息。
猜想:
1.直接拖动任务栏的时候,任务栏在收到WM_MOVE和WM_SIZE消息时,分别把任务栏的新位置和新大小记录了下
来;在重启系统后,任务栏还是保持新的大小和位置,那么这些值应该是保存在注文件中的。
2.在外部程序中改变任务栏状态后,任务栏没有收到WM_MOVE和WM_SIZE消息,也就没有把新位置和新大小保存下来;当任务栏再次定时查询任务栏状态时,会将任务栏的状态设置为它保存下来的值;杯具发生了... ...
可能的解决方法:
hook WM_WINDOWPOSCHANGED消息,强制发送WM_MOVE和WM_SIZE消息。
有功夫了试验一下....