有没有一个简单的方法来打开一个文件在Windows相关的程序? (如在Windows资源pipe理器中双击它,但自动与我的代码完成)
例如,在计算机A上,“text.txt”将在打字机中打开,但是在计算机B上,由于用户文件扩展名的分配,它将被Notepad ++打开。
我尝试了ShellExecute
ShellExecute(0, L"open", L"c:\\windows\\notepad.exe" ,L"c:\\outfile.txt" , 0 , SW_SHOW );
这工作,但如果我省略notepad.exe参数奇怪的事情发生(随机资源pipe理器显示)。
您希望使用该文件作为文件参数打开,而不是参数参数。 无需指定要使用的程序, 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中的每个文件都可以打开,而可执行文件的默认打开动作是执行它们。
如果lpFile指定一个文档文件,该标志只是传递给关联的应用程序
因此,您需要将"c:\\windows\\notepad.exe"替换为要打开的实际文件,并将lpParameters保留为空。
根据MS知识库 ,ShellExecute应该工作(我们在Delphi中一直这样做):
ShellExecute(Handle, "Open", Filename, "", "C:\", SW_SHOWNORMAL)
这里有更多的可能性:
如果你想在默认情况下使用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);
也许尝试开始,而不是打开 ?