我想使用ShellExec在“配置”模式下运行屏幕保护程序。我用这个(德尔福)电话:

 i:= ShellExecute(0, 'open', PChar('c:\temp\test.scr'), PChar('/c'), NIL, SW_SHOWNORMAL)


但是,SCR文件接收到的参数是“ / S”,因此Windows在旅途中的某个地方拦截了我的呼叫,并将我的参数替换为“ / S”。



更新资料
我做了一个实验:
我构建了一个显示参数的应用程序(mytest.exe)。我以/ c作为参数启动了mytest.exe。 / c参数正确接收。
然后,我将mytest.exe重命名为mytest.scr。现在,发送的参数已被操作系统覆盖。现在,接收到的参数为“ / S”。

有趣!

肮脏的修复:执行在/ c模式下执行屏幕保护程序的CMD文件有效!

最佳答案

如果您在注册表中查看,则会看到open文件扩展名的.SCR动词已默认注册为使用/S参数调用该文件:

shell - 如何使用ShellExecute在“配置”模式下运行屏幕保护程序?操作系统覆盖了我的ShellExecute调用-LMLPHP

因此,您的/c参数将被忽略。

如果要调用.scr文件的配置屏幕,请使用config动词而不是open

shell - 如何使用ShellExecute在“配置”模式下运行屏幕保护程序?操作系统覆盖了我的ShellExecute调用-LMLPHP

ShellExecute(0, 'config', PChar('c:\temp\test.scr'), nil, nil, SW_SHOWNORMAL);


根据文档,运行没有任何参数的.scr文件类似于使用/c参数运行文件,只是没有前台模式:

INFO: Screen Saver Command Line Arguments

   ScreenSaver           - Show the Settings dialog box.
   ScreenSaver /c        - Show the Settings dialog box, modal to the
                           foreground window.
   ScreenSaver /p <HWND> - Preview Screen Saver as child of window <HWND>.
   ScreenSaver /s        - Run the Screen Saver.

Otherwise, run the .scr file with CreateProcess() instead of ShellExecute() so you can specify the /c parameter directly:

var
  Cmd: string;
  SI: TStartupInfo;
  PI: TProcessInformation;
begin
  Cmd := 'c:\temp\test.scr /c';
  UniqueString(Cmd);

  ZeroMemory(@SI, SizeOf(SI));
  SI.cb := SizeOf(SI);
  SI.dwFlags := STARTF_USESHOWWINDOW;
  SI.wShowWindow := SW_SHOWNORMAL;

  if CreateProcess(nil, PChar(Cmd), nil, nil, False, 0, nil, nil, SI, PI) then
  begin
    CloseHandle(PI.hThread);
    CloseHandle(PI.hProcess);
  end;
end;

关于shell - 如何使用ShellExecute在“配置”模式下运行屏幕保护程序?操作系统覆盖了我的ShellExecute调用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46672282/

10-11 19:06