如何在';配置';带ShellExecute的模式?操作系统覆盖我的ShellExecute调用

如何在';配置';带ShellExecute的模式?操作系统覆盖我的ShellExecute调用,shell,delphi,command-line,shellexecute,screensaver,Shell,Delphi,Command Line,Shellexecute,Screensaver,我想用ShellExec在“配置”模式下运行屏幕保护程序。我使用这个(Delphi)调用: 但是,SCR文件接收到的参数是'/S',因此道路上的某个地方Windows会截获我的呼叫,并将我的参数替换为'/S' 更新 我做了一个实验: 我构建了一个显示参数的应用程序(mytest.exe)。我以/c作为参数启动了mytest.exe。正确接收/c参数。 然后我将mytest.exe重命名为mytest.scr。现在,发送的参数被操作系统覆盖。收到的参数现在是'/S' 有趣 脏补丁:执行一个CMD

我想用ShellExec在“配置”模式下运行屏幕保护程序。我使用这个(Delphi)调用:

但是,SCR文件接收到的参数是'/S',因此道路上的某个地方Windows会截获我的呼叫,并将我的参数替换为'/S'


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

有趣


脏补丁:执行一个CMD文件,在/c模式下执行屏幕保护程序工作

如果查看注册表,您将看到
.SCR
文件扩展名的
open
动词已注册,默认情况下使用
/S
参数调用文件:

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

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

根据文档,不带任何参数运行
.scr
文件与带
/c
参数运行文件类似,只是不带前台模式:


这是启动流程的错误方式。正确的函数是CreateProcessYes。我知道。(ShellExecuteEx也是比ShellExecute更好的选项)。但我现在需要一种快速(所以,肮脏也是可以接受的)方法来解决这个问题(我在ShellExecute周围建立了一个完整的生态系统)或者你认为调用CreateProcess可以解决这个问题?无论如何,我会在未来的日子里用CreateProcess替换ShellExecute。CreateProcess始终是启动可执行文件的方法。你应该一直这样做。“别让贝壳把你压垮了。”戴维谢弗南——你必须承认它的美丽。ShellExecute可以运行*.lnk文件和其他coll文件,如“mailto:”:)使用正确的工具执行作业。ShellExecute永远都不是正确的工具。有时ShellExecuteEx是。就像你的例子一样。要创建流程,请使用CreateProcess。
 i:= ShellExecute(0, 'open', PChar('c:\temp\test.scr'), PChar('/c'), NIL, SW_SHOWNORMAL)
ShellExecute(0, 'config', PChar('c:\temp\test.scr'), nil, nil, SW_SHOWNORMAL);
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.
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;