2012-02-21 27 views
1

我已經寫了一個Windows軟件,我已經將這個程序與文件擴展名關聯起來。當我雙擊一個數據文件時,我的程序啓動並打開文件。到目前爲止它的工作。但是,當我選擇多個文件,然後單擊上下文菜單中的「打開」,然後啓動我的程序的多個實例,一個文件的一個實例。我希望Windows用我的程序的單個實例打開所有文件。這可能沒有在我的程序中實現一個實例處理程序?如何將多個關聯文件傳遞給程序?

目前在註冊表中MyFileType/shell/open/command看起來是這樣的:

"C:\Program Files\MyApp\MyApp.exe" "%1" 

也許有一些特殊的記號/變我必須使用,而不是「%1」得到它的工作?在Linux上,我必須使用%f作爲單個文件,使用%F作爲文件列表。 Windows上有類似的東西嗎?

回答

3

最簡單的方法是將您的應用程序與文件類型的默認shell動詞相關聯(例如「打開」或「播放」),並實現使用SHCreateShellItemArrayFromDataObject獲取選定文件的放置目標。推薦閱讀:How the Shell Invokes Verbs

如果您不喜歡接管默認動詞,您可以將動詞添加到文件關聯的open with list

另一種方法是使您的應用程序成爲單例,並通過進程間通信方法(如DDE或RPC)將文檔路徑發送到第一個實例。這要求你保持主窗口的響應(例如,如果你正在顯示一個對話框將不起作用)

+0

(在這些評論中沒有足夠的空間,所以我把它分成三部分):第一段:不要'得到它。對不起,我不是Windows開發人員。我的應用程序是平臺無關的,並用Java編寫。它只是一個EXE文件,它打開所有指定爲命令行參數的文件。不知道SHCreateShellItemArrayFromDataObjet是什麼,以及我如何在Java中做到這一點。據我所知,我已經使用了一個默認的shell動詞(在這種情況下爲「open」)。 – kayahr 2012-02-22 07:54:26

+0

第二段:我試過這個OpenWithList,但它不起作用,文檔說這是用於爲同一文件類型註冊多個應用程序。這不是我需要的。我已經將我的應用程序與文件類型關聯起來了。當我一次打開一個文件列表時,我不想讓Windows多次打開我的應用程序。 – kayahr 2012-02-22 07:55:39

+0

第三段:在我寫的問題中,我想避免這種麻煩,但如果Windows真的無法將一個文件列表傳遞給一個程序,那麼我必須這樣做。 – kayahr 2012-02-22 07:56:46

0

*可能是你要找的。

+0

試過了。不起作用。它是空的。當我使用「%*」(帶引號)時,程序嘗試打開一個空文件名的文件。 – kayahr 2012-02-22 07:23:59