Dan*_*est 3 c# process winforms
我在Form1中有此按钮单击代码:
private void DriverVerifier_Click(object sender, EventArgs e)
{
if (MessageBox.Show("Are you Sure you want to Launch the Driver Verifier. Click Yes to Confirm and No to continue", "WinForm", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.No)
{
}
else
{
ProcessRun.Processing(Environment.SystemDirectory, "verifier.exe", "", false, "");
}
}
Run Code Online (Sandbox Code Playgroud)
这将运行Windows 7和8及其他版本附带的驱动程序验证程序管理器程序。
当某些驱动程序验证程序管理器在Form后面运行并且您无法将其带到前面时,对于某些用户而言,问题出在某些Windows版本中。
我的问题是,是否有任何办法可以迫使这一进程摆在最前面?
这是我的类ProcessRun的代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Diagnostics;
using System.IO;
namespace Diagnostic_Tool_Blue_Screen
{
static class ProcessRun
{
public static void Processing(string WorkingDirectory, string FileName, string Arguments, bool StandardOutput, string OutputFileName)
{
Process proc = new Process();
proc.EnableRaisingEvents = true;
proc.StartInfo.UseShellExecute = false;
proc.StartInfo.RedirectStandardOutput = StandardOutput;
proc.StartInfo.FileName = FileName;
proc.StartInfo.CreateNoWindow = true;
proc.StartInfo.WorkingDirectory = WorkingDirectory;
proc.StartInfo.Arguments = Arguments;
proc.Start();
if (StandardOutput == true)
{
string output = proc.StandardOutput.ReadToEnd();
DumpOutput(WorkingDirectory + "\\" + OutputFileName, output);
}
proc.WaitForExit();
proc.Close();
}
private static void DumpOutput(string filename, string output)
{
StreamWriter w = new StreamWriter(filename);
w.Write(output);
w.Close();
}
}
}
Run Code Online (Sandbox Code Playgroud)
这是程序在后台位于窗体后面时的外观的图像:
这是有问题的用户写的描述问题的内容:
虽然发现一个错误,但同时使用Windows 8和Windows 8.1,但尚未通过7进行测试:Driver Verifier是相当无用的附加功能,因为当您单击打开时(底部的红色/棕色按钮),该工具的主窗口拒绝移动,最小化或关闭,并保持焦点,因此“驱动程序验证器”窗口仍处于工具窗口下方(请参见屏幕截图),因此无法看到。
对于较大的显示器和多个显示系统,这只是个小问题,因为可以将Driver Verifier移到一边以完全看到,但是在较小的单个显示系统上,这会使该工具中的整个Driver Verifier失效。
我认为这可能有效:
[DllImport("user32")]
private static extern bool SetForegroundWindow(IntPtr hwnd);
public static void Processing(string WorkingDirectory, string FileName, string Arguments, bool StandardOutput, string OutputFileName)
{
Process proc = new Process();
proc.EnableRaisingEvents = true;
proc.StartInfo.UseShellExecute = false;
proc.StartInfo.RedirectStandardOutput = StandardOutput;
proc.StartInfo.FileName = FileName;
proc.StartInfo.CreateNoWindow = true;
proc.StartInfo.WorkingDirectory = WorkingDirectory;
proc.StartInfo.Arguments = Arguments;
proc.Start();
//Added code
System.Threading.Thread.Sleep(500);
SetForegroundWindow(proc.MainWindowHandle);
//........................................
if (StandardOutput == true)
{
string output = proc.StandardOutput.ReadToEnd();
DumpOutput(WorkingDirectory + "\\" + OutputFileName, output);
}
proc.WaitForExit();
proc.Close();
}
Run Code Online (Sandbox Code Playgroud)
如果您想要它Topmost,请使用SetWindowPos:
[DllImport("user32")]
private static extern bool SetWindowPos(IntPtr hwnd, IntPtr hwnd2, int x, int y, int cx, int cy, int flags);
//instead of calling SetForegroundWindow
SetWindowPos(proc.MainWindowHandle, new IntPtr(-1), 0,0,0,0, 0x1 | 0x2);
//SWP_NOSIZE = 1, SWP_NOMOVE = 2 -> keep the current pos and size (ignore x,y,cx,cy).
//the second param = -1 -> set window as Topmost.
Run Code Online (Sandbox Code Playgroud)