ShellExecuteEx с SEE_MASK_FLAG_NO_UI все равно отображает сообщение - PullRequest
3 голосов
/ 08 марта 2019

В моей системе расширение .xyz вообще не зарегистрировано. Поэтому, когда я дважды щелкаю файл .xyz в проводнике, в Windows 10 появляется стандартное диалоговое окно «Как открыть этот файл», которое ожидается.

Теперь, когда я запускаю этот короткий фрагмент, отображается то же диалоговое окно, что и выше, даже если я поставил флаг SEE_MASK_FLAG_NO_UI в sei.fMask:

  SHELLEXECUTEINFO sei = { 0 };
  sei.cbSize = sizeof(SHELLEXECUTEINFO) ;
  sei.fMask = SEE_MASK_FLAG_NO_UI;
  sei.hwnd = AfxGetMainWnd()->GetSafeHwnd();
  sei.lpVerb = _T("open");
  sei.lpFile = _T("C:\\Users\\Test\\Documents\\temp\\Temp.xyz");
  sei.lpParameters = NULL;
  sei.lpDirectory = appdir;
  sei.nShow = SW_SHOW;
  ShellExecuteEx(&sei); 
  • Файл "C:\\Users\\Test\\Documents\\temp\\Temp.xyz" существует.

  • Тот же код с sei.lpFile, указывающим на существующий .txt, открывает его с блокнотом, как и ожидалось.

Документация делает вид, что сообщение об ошибке не должно отображаться с SEE_MASK_FLAG_NO_UI.

Так что я могу сделать, чтобы ShellExecuteEx не высвечивал никаких сообщений, а вместо этого возвращал код ошибки?

Я проверял это только в Windows 10, я не знаю, как себя ведут в старых версиях Windows.

1 Ответ

2 голосов
/ 08 марта 2019

Используйте FindExecutable () или AssocQueryString () перед вызовом ShellExecute (). Это позволяет проверить, существует ли ассоциация. SEE_MASK_FLAG_NO_UI предотвращает отображение ошибок, однако эта ситуация не рассматривается как ошибка.

...