MFC 如何在自己的程序中获取Windows桌面底部任务栏 自动隐藏任务栏\取消自动隐藏任务栏 的消息

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Ilson_/article/details/76945230

    由于需求,我需要获取Windows底部任务栏 自动隐藏任务栏或者取消自动隐藏任务栏时的消息。 可在当时我就在想想要在自己程序中获取系统的消息那肯定很麻烦,于是我就上网查了一遍不过这方面的介绍也似乎不是很多。不过也有类似的比如用全局钩子、用API拦截技术等,但也只是类似并不是我想要的。 偶然间看到一篇文章用到SHAppBarMessage()可以真正实现任务栏连带着开始菜单一起隐藏 我就觉得我可以通过API拦截把系统的消息拦截下来。


一、 自动隐藏任务栏和取消自动隐藏任务栏(隐藏于自动隐藏不同)

需要利用一API函数:SHAppBarMessage
UINT_PTR SHAppBarMessage(      
    DWORD dwMessage,
    PAPPBARDATA pData
);

参数说明:
dwMessage   可以为下列参数
ABM_ACTIVATE                    激活一个 appbar 
ABM_GETAUTOHIDEBAR              检索屏幕边缘的 appbar
ABM_GETSTATE                    检索最顶层的Microsoft Windows任务栏
ABM_GETTASKBARPOS               检索任务栏
ABM_NEW                         注册一个新的appbar,该系统并发送一消息给appbar 
ABM_QUERYPOS                    appbar 大小和屏幕位置 
ABM_REMOVE                      取消注册一个 appbar,并从系统内部列表移出
ABM_SETAUTOHIDEBAR              在屏幕边缘注册或取消注册appbar
ABM_SETPOS                      设置appbar 的大小和屏幕位置 
ABM_SETSTATE                    设置appbar为最顶层
ABM_WINDOWPOSCHANGED            当appbar得状态发送改变时向系统发送消息

pData 
一个APPBARDATA结构体

这只是函数介绍具体怎么用还的网上百度。


二、 当我真的把API函数SHAppBarMessage()拦截下来的时候我才发现,只有当我在程序中调用SHAppBarMessage()函数时 才会被拦截,而手动去隐藏任务栏时 系统调用的SHAppBarMessage() 却不会拦截下来,这时有两种可能:

1、 系统隐藏任务栏时根本不是调用SHAppBarMessage()

2、 想要拦截API函数只有当自己程序调用时才会被自己写的拦截函数拦截 而系统调用的API不会被拦截


这时候我就换了一个API函数MessageBoxW() 看看能不能被拦截  因为你删除文件时系统会弹出一个提示框 而这个提示框就是调用MessageBoxW(),结果真是意外 当我删除文件弹出提示框时 API没有拦截成功, 这时候我得出一个结论: API拦截只能拦截程序中自己调用的函数 对于系统函数不能被拦截。


三、 在无助的时候,在CSDN谋篇文章提到过WM_SETTINGCHANGE 可以看 http://bbs.csdn.net/topics/391888487,没带多大的希望就去试了下,结果还真出乎意料找了这么久都找不到的方法,程序本身就自带了, 这也多亏了那位大神。


四、 写这篇文章除了记录自己的经历,还有就是感谢网上那些随便一笔就能让我少走很多弯路的大神,同时也是让更多人了解。



猜你喜欢

转载自blog.csdn.net/Ilson_/article/details/76945230