tft每日頭條

 > 圖文

 > 資源管理器中的狀态欄

資源管理器中的狀态欄

圖文 更新时间:2024-08-06 14:16:02

軟件開發活動,是需要不停地創造新的東西。但更多的時候,可能隻是将現有的功能組件合成起來,構建出一個更大型的功能。今天我們我們就來談談後者。

如果給你一個窗口句柄,你可以得到什麼信息?你可能會知道如下這些信息:> 它是否是一個資源管理器窗口,如果是的話> 當前這個窗口顯示的是哪個文件夾> 以及當前哪個文件條目處于選中狀态

上面說的這些功能點,其實并不複雜,隻是我們需要将很多小型的代碼片段拼接到一起,才能實現這些功能。

那我們就從ShellWindows對象開始吧, 這個對象代表了所有已打開的外殼窗口。你可以通過其Item屬性來遍曆它們。對于C 開發者來說,代碼的實現看起來有點繁瑣,因為這些外殼對象原本是用來在腳本語言中使用的,例如JScript或者Visual Basic。如下圖所示:

資源管理器中的狀态欄(如何獲取資源管理器窗口的信息)1

對于每個窗口,我們可以獲取其窗口句柄并判斷它是否是我們想要的那個,代碼如下圖所示:

資源管理器中的狀态欄(如何獲取資源管理器窗口的信息)2

現在,我們已經通過IWebBrowserApp接口獲取了文件夾,接下來我們需要獲取頂層的外殼浏覽器窗口了。可以通過查詢SID_STopLevelBrowser服務并獲取IShellBrowser接口,如下圖所示:

資源管理器中的狀态欄(如何獲取資源管理器窗口的信息)3

從接口IShellBrowser中,我們可以通過QueryActiveShellView方法來獲取當前外殼視圖,如下圖所示:

資源管理器中的狀态欄(如何獲取資源管理器窗口的信息)4

當然了,我們真正需要的是一個IFolderView接口,它是一個自動化對象,其中包含了我們需要的所有信息,如下圖所示:

資源管理器中的狀态欄(如何獲取資源管理器窗口的信息)5

現在,一切準備工作已經完成了,你希望從IFolderView接口中獲取什麼樣的信息呢?獲取一下IShellFolder視圖浏覽位置如何?我們需要使用IPersistFolder2接口的GetCurFolder方法來做到這一點。GetFolder方法可以讓我們能否訪問到這個文件夾對象。(在大多數情況下,我們真正需要的就是這個IShellFolder接口,因為我們可以從這個接口中獲取很多有用的信息),如下圖所示:

資源管理器中的狀态欄(如何獲取資源管理器窗口的信息)6

為了顯示出結果,我們這裡使用了一個轉換,将pid1轉換為實際的文件路徑,如下圖所示:

資源管理器中的狀态欄(如何獲取資源管理器窗口的信息)7

還有上面其他的可以做的呢?哦,對了,我們可以看看當前選中的文件對象,如下圖所示:

資源管理器中的狀态欄(如何獲取資源管理器窗口的信息)8

接下來,讓我們顯示選中文件的名稱。為了做到這一點,我們需要對象的pidl和IShellFolder接口。主要是使用其Item屬性,如下圖所示:

資源管理器中的狀态欄(如何獲取資源管理器窗口的信息)9

(如果我們希望獲取一個選中文件的集合,我們可以傳遞參數SVGIO_SELECTION到Item方法)

獲取了對象的pidl之後,接下來,我們需要獲取一下IShellFolder接口:

資源管理器中的狀态欄(如何獲取資源管理器窗口的信息)10

然後,我們通過使用GetDisplayNameOf方法來獲取對象的顯示名稱,如下圖所示:

資源管理器中的狀态欄(如何獲取資源管理器窗口的信息)11

我們可以使用StrRetToBuf函數來将STRRET結構體轉換為一個字符串緩沖區:

資源管理器中的狀态欄(如何獲取資源管理器窗口的信息)12

是時候将以上所有代碼片段集合在一起了,下面的代碼,看起來有些醜陋,因為我将它們放到了一個巨大的函數中,而沒有使用子函數調用。在實際的工程中,我還是會傾向于将它們封裝成一個一個的幫助函數,這樣就比較容易閱讀和維護。完整版代碼如下圖所示:

資源管理器中的狀态欄(如何獲取資源管理器窗口的信息)13

資源管理器中的狀态欄(如何獲取資源管理器窗口的信息)14

資源管理器中的狀态欄(如何獲取資源管理器窗口的信息)15

大功告成,讓我們來看看如何調用這個大型函數并顯示出結果:

資源管理器中的狀态欄(如何獲取資源管理器窗口的信息)16

執行我們的例子程序,并将它放置到一邊,然後打開一個資源管理器窗口并觀察我們的程序的輸出結果。

總結

讀到這裡的讀者,我希望你可以明白我的意思:一個大型功能中的所有功能代碼,實際上都是已經有了,隻是你需要想辦法将它們正确的組合到一起。從上面的代碼中,我們可以看到,每一項子功能都不是很複雜,但是将它們以一種有趣的方式組合在一起,就需要花費些功夫了。

最後

Raymond Chen的《The Old New Thing》是我非常喜歡的博客之一,裡面有很多關于Windows的小知識,對于廣大Windows平台開發者來說,确實十分有幫助。本文來自:《Querying information from an Explorer window》

最近我寫了個東西

正如你們所知道的,拓撲梅爾智慧辦公平台(Topomel Box)是一款綠色軟件,主要面向經常使用電腦的朋友。它提供了各種提升辦公效率的小功能,同時操作上盡可能地簡單方便。我想:你值得擁有。

資源管理器中的狀态欄(如何獲取資源管理器窗口的信息)17

,

更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!

查看全部

相关圖文资讯推荐

热门圖文资讯推荐

网友关注

Copyright 2023-2024 - www.tftnews.com All Rights Reserved