c#显示进程的隐藏窗口

本文关键字:隐藏 窗口 进程 显示 | 更新日期: 2023-09-27 18:18:32

在我的应用程序中有一个选项来隐藏窗口- form.hide(),并在系统托盘中放置一个通知图标,当你点击通知图标时,会有一个form.show()。

如果有人试图运行两个实例的应用程序,我想A.不运行新实例B.显示第一个实例的窗口

我已经有一个循环来检查是否存在具有相同名称的进程。我可以告诉新的应用程序不运行(返回在program.cs之前Application.run(new form()))

但是我必须告诉第一个应用程序显示它的主窗口。

我有进程(第一个实例),我可以得到它的句柄,它的id等。

这个问题如何显示窗口使用它的进程?

c#显示进程的隐藏窗口

对于问题的第一部分,您可以这样做。在显示表单之前将其添加到Main中。这样做的好处是,您不需要根据进程名(可能不是唯一的)进行检查,而是创建了一个"全局"互斥锁。

using (Mutex applicationMutex = new Mutex(true, "SomeRandomTextHere", out mutexCreated))
{
    if (!mutexCreated)
    {
        // Application is already running. Aborting..
        return;
    }
    // Application.Run(..)  goes here, plus other interesting stuff
}

对于你问题的第二部分,我建议如下:

  • 创建一个命名事件,并将其初始值设置为false。然后在应用程序中创建一个监视此事件的工作线程。当它发出信号时,从主窗体调用Show方法。
  • 另一种方法是搜索主进程的窗口句柄并将其放在前面。这篇文章可以给你一些想法。

请记住,在所有进程中执行循环不如使用互斥锁有效。如果你不关心速度,干净的代码,你只是想让这个应用程序工作,那么使用这个循环。对我来说,代码就是诗歌。

为您重写了代码,这将完全满足您的需求。它将检查副本,并在打开副本时聚焦屏幕。

        EventWaitHandle ProgramOpen = new EventWaitHandle(false, EventResetMode.ManualReset, "ProgramOpen198472");
        EventWaitHandle FocusProgram = new EventWaitHandle(false, EventResetMode.ManualReset, "FocusMyProgram198472");
        private delegate void focusConfirmed(); Thread FocusCheck; 
        private void focus() { FocusProgram.WaitOne(); this.Invoke(new focusConfirmed(()=>{this.Show(); this.BringToFront();}));}
        private void Form1_Load(object sender, EventArgs e)
        {
            if (ProgramOpen.WaitOne(0))
            {
                FocusProgram.Set();
                this.Close();
            }
            ProgramOpen.Set();
        }
        private void HideButton_Click(object sender, EventArgs e)
        {
            this.Hide();
            FocusProgram.Reset();
            FocusCheck = new Thread(focus);
            FocusCheck.Start();
        }
        private void showToolStripMenuItem_Click(object sender, EventArgs e)
        {
            FocusProgram.Set();
        }