2011-12-25 133 views
1

我有一個打開* .postfix文件的c#程序。如何在由快捷方式啓動的程序中獲取(.lnk)快捷方式文件路徑?

如果用戶運行指向我的文件類型的(.lnk)快捷方式,我的程序將打開目標。因此,我的程序如何知道它是由(.lnk)快捷方式啓動(並獲取它的文件路徑)?

在某些情況下,我需要替換.lnk文件。

謝謝!

編輯 首先,感謝那些回答我的問題的傢伙。

按照@Anders的回答,我發現我的問題在這裏。

我對Windows註冊表做了一些修改,所以瀏覽器知道要把自定義的協議字符串放到某些程序中。

一些這樣的事..

[InternetShortcut] URL = myProtocol:// ABCDEFG .....

這也許就是爲什麼我失去了lpTitle。 :(

我要試試這個方式: 每當我的程序調用時,當然用%1餵食,程序檢查當前打開的資源管理器(Window),並嘗試使用IWebBrowserApp獲取它的當前路徑。當然臺式機,掃描和分析* .LNK確定更換哪一個。

我想,這可能會工作,但不能肯定。我會盡力。 繼續

+1

我不確定這是可能的。 .LNK文件由資源管理器*打開,該信息用於產生該進程(例如CreateProcess)。我不知道如何/如何*過程(或如果一個LNK文件被參與)的信息開始可用... – 2011-12-25 02:21:24

+1

將此標籤重新標記爲winapi - 希望某些大師能夠提供更多徹底的答案。 – sq33G 2011-12-25 08:35:01

回答

3

在本機代碼中,如果STARTF_TITLEISLINKNAME位設置爲STARTUPINFO.dwFlags,則可以撥打GetStartupInfo,那麼.lnk的路徑爲STARTUPINFO.lpTitle。我不知道是否有.NET方法來獲取此信息,您可能需要P/Invoke ...

+0

這給我帶來了一點進一步。直到現在,我的輸出中沒有包含.lnk文件路徑。無論如何,我應該多做點嘗試。 – iuwei 2011-12-25 13:07:39

+0

我的快捷方式內容是[InternetShortcut] URL = myProtocol:// ......我認爲這會導致問題,lpTitle可能已被瀏覽器佔用?也許不是。仍然嘗試..謝謝你的谷歌http://www.catch22.net/tuts/undoc01 – iuwei 2011-12-25 13:44:59

+0

.LNK的使用IShellLink接口,你在談論IUniformResourceLocator,我不知道如果shell會通過你的路徑以同樣的方式... – Anders 2011-12-25 18:34:02

3

你不知道。有沒有辦法做到這一點結束的故事

+0

可以實現鉤子嗎? – iuwei 2011-12-25 02:42:22

+0

僅在用戶激活快捷方式之前運行,並且準備將答案放在磁盤以外的其他位置。 – Joshua 2011-12-25 04:07:05

+0

我有一個服務在終端上運行。我需要知道有多少種方法可以做到這一點。鉤必須是最後一個選項,我不熟悉鉤(特別是這樣做)。任何人都可以在這裏留下鏈接或適當的搜索關鍵字? THK。 – iuwei 2011-12-25 06:55:50

0

如果您使用Visual Studio安裝項目來構建安裝程序並執行文件類型關聯,則應遵循以下說明:http://www.dreamincode.net/forums/topic/58005-file-associations-in-visual-studio/

  1. 在Visual Studio中打開您的解決方案。

  2. 添加安裝項目到解決方案的文件,添加項目,新項目,安裝和部署項目,安裝項目

  3. 上安裝項目在「解決方案資源管理器」窗口中單擊鼠標右鍵,選擇視圖,然後選擇文件類型。

    你會看到在Visual studio.At顯示「文件類型」窗口中的窗口的頂部將是「目標機器上的文件類型」

  4. 「文件類型目標機上單擊鼠標右鍵「。菜單將彈出添加」文件類型「點擊此。

    您會看到「新文檔類型#1」已添加,並在其下方顯示「&open」。

  5. 你想要的「新文檔類型#1」可以是任何東西 - 它更改爲描述性的。儘管用戶從來沒有看到這一點,但絕對不要使用通用的東西 - 儘可能唯一,因爲你甚至可以在沒有意識到的情況下覆蓋當前的文件關聯。例如,你可能認爲「pngfile」可能是一個有用的名字 - 但現在使用它將所有「*。png」文件發送到您的應用程序,而不是圖像查看器。一個好的做法可能是「YourCompantName.Filetype」,其中您的公司名稱是您公司名稱的名稱,「Filetype」是描述性文字你的文件。

  6. 在你的新類型的「屬性」窗口中,您將需要更改一些屬性: 命令:切換到要run.If你點擊應用程序的」 ... 「並且你會精確地找到並使用」主要輸出...「文件 描述:這是對文件類型的描述(如果它沒有描述它是自己的」 擴展:這是你的擴展名列表分別用「,」 分隔圖標:這會將圖標與您的文件類型關聯起來,這會顯示在窗口資源管理器中。

  7. 現在我們轉到「&open」。這是一個可以在右擊文件時使用的動作。默認動作(「&Open」當前設置爲默認值)是雙擊點擊「新文檔類型#1」添加動作,但是暫時讓我們定義我們的「開放」動作

    點擊「&Open」。您會在屬性窗口中看到「Name」 「參數」,「動詞」。動詞對用戶是隱藏的,但它是存儲在註冊表中的關鍵字。將其與名稱保持一致,但沒有「&」。「參數」的默認值爲「%1」,表示傳遞完整路徑和文件名添加到您的應用程序中。如果您需要將標誌傳遞給應用程序以執行特殊任務,那麼您也可以在此添加其他內容。所有此infomaton都將通過命令行傳遞給您的應用程序,因此您需要熟悉「Environment.CommandLine」對象。

    如果您需要設置不同的動作爲默認,只需右鍵點擊動作和「設置爲默認」

基本上,你會通過的文件路徑作爲參數傳遞給你的程序。然後,如果它是一個控制檯應用程序或Windows窗體,你應該檢查的參數在Program.Main

 

static void Main(string[] args) 
{ 
    //if file association done with Arguments %1 as per forum post above 
    //you file path should be in args[0] 
    string filePath = null; 
    if(args != null && args.Length > 0) 
    filePath = args[0]; 
} 
 

對於WPF應用程序,你需要處理的是,在啓動事件爲您的應用程序

 

void App_Startup(object sender, StartupEventArgs e) 
{ 
    string filePath = null; 
    if ((e.Args != null) && (e.Args.Length > 0)) 
    { 
     filePath = e.Args[0]; 
    } 
} 
 
+0

您沒有明白我的觀點。 – iuwei 2011-12-25 03:30:51

+0

Emmanuel,這是一篇非常有幫助而且寫得很好的文章,但不幸的是,原創海報所尋找的不是什麼。他們想知道我是否創建了一個新的程序快捷方式,然後點擊該快捷方式,包含快捷方式的.lnk文件的名稱是什麼。 – 2011-12-25 03:44:05