2012-07-13 325 views
0

我想寫一個應用程序,該應用程序在windows xp下按照它們位於任務欄 中的順序讀取快速啓動項目,併爲每個項目設置熱鍵。 窗+ 1應該啓動第一應用窗口 + 2的第二等 (如在窗口7)c#通過winapi讀取syslistview32項目工具提示

所有這些項目被找到IA文件夾,但如果我讀取此文件夾中的項目,我不得到這些項目的正確順序。

我發現了兩個解決方案得到正確的順序 - 第一:

註冊表

條目中發現,在其保存它們如何定位,而不是純文本格式。我不知道如何閱讀這個,並且不能逆轉引擎。

第二個: 通過winapi從任務欄讀取項目工具提示,所以我可以(如果沒有具有相同名稱的項目)通過快速啓動文件夾中的名稱進行搜索。 快速啓動欄只是一個listview(syslistview32)。 通過sendmessage我得到它的工作來計算項目,並開始一個(僞造一個點擊這個項目),但我怎麼可以閱讀tooltip? 我GOOGLE了很多,試過一切,但我沒有得到它運行。

我希望你有任何代碼片段可以解決這個問題。

歡呼

回答

0

確定快速啓動工具欄中的項的順序編程將是固有的脆弱。這裏沒有公開API,這意味着它可能會在未來的Windows版本中發生變化,違反了依賴於未記錄的實現細節假設的代碼。

但是,由於「快速啓動」工具欄不再存在(或者至少沒有人再使用它),因此在這種特定情況下這比通常情況下更少。使用「快速啓動」工具欄的最新版本的Windows是Vista,所以如果確保代碼與Vista及更早版本兼容,則應該沒問題。無論如何,它都不適用於新版本。

快速啓動工具欄項目的位置存儲在註冊表中下面的項:

HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Streams\Desktop 

你可以從那裏提取信息,分析和解釋,然後只要你喜歡用它。正如你所提到的,這些信息並不是以純文本格式存儲的,因爲這對於shell加載和解析本身來說非常慢。由於這是沒有文檔記錄的,並且不是爲了客戶使用而設計的,它們在使用戶(或開發人員)友好方面沒有特別的好處。重要的是對於shell最有效,並且從內部結構存儲二進制信息是明顯的選擇。

您需要對此進行逆向工程以使其對您有用。我可以通過在快速啓動欄中按特定順序建立一個測試環境,從註冊表中導出信息,移動其中一個項目,將更新的信息從註冊表,並比較兩個導出的註冊表文件以查看更改內容。根據需要衝洗並重復多次,以推斷出圖案。 (真的讓你想知道爲什麼如此多的開發者實際上在做需要花時間對Windows的無證方面進行反向工程,不是嗎?)

另一種選擇是使用Spy ++調查實現任務欄及其快速啓動工具欄的窗口。我沒有Windows 7之前的系統,但是聽起來好像你已經完成了這個工作,並確定Quick Launch工具欄是使用標準ListView實現的。如果您知道該窗口的名稱(及其祖先窗口的名稱),則可以遍歷這些窗口以獲取您感興趣的窗口的句柄。然後,您可以確定窗口中項目的順序就好像它是您自己的應用程序中的標準ListView一樣。

ListView控件的文檔是here;這應該讓你開始正確的方向。您可以通過發送LVM_GETITEMTEXT message來獲取其中一個子項目的文本。

這可能是更簡單的方法。同樣的注意事項也適用 - 沒有什麼能保證未來版本的Windows不會更改這些窗口的名稱或實現任務欄的方式,但是由於具有快速啓動工具欄的唯一版本的Windows已經發布(因此不可能改變),這可能不是一個大問題。

再次,隨着Quick Launch工具條過時的事實,我很難理解爲什麼這種努力甚至值得投資開發者時間。另外,即使您已經完成所有編寫和安裝的程序,請考慮用戶將新項目添加到快速啓動工具欄或重新排列現有項目時會發生什麼情況。您的實用程序如何知道並相應地調整鍵盤快捷鍵? 安裝程序如何在「快速啓動」工具欄中添加/刪除項目?

+0

嗨,謝謝你的回答。我嘗試了這種逆向工程,沒有成功。我知道我必須發送lvm_getitemtext消息 - 但發送它沒有成功,也許我做錯了,我從來沒有得到有用的內容。但我知道我擁有的手柄是正確的,因爲我可以成功計數這些項目,並且點擊其中一個也可以。 – cyptus 2012-07-22 12:29:11

+0

來確定每當用戶添加新項目時,我都可以使用文件系統監視器來觀看快速啓動項目的文件夾。如果註冊表內容在時間上發生變化,這可能是完美的。但我不這麼認爲。我也可以刷新所有項目(通過itemtext)當按下熱鍵時執行任何項目,所以我會始終正確的順序。另一種解決方案是在程序開始時實時加載所有項目,我認爲快速項目不會經常移動(並且通過添加一個新項目我有一個事件) – cyptus 2012-07-22 12:30:22