Process.Start(ProcessStartInfo) 不会将命令行发送到屏幕保护程序(.scr 文件)
Process.Start(ProcessStartInfo) doesn't send command line to screensavers (.scr files)
我目前正在编写一个应用程序以在 Windows 10 上启动屏幕保护程序并显示屏幕而不是黑色背景。这样 Bubbles 和亲戚就可以像旧 OS 版本一样行动了。
这是我的完整代码:
using Microsoft.Win32;
using System;
using System.Diagnostics;
using System.IO;
using System.Windows.Forms;
public class DrawOverMyScreen {
public static void Main(string[] CommandLine) {
switch (CommandLine[0]) {
case "/c":
DialogResult Answer = MessageBox.Show("What do you want to do?\n\n - Press \"Yes\" to configure the screensaver\n - Press \"No\" to change the screensaver\n - Press \"Cancel\" to do nothing", "DrawOverMyScreen Configuration", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question, MessageBoxDefaultButton.Button3);
switch (Answer) {
case DialogResult.Yes:
Screensaver("/c");
break;
case DialogResult.No:
throw new NotImplementedException();
break;
default:
break;
}
break;
default:
Screensaver("/s");
break;
}
}
public static void Screensaver(string CommandLine) {
RegistryKey Settings = Registry.CurrentUser.OpenSubKey(@"SOFTWARE\DrawOverMyScreen");
if (Settings != null) {
string ScreensaverLocation = Settings.GetValue("Screensaver", string.Empty).ToString();
if (!string.IsNullOrEmpty(ScreensaverLocation) && File.Exists(ScreensaverLocation)) {
Process Screensaver = Process.Start(new ProcessStartInfo(ScreensaverLocation, CommandLine));
Screensaver.WaitForExit();
}
}
}
}
注意 Screensaver
方法。它使用 Process.Start(new ProcessStartInfo(ScreensaverLocation, CommandLine));
来启动屏幕保护程序。但是每当我对屏幕保护程序的配置实用程序执行 Screensaver("/c");
到 运行 时,我只会得到正常的屏幕保护程序视图(在一定时间后闲置时得到的视图)。像这样使用 运行 提示符: C:\Windows\SysWOW64\SCREEN~1.SCR /c
也会给出相同的结果,但命令行提示符实际上会打开配置实用程序。
为什么它不起作用,我怎样才能让它起作用?
仅根据您提供的内容,我无法告诉您为什么它不起作用。我没有屏幕保护程序来测试它(据我所知)。但是我可以用记事本打开一个文本文件来完成所有这四个操作:
单独的 ProcessStartInfo
ProcessStartInfo procInfo = new ProcessStartInfo("notepad.exe", "c:\test.txt");
Process proc = Process.Start(procInfo);
proc.WaitForExit();
将 ProcessStartInfo 与属性分开
ProcessStartInfo procInfo = new ProcessStartInfo();
procInfo.Arguments = "c:\test.txt";
procInfo.FileName = "notepad.exe";
Process proc = Process.Start(procInfo);
proc.WaitForExit();
内联 ProcessStartInfo
Process proc = Process.Start(new ProcessStartInfo("notepad.exe", "c:\test.txt"));
proc.WaitForExit();
无 PSI,仅处理
Process proc = Process.Start("notepad.exe", "c:\test.txt");
proc.WaitForExit();
您可能想要使用第一个,这样您就可以在 "Process proc..." 行上设置断点并检查 procInfo
的属性。 Arguments
属性 应该显示第二个值(在我的例子中,c:\test.txt
),FileName
属性 应该是你正在执行的路径(我的是 notepad.exe
).
编辑:我添加了单独的属性,这样您就可以真正看到明确的设置。
配置屏保
我已经制作了一个使用 3D 文本屏幕保护程序的示例:
string scrPath = @"C:\Windows\System32\ssText3d.scr";
ProcessStartInfo procInfo = new ProcessStartInfo();
procInfo.FileName = scrPath;
procInfo.Verb = "config";
procInfo.UseShellExecute = false;
Process proc = Process.Start(procInfo);
proc.WaitForExit();
我没有使用 Arguments
。相反,我使用了 Verb
。这需要将 UseShellExecute
设置为 false
。我得到了预期的配置对话框而不是屏幕保护程序 运行。
关于动词的更多信息
这是屏幕保护程序的动词。
您还可以定义自定义动词:Register an Application to Handle Arbitrary File Types
我目前正在编写一个应用程序以在 Windows 10 上启动屏幕保护程序并显示屏幕而不是黑色背景。这样 Bubbles 和亲戚就可以像旧 OS 版本一样行动了。
这是我的完整代码:
using Microsoft.Win32;
using System;
using System.Diagnostics;
using System.IO;
using System.Windows.Forms;
public class DrawOverMyScreen {
public static void Main(string[] CommandLine) {
switch (CommandLine[0]) {
case "/c":
DialogResult Answer = MessageBox.Show("What do you want to do?\n\n - Press \"Yes\" to configure the screensaver\n - Press \"No\" to change the screensaver\n - Press \"Cancel\" to do nothing", "DrawOverMyScreen Configuration", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question, MessageBoxDefaultButton.Button3);
switch (Answer) {
case DialogResult.Yes:
Screensaver("/c");
break;
case DialogResult.No:
throw new NotImplementedException();
break;
default:
break;
}
break;
default:
Screensaver("/s");
break;
}
}
public static void Screensaver(string CommandLine) {
RegistryKey Settings = Registry.CurrentUser.OpenSubKey(@"SOFTWARE\DrawOverMyScreen");
if (Settings != null) {
string ScreensaverLocation = Settings.GetValue("Screensaver", string.Empty).ToString();
if (!string.IsNullOrEmpty(ScreensaverLocation) && File.Exists(ScreensaverLocation)) {
Process Screensaver = Process.Start(new ProcessStartInfo(ScreensaverLocation, CommandLine));
Screensaver.WaitForExit();
}
}
}
}
注意 Screensaver
方法。它使用 Process.Start(new ProcessStartInfo(ScreensaverLocation, CommandLine));
来启动屏幕保护程序。但是每当我对屏幕保护程序的配置实用程序执行 Screensaver("/c");
到 运行 时,我只会得到正常的屏幕保护程序视图(在一定时间后闲置时得到的视图)。像这样使用 运行 提示符: C:\Windows\SysWOW64\SCREEN~1.SCR /c
也会给出相同的结果,但命令行提示符实际上会打开配置实用程序。
为什么它不起作用,我怎样才能让它起作用?
仅根据您提供的内容,我无法告诉您为什么它不起作用。我没有屏幕保护程序来测试它(据我所知)。但是我可以用记事本打开一个文本文件来完成所有这四个操作:
单独的 ProcessStartInfo
ProcessStartInfo procInfo = new ProcessStartInfo("notepad.exe", "c:\test.txt");
Process proc = Process.Start(procInfo);
proc.WaitForExit();
将 ProcessStartInfo 与属性分开
ProcessStartInfo procInfo = new ProcessStartInfo();
procInfo.Arguments = "c:\test.txt";
procInfo.FileName = "notepad.exe";
Process proc = Process.Start(procInfo);
proc.WaitForExit();
内联 ProcessStartInfo
Process proc = Process.Start(new ProcessStartInfo("notepad.exe", "c:\test.txt"));
proc.WaitForExit();
无 PSI,仅处理
Process proc = Process.Start("notepad.exe", "c:\test.txt");
proc.WaitForExit();
您可能想要使用第一个,这样您就可以在 "Process proc..." 行上设置断点并检查 procInfo
的属性。 Arguments
属性 应该显示第二个值(在我的例子中,c:\test.txt
),FileName
属性 应该是你正在执行的路径(我的是 notepad.exe
).
编辑:我添加了单独的属性,这样您就可以真正看到明确的设置。
配置屏保
我已经制作了一个使用 3D 文本屏幕保护程序的示例:
string scrPath = @"C:\Windows\System32\ssText3d.scr";
ProcessStartInfo procInfo = new ProcessStartInfo();
procInfo.FileName = scrPath;
procInfo.Verb = "config";
procInfo.UseShellExecute = false;
Process proc = Process.Start(procInfo);
proc.WaitForExit();
我没有使用 Arguments
。相反,我使用了 Verb
。这需要将 UseShellExecute
设置为 false
。我得到了预期的配置对话框而不是屏幕保护程序 运行。
关于动词的更多信息
这是屏幕保护程序的动词。
您还可以定义自定义动词:Register an Application to Handle Arbitrary File Types