gpt4 book ai didi

c# - 我怎样才能把一个过程窗口带到前面?

转载 作者:行者123 更新时间:2023-11-30 14:32:40 26 4
gpt4 key购买 nike

我在 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, "");
}

}

这将运行Windows 7和8及其他版本自带的驱动程序验证器管理器程序。

当驱动程序验证程序管理器在窗体后面运行并且您无法将它带到前面时,问题出现在某些用户的某些 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();
}
}
}

这是程序在后台窗体后面时的样子:

enter image description here这是遇到问题的用户写的描述问题的内容:

虽然发现了一个错误,但是,同时使用 Windows 8 和 Windows 8.1,尚未使用 7 进行测试: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();
}

如果你想让它成为最顶层,使用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.

关于c# - 我怎样才能把一个过程窗口带到前面?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18071381/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com