2012-11-20 66 views
0

描述我的問題有點棘手,但我會盡我所能。如何同時在資源管理器中打開多個文件?

首先,我正在開發使用C和WinAPI的多文檔界面應用程序。我的程序能夠解析命令行參數來打開多個文件。我把這個字符串: 「X:\ MyAppName.exe」「%1」 在txt文件的打開命令列表下,現在我可以右擊Windows資源管理器中的任何.txt文件並用我的應用程序。然而,當我選擇多個文件,在資源管理器中運行命令「X:\ MyAppName.exe」「%1」多次讓我的應用程序的多個實例啓動。

但是等等! 這不是最棘手的部分。相反,它是我的應用程序打開一個單一的文件,並一次打開多個文件作爲兩個不同的事情與獨立的視覺樣式。我知道一次保持一個實例運行的想法(儘管我不知道實現它的C代碼)。但是我不知道如何區分逐個打開幾個文件和同時打開多個文件。

我希望我說清楚。

+0

您有多個選項。也許最漂亮的是[說你的應用程序可以接受包含多個對象的數據對象](http://blogs.msdn.com/b/oldnewthing/archive/2010/05/03/10006065.aspx)。 –

回答

1

使用註冊表喜歡你現在是,你將不能夠將多個文件之間的直接區分單個文件。正如您已經注意到的,每個請求的文件都會啓動一個新的應用程序副本。如果你實現了單實例化(這不難做),你可以做的是檢測何時請求第一個文件並啓動一個短計時器,然後讓每個後續文件重置該計時器。當它最終消失時,請檢查您收集的文件數量並根據需要對其執行操作。

更好,和優選的,解決方案是創建,而不是在你的應用的過程外的COM對象,它實現了IDropTarget接口。 Windows將能夠通過一個入口點將文件信息匯入您的應用程序。您的應用程序無需關心信息來自何處。您不但可以同時支持多個文件,甚至可以支持不同格式的文件信息(Windows可以傳遞文件名,也可以傳遞給您實際的文件數據本身)。

Windows將構造一個單一的IDataObject對象來存放任何需要的文件信息,然後將其傳遞給您的對象。如果您的應用程序已經運行,COM將能夠訪問您現有的IDropTarget對象。如果您的應用程序尚未運行,則COM會在訪問其IDropTarget對象之前自動啓動您的應用程序。無論哪種方式,一旦它運行,您的IDropTarget可以查看傳遞給它的任何數據,並決定是接受還是拒絕。

如果您註冊COM對象的CLSIDDropTarget所需文件擴展名,用戶將能夠對這些文件雙擊或選中這些文件,然後按Enter鍵,它們將被傳遞到您的IDropTarget對象。

如果您註冊了您的應用AppPath然後註冊CLSIDDropTarget它,用戶將能夠拖動文件,無論擴展的,到你的應用程序的EXE文件本身,它們將被傳遞到您的IDropTarget目的。

如果您使用帶有RegisterDragDrop()功能相同的COM對象,用戶將可以直接拖動文件,無論擴展的,到你的應用程序的UI,他們將被傳遞到您的IDropTarget對象。

+0

謝謝。這真是一個非常好的答案!但有一件事我很困惑:你說「用戶可以雙擊這些文件,或者選擇這些文件並按回車鍵」,這會覆蓋註冊表中默認的打開命令嗎?或者我需要修改註冊表呢? – LeOpArD

+0

它不會取代它,它會增強它。您仍然必須爲文件擴展名創建一個默認動詞,以便雙擊進行操作,但您可以爲動詞指定「DropTarget」而不是「命令」(Shell還支持第三個選項用於調用DDE,但是'IDropTarget'比這個更受歡迎)。 –

相關問題