1. 程式人生 > >MFC 如何在自己的程式中獲取Windows桌面底部工作列 自動隱藏工作列\取消自動隱藏工作列 的訊息

MFC 如何在自己的程式中獲取Windows桌面底部工作列 自動隱藏工作列\取消自動隱藏工作列 的訊息

    由於需求,我需要獲取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,沒帶多大的希望就去試了下,結果還真出乎意料找了這麼久都找不到的方法,程式本身就自帶了, 這也多虧了那位大神。


四、 寫這篇文章除了記錄自己的經歷,還有就是感謝網上那些隨便一筆就能讓我少走很多彎路的大神,同時也是讓更多人瞭解。