即使以管理员身份运行visual studio,请求的操作也需要提升

时间:2017-12-18 11:41:13

标签: c# .net winforms

我正在尝试从我的winform应用程序运行并调整OSK大小,但是我收到了这个错误:

  

请求的操作需要提升。

我以管理员身份运行visual studio。

System.Diagnostics.Process process = new System.Diagnostics.Process();
process.StartInfo.UseShellExecute = false;
process.StartInfo.RedirectStandardOutput = true;
process.StartInfo.RedirectStandardError = true;
process.StartInfo.CreateNoWindow = true;
process.StartInfo.FileName = "c:\\windows\\system32\\osk.exe";
process.StartInfo.Arguments = "";
process.StartInfo.WorkingDirectory = "c:\\";

process.Start(); // **ERROR HERE**
process.WaitForInputIdle();
SetWindowPos(process.MainWindowHandle,
this.Handle, // Parent Window
this.Left, // Keypad Position X
this.Top + 20, // Keypad Position Y
panelButtons.Width, // Keypad Width
panelButtons.Height, // Keypad Height
SWP_SHOWWINDOW | SWP_NOZORDER); // Show Window and Place on Top
SetForegroundWindow(process.MainWindowHandle);

然而,

System.Diagnostics.Process.Start("osk.exe"); 

工作得很好,但它不会让我调整键盘的大小

1 个答案:

答案 0 :(得分:1)

process.StartInfo.UseShellExecute = false会禁止你做你想做的事。 osk.exe有点特殊,因为一次只能运行一个实例。所以你必须让操作系统处理启动(UseShellExecute必须为真)。

  

(...)工作得很好,但它不会让我调整键盘的大小

确保process.MainWindowHandle不是IntPtr.Zero。虽然可能需要一段时间,但您不允许使用process.WaitForInputIdle()询问流程实例,可能是因为操作系统是由操作系统运行的。您可以轮询句柄,然后运行您的代码。像这样:

System.Diagnostics.Process process = new System.Diagnostics.Process();
// process.StartInfo.UseShellExecute = false;
// process.StartInfo.RedirectStandardOutput = true;
// process.StartInfo.RedirectStandardError = true;
process.StartInfo.CreateNoWindow = true;
process.StartInfo.FileName = "c:\\windows\\system32\\osk.exe";
process.StartInfo.Arguments = "";
process.StartInfo.WorkingDirectory = "c:\\";

process.Start(); // **ERROR WAS HERE**
//process.WaitForInputIdle();

//Wait for handle to become available
while(process.MainWindowHandle == IntPtr.Zero)
    Task.Delay(10).Wait();

SetWindowPos(process.MainWindowHandle,
this.Handle, // Parent Window
this.Left, // Keypad Position X
this.Top + 20, // Keypad Position Y
panelButtons.Width, // Keypad Width
panelButtons.Height, // Keypad Height
SWP_SHOWWINDOW | SWP_NOZORDER); // Show Window and Place on Top
SetForegroundWindow(process.MainWindowHandle);

适当注意:使用Wait()(或Thread.Sleep);应该在WinForms中非常有限,它会使ui线程无响应。您可能应该在此使用Task.Run(async () => ...,以便能够使用await Task.Delay(10),但这是一个不同的故事并使代码稍微复杂化。