【发布时间】:2018-01-09 10:19:00
【问题描述】:
我正在用 C# 编写一个工具箱程序,它的一个功能是模拟 Windows 开始菜单的“运行”对话框,而且还允许用户在需要时提升权限。
为此,我有一个简单的 WinForm,其中包含一个文本框(用户在其中键入)和一个复选框(如果选中,则添加“runas”动词)。当然还有 3 个按钮:确定、取消和浏览(打开文件对话框)。所以我的代码看起来像这样:
var psi = new ProcessStartInfo(textBox1.Text, "");
psi.CreateNoWindow = true;
psi.UseShellExecute = true;
if (checkBox1.Checked == true)
{
psi.Verb = "runas";
}
try
{
Process.Start(psi);
}
catch (System.ComponentModel.Win32Exception ex)
{
// do something
MessageBox.Show("Error : " + ex.Message);
}
如果用户键入“notepad”或“notepad.exe”或“c:\whatever\path\notepad”,它就可以工作。传递参数时开始出现问题:“notepad test.txt”不起作用。
我的第一个想法是在遇到空格时拆分 textBox1.Text,然后将第一部分用于 ProcessStartInfo.Filename,将第二部分用于 Arguments。 “notepad test.txt”就可以了。但是如果用户使用文件对话框来选择路径和/或文件名包含空格(或键入它)的文件,那么字符串当然会被拆分,一切都会出错。
不幸的是,ParseStartInfo 需要文件名和参数(可以是空字符串),但文件名不能包含参数......使用引号(整个 textBox1.Text 作为文件名)也不起作用。
那么,有没有人有解决方案:
- 将 textBox1.Text 正确拆分为有效的文件名 + 参数, 就像 Windows 的“开始 - 运行”对话框一样
或
- 也许使用 Shell32.FileRun() 但在这种情况下,如何请求 随意提升(UAC 提示)?
编辑:添加 MessageBox.Show 以显示错误消息
【问题讨论】:
-
使用2个文本框怎么样?
-
当然会有所帮助,但我的目标是完全按照 Windows 开始/运行对话框的工作方式工作(用户已经习惯了)...
-
如果你让用户浏览你可以很确定不会有参数?=!我对吗?之后直接从对话框中获取文件名 ?=!所以在这种情况下,只有在使用文本框时才需要拆分。还是将对话框文件名写入文本框?
-
@Mong Zhu 用户浏览后仍然可以编辑 textBox1.Text 并添加参数,所以我不会依赖这个...
标签: c# winforms uac processstartinfo