我想使用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
参数调用该文件:
因此,您的/c
参数将被忽略。
如果要调用.scr
文件的配置屏幕,请使用config
动词而不是open
:
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/