c#显示进程的隐藏窗口

时间:2013-06-13 22:19:16

标签: c# process window handle

我的应用程序中有一个选项可以隐藏窗口 - form.hide(),并在系统托盘中放置一个notifyicon,当您点击notifyicon时,会有一个表单。显示()。

如果有人会尝试运行该应用的两个实例,我想要 一个。不要运行新实例 湾显示第一个实例的窗口

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

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

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

问题 如何使用它的过程显示窗口?

2 个答案:

答案 0 :(得分:0)

对于问题的第一部分,这是你可以做的。在显示表单之前在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方法。
  • 另一种方法是搜索主进程的窗口句柄并将其置于前面。这个article可以为您提供想法。

请记住,在所有进程中执行循环不如使用互斥锁有效。如果你不关心速度,清理代码,你只是希望这个应用程序工作,然后使用这个循环..对我来说代码是诗歌。

答案 1 :(得分:0)

仅为您重新编写代码,这将为您提供您想要的内容。它将检查重复项并在打开副本时聚焦屏幕。

        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();
        }