是否有一种简单的方法可以通过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参数,就会发生奇怪的事情(显示随机资源管理器)。
答案 0 :(得分:25)
您希望使用该文件作为文件参数打开,而不是参数参数。无需指定使用哪个程序,ShellExecute
将为您查找。
ShellExecute(0, 0, L"c:\\outfile.txt", 0, 0 , SW_SHOW );
通过将动词保留为NULL(0)而不是L"open"
,您可以获得文件类型的真正默认操作 - 通常这是open
,但并非总是如此。
答案 1 :(得分:3)
ShellExecute(NULL, "open", L"c:\\outfile.txt", NULL, NULL, SW_SHOW);
在Windows上,一个好的内存钩子就是想到shell可以执行的所有数据文件。您也可以在命令框中尝试它,您只需键入文件名,它就会被打开。或者,反过来说,Windows中的每个文件都可以打开,可执行文件的默认打开操作就是执行它们。
答案 2 :(得分:2)
根据MS Knowledge Base,ShellExecute应该可以工作(我们一直在Delphi中这样做):
ShellExecute(Handle, "Open", Filename, "", "C:\", SW_SHOWNORMAL)
答案 3 :(得分:2)
这里有更多可能性:
如果你想打开 - 例如 - 文件默认使用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);
如果您希望用户能够更改默认程序或选择他/她想要使用的程序,您可以打开&#34;打开&#34;对话框。
//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);
答案 4 :(得分:1)
如果lpFile指定了一个文档文件,那么该标志就会被传递给 相关申请
因此,您需要将"c:\\windows\\notepad.exe"
替换为您要打开的实际文件,并将lpParameters
保留为空。
答案 5 :(得分:0)
也许尝试开始而不是开启?