对于没有扩展名的文件,下面的代码会显示一个对话框,其中列出了可用于打开文件的应用程序。仅从Windows-8中可以看到此行为。对话框中列出的应用程序取自HKEY_LOCAL_MACHINE \ SOFTWARE \ Classes * \ OpenWithList。反正是否有抑制此对话框并获得类似于旧平台的行为?
-Karthik
SHELLEXECUTEINFO shinfo;
unsigned long mask = SEE_MASK_FLAG_NO_UI;
memset(&shinfo,0,sizeof(shinfo));
shinfo.cbSize = sizeof(shinfo);
shinfo.fMask = SEE_MASK_FLAG_DDEWAIT | mask;
shinfo.hwnd = NULL;
shinfo.lpVerb = "open";
shinfo.lpFile = prog;
shinfo.lpParameters = NULL;
shinfo.lpDirectory = 0;
shinfo.fMask = SEE_MASK_FLAG_NO_UI;
shinfo.nShow = SW_SHOWDEFAULT;
rc = ShellExecuteEx(&shinfo);
答案 0 :(得分:0)
我怀疑在没有扩展名的文件中,Windows 8上没有与open
相关联的默认操作。我在Windows 7上使用你的代码(无论如何都是Delphi版本)证实了这一点。
将shinfo.lpverb
设置为“打开”的代码运行导致ShellExecuteEx
返回FALSE
,而GetLastError
确实返回ERROR_NO_ASSOCIATION
。但是,将lpVerb
更改为NULL(在Delphi中为nil)而不是显示标准的Win7 打开方式对话框,就像您的代码在Windows 8上一样。
以下是您的测试代码的修改版本:
SHELLEXECUTEINFO shinfo;
memset(&shinfo, 0, sizeof(shinfo));
shinfo.cbSize = sizeof(shinfo);
shinfo.fMask = SEE_MASK_FLAG_DDEWAIT | SEE_MASK_FLAG_NO_UI;
shinfo.lpVerb = NULL;
shinfo.lpFile = prog;
shinfo.hwnd = NULL;
shinfo.lpParameters = NULL;
shinfo.lpDirectory = 0;
shinfo.nShow = SW_SHOWDEFAULT;
rc = ShellExecuteEx(&shinfo);
这是我用于比较的测试Delphi代码(C ++代码的完全翻译):
var
shInfo: TShellExecuteInfo;
FillChar(shInfo, SizeOf(shInfo), 0); // Same result as memset()
shInfo.cbSize := SizeOf(shInfo);
shInfo.fMask := SEE_MASK_FLAG_NO_UI or SEE_MASK_FLAG_DDEWAIT;
shInfo.Wnd := 0;
shInfo.lpVerb := nil; // Also tested with 'open'
shInfo.lpDirectory := 'D:\TempFiles'; // Path to my no-extension file
shInfo.lpFile := 'datafile'; // My test file with no ext
shInfo.nShow := SW_SHOWDEFAULT;
if not ShellExecuteEx(@shInfo) then
ShowMessage(SysErrorMessage(GetLastError)); // Readable error message
快速更改代码,将“open”替换为NULL,lpVerb
应该确认。
您还可以通过在Win8的资源管理器中右键单击没有扩展名的文件,并检查上下文菜单顶部的粗体默认操作,相当容易地确认我的怀疑。如果没有粗体选项,或者除了打开之外什么都没有,我的怀疑是正确的。