【问题标题】:Mutex bring back from minimized互斥量从最小化中恢复
【发布时间】:2018-07-04 07:25:23
【问题描述】:

我当时正在使用互斥锁来检查一个实例。它有效,但要完美,我需要修复一个错误。如果程序处于最小化状态,单击确定后它不会自行恢复。有任何想法吗?

这是在 Program.cs 中:

if (process.Id != current.Id)
{
    SetForegroundWindow(process.MainWindowHandle);
    MessageBox.Show(new Form1 { TopMost = true }, "Application is already running!");

    Form1 f1 = new Form1();

    f1.WindowState = FormWindowState.Normal; // dont work
    f1.BringToFront();                       // dont work
    f1.Focus();                              // dont work

    break;
}

【问题讨论】:

  • 您的 f1 变量不是指您现有的表单,而是一个新表单,这就是为什么在该变量上设置属性无效的原因。您是否正在尝试恢复现有表单?如果是这样,您需要获取对它的引用,或者如果它是在您的应用程序的另一个实例中运行的表单(听起来就是这样),则使用 pinvoke
  • .NET Framework 已经知道如何自动执行此操作:stackoverflow.com/a/19326/17034
  • 是的,我想恢复现有的。获得参考的最简单方法是什么?

标签: c# mutex


【解决方案1】:

创建扩展方法:

using System.Runtime.InteropServices;

namespace System.Windows.Forms
{
    public static class Extensions
    {
        [DllImport( "user32.dll" )]
        private static extern int ShowWindow( IntPtr hWnd, uint Msg );

        private const uint SW_RESTORE = 0x09;

        public static void Restore( this Form form )
        {
            if (form.WindowState == FormWindowState.Minimized)
            {
                ShowWindow(form.Handle, SW_RESTORE);
            }
        }
    }
}

然后在您的代码中使用form.Restore()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-11
    • 2011-07-02
    • 2012-05-30
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    相关资源
    最近更新 更多