C# 如何使用Win32 API在WinForm前显示System.Diagnostics

C# 如何使用Win32 API在WinForm前显示System.Diagnostics,c#,winforms,process,win32gui,C#,Winforms,Process,Win32gui,在我的主窗体上有一个ListView,它在LargeIcon视图中包含属于我们的软件套件的进程列表。每个LV(ListView)项都包含文本和图像,这与我们的软件产品在各自应用程序(即MarinaOffice、LaunchOffice、PureRental等)中的图标相同。有一个计时器,它根据process.GetProcesses()方法调用中是否找到该进程来更新列表。当用户单击正在运行的进程的ListView项时,它应该最大化并在当前进程前面显示该进程(即WinForms应用程序)的窗口。下

在我的主窗体上有一个ListView,它在LargeIcon视图中包含属于我们的软件套件的进程列表。每个LV(ListView)项都包含文本和图像,这与我们的软件产品在各自应用程序(即MarinaOffice、LaunchOffice、PureRental等)中的图标相同。有一个计时器,它根据process.GetProcesses()方法调用中是否找到该进程来更新列表。当用户单击正在运行的进程的ListView项时,它应该最大化并在当前进程前面显示该进程(即WinForms应用程序)的窗口。下面的代码几乎完成了我想要完成的任务,但是,在我想要显示的应用程序已经最大化的情况下,在监视器上的windows应用程序后面,它不会将我正在显示的进程放在我的应用程序前面。换句话说,只要我使用下面的WIN32方法显示的应用程序最小化,它就可以工作。但是,它已经最大化了,它没有

// Used to Show Other Process Windows
private const int SW_SHOWMAXIMIZED = 3;
[DllImport("user32.dll")]
static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);    

// Method that checks for running apps in our suite every 3000ms
private void timerRunningApps_Tick(object sender, EventArgs e)
{
    CheckRunningapps();
}

// Stripped down version of method that looks for running process in our suite and 
// adds the process name and icon to a ListView on our main form
private void CheckRunningapps()
{
    List<Process> AllProcesses = System.Diagnostics.Process.GetProcesses().ToList();

    listViewRunningApps.BeginUpdate();
    listViewRunningApps.Items.Clear();

    foreach (Process process in AllProcesses)
    {
        ListViewItem lvi = new ListViewItem();
        if (process.ProcessName.ToLower().Contains("marinaoffice"))
        {
            lvi = new ListViewItem("MarinaOffice");
            lvi.SubItems.Add("MarinaOffice");
            lvi.ImageIndex = 1;
            lvi.Tag = process;
            listViewRunningApps.Items.Add(lvi);
        }
    }

    listViewRunningApps.EndUpdate();
}

// Method that actually shows the process.  This works as long as process is minimized
// However, if the process is maximized but, merely behind the current window it does
// not bring it in front.  I have noticed that there is a ShowWindowAsync method.
// Should I use that instead?
private void listViewRunningApps_MouseDoubleClick(object sender, MouseEventArgs e)
{
    ListViewItem lvi = listViewRunningApps.GetItemAt(e.X, e.Y);
    if (lvi != null)
    {
        Process process = (Process)lvi.Tag;
        ShowWindow(process.MainWindowHandle, SW_SHOWMAXIMIZED);
    }
}
//用于显示其他进程窗口
私有常量int SW_showmized=3;
[DllImport(“user32.dll”)]
静态外部布尔显示窗口(IntPtr hWnd、int nCmdShow);
//方法,每3000毫秒检查一次套件中正在运行的应用程序
私有void timerRunningApps_Tick(对象发送方,事件参数e)
{
CheckRunningapps();
}
//在我们的套件中查找正在运行的进程的方法的精简版本,以及
//将进程名称和图标添加到主窗体的ListView中
私有void CheckRunningapps()
{
列出所有进程=System.Diagnostics.Process.GetProcesses().ToList();
listViewRunningApps.BeginUpdate();
listViewRunningApps.Items.Clear();
foreach(所有流程中的流程)
{
ListViewItem lvi=新建ListViewItem();
if(process.ProcessName.ToLower().Contains(“Office”))
{
lvi=新的ListViewItem(“办公室”);
lvi.子项。添加(“办公室”);
lvi.ImageIndex=1;
标签=过程;
listViewRunningApps.Items.Add(lvi);
}
}
listViewRunningApps.EndUpdate();
}
//方法来实际显示该过程。只要过程最小化,这种方法就有效
//但是,如果流程被最大化,但仅在当前窗口之后,它就实现了最大化
//不要把它放在前面。我注意到有一个ShowWindowAsync方法。
//我应该用它来代替吗?
private void listViewRunningApps\u MouseDoubleClick(对象发送方,MouseEventArgs e)
{
ListViewItem lvi=listViewRunningApps.GetItemAt(e.X,e.Y);
如果(lvi!=null)
{
进程=(进程)lvi.Tag;
ShowWindow(process.MainWindowHandle,SW_SHOWMAXIMIZED);
}
}

尝试类似的方法,我认为现在的情况是,如果窗口已经最大化,则不会使用ShowWindow调用更改窗口状态。在这种情况下,还需要使用该方法将其置于Z顺序的前面


你试过了吗?我刚试过用BringWindowToTop(process.MainWindowHandle)替换ShowWindow(process.MainWindowHandle,SW_SHOWMAXIMIZED),它会使屏幕闪烁,但什么也没发生。我所做的只是为BringWindowToTop导入DLL和extern函数。这对我来说是新的,所以我需要做一些不同的事情吗?不要替换它。在ShowWindow之后添加它。明白了,我现在就试试……你就是那个人。那很有效!如果您键入一个快速的答案,我一定会接受并投票,这样您就可以获得信用。再次感谢,这完全符合我的要求!
Process process = (Process)lvi.Tag; 
ShowWindow(process.MainWindowHandle, SW_SHOWMAXIMIZED);
BringWindowToTop(process.MainWindowHandle);