簡體   English   中英

如何使用與其文件擴展名相關聯的程序打開文件?

[英]How can you open a file with the program associated with its file extension?

有一種簡單的方法可以通過Windows中的相關程序打開文件嗎? (比如在Windows資源管理器中雙擊它,但使用我的代碼自動完成)

例如,在計算機A上,“text.txt”將在wordpad中打開,但在計算機B上,它將由Notepad ++打開,因為用戶文件擴展名分配。

我試過ShellExecute

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

這有效,但如果我省略notepad.exe參數奇怪的事情發生(顯示隨機瀏覽器)。

您希望使用該文件作為文件參數打開,而不是參數參數。 無需指定要使用的程序, ShellExecute將為您查找。

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

通過將動詞保留為NULL(0)而不是L"open" ,您將獲得文件類型的真正默認操作 - 通常這是open但不總是。

請參閱啟動應用程序

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

在Windows上,一個好的內存鈎子就是想到shell可以執行的所有數據文件。 您也可以在命令框中嘗試它,您只需鍵入文件名,它就會被打開。 或者,反過來說,Windows中的每個文件都可以打開,可執行文件的默認打開操作就是執行它們。

這里有一點點可能性:

如果你想打開 - 例如 - 文件默認情況下用Notepad ++(如果已安裝),你可以掃描它的注冊表項(如果它存在)和它在哪里(通常是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);

根據MS知識庫 ,ShellExecute應該可以工作(我們一直在Delphi中這樣做):

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

如果lpFile指定文檔文件,則該標志將簡單地傳遞給關聯的應用程序

因此,您需要將"c:\\\\windows\\\\notepad.exe"替換為要打開的實際文件,並將lpParameters保留為null。

也許試試開始而不是開放

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM