2012-02-02 72 views
13

有沒有一種簡單的方法可以在Windows中通過關聯程序打開文件? (如雙擊它在Windows資源管理器,但我的代碼自動完成)如何使用與其文件擴展名關聯的程序打開某個文件?

例如,在計算機A「的text.txt」將在寫字板打開,但在計算機B上,將通過記事本中打開++因爲用戶文件擴展名分配。

我試過的ShellExecute

ShellExecute(0, L"open", L"c:\\windows\\notepad.exe" ,L"c:\\outfile.txt" , 0 , SW_SHOW); 

其作品,但如果我忽略的notepad.exe參數奇怪的事情發生(如圖隨機瀏覽器)。

+0

如果你已經得到它的工作,有什麼問題嗎? – 2012-02-02 16:14:09

回答

19

您要使用的文件打開的文件的說法,而不是參數變量。無需指定要使用的程序,ShellExecute將爲您查找。

ShellExecute(0, 0, L"c:\\outfile.txt", 0, 0 , SW_SHOW); 

通過讓動詞爲NULL(0),而不是L"open",你得到的文件類型的默認真正的行動 - 通常這是open但並非總是如此。

+0

我一定很累,謝謝你做到了! – Valmond 2012-02-03 08:43:42

+0

只是一個例子:mspaint,不能用「打開」 – 2016-10-21 08:22:38

2

Launching Applications

ShellExecute(NULL, "open", L"c:\\outfile.txt", NULL, NULL, SW_SHOW); 

在Windows上,一個美好的回憶勾是認爲所有的數據文件是由shell執行的。你也可以在一個命令框中進行試驗,你只需輸入一個文件名,它就會被打開。或者,相反,Windows中的每個文件都可以打開,並且可執行文件的默認開啓動作是執行它們。

0

也許試試開始而不是開放

+1

'open'是Explorer雙擊文件時默認使用的動詞。您可以保留參數NULL以使用文件類型的實際默認值。 – 2012-02-02 16:12:08

1

如果lpFile指定一個文檔文件,該標誌被簡單地傳遞到 相關的應用程序

所以,你需要替換"c:\\windows\\notepad.exe"與要打開,離開lpParameters空的實際文件。

1

按照MS Knowledge Base,ShellExecute的應該工作(我們這樣做是在Delphi中所有的時間):

ShellExecute(Handle, "Open", Filename, "", "C:\", SW_SHOWNORMAL) 
1

多一點的可能性在這裏:

如果你想打開 - 例如 - 在默認情況下,用記事本++(如果已安裝),你可以掃描它的文件的註冊表項,如果它存在,它在哪裏,(通常HKLM\SOFTWARE\Wow6432Node\Notepad++ [測試Win7])然後採取該路徑並打開它。

std::wstring file = L"C:\\Outfile.txt";

if (NotepadPlusPlusExists()) //Open with Notepad++ or use an other program... (maybe your own ?) 
{ 
    std::wstring wsNPPPath = GetNotepadPlusPlusPath(); 
    ShellExecuteW(HWND, L"open", wsNPPPath.c_str(), file.c_str(), NULL, SW_NORMAL); 
} 
else //Open with default associated program <--- 
    ShellExecuteW(HWND, NULL, file.c_str(), NULL, NULL, SW_NORMAL); 

如果你希望用戶能夠更改默認程序,或者選擇他/她想要使用一個程序,你可以打開對話框中的「打開方式」。

//std::wstring StringArgsW(const wchar_t *format, ...); 
std::wstring wsCmdOpenWith = StringArgsW(L"C:\\Windows\\system32\\shell32.dll,OpenAs_RunDLL \"%s\"", file.c_str()); 
ShellExecuteW(HWND, L"open", L"C:\\Windows\\system32\\rundll32.exe", wsCmdOpenWith.c_str(), NULL, SW_NORMAL); 

您也可以在資源管理器中打開該文件。

std::wstring wsCmdExplorer = StringArgsW(L"/select,\"%s\"", file.c_str()); 
ShellExecuteW(HWND, L"open", L"explorer.exe", wsCmdExplorer.c_str(), NULL, SW_NORMAL);