c# - 当 ShowInTaskbar = false 时将另一个进程窗口置于前台

标签 c# winforms

我们只想在任何时候运行我们应用程序的一个实例。因此在启动时它会查看应用程序是否正在运行,如果正在运行,它会在主窗口上调用 SetForegroundWindow

这一切都很好......大部分......

当我们的应用程序启动时,它将显示启动画面和登录表单。这两种形式都有 ShowInTaskBar = false

因此,如果您尝试在显示登录表单时启动应用程序的另一个副本,则该登录表单不会被带到前台!

特别是当用户在任务栏中也看不到任何东西时,他们所认为的只是该应用程序是无用的并且无法启动。没有迹象表明有另一个实例在运行。

有什么办法可以解决这个问题吗?

最佳答案

好了,代码在这里。即使 ShowInTaskBarfalse,您也应该能够将其置于最前面。

    [DllImport("USER32.DLL", CharSet = CharSet.Unicode)]
    public static extern IntPtr FindWindow(String lpClassName, String lpWindowName);

    [DllImport("USER32.DLL")]
    public static extern bool SetForegroundWindow(IntPtr hWnd);

    public static void bringToFront(string title) {
        // Get a handle to the Calculator application.
        IntPtr handle = FindWindow(null, title);

        // Verify that Calculator is a running process.
        if (handle == IntPtr.Zero) {
            return;
        }

        // Make Calculator the foreground application
        SetForegroundWindow(handle);
    }

注意:您应该FindWindow 使用窗体的类而不是名称,因为初始屏幕窗体有时没有标题甚至控制框。使用 Spy++ 进行更深入的挖掘。

在启动时使用 FindWindow。我认为这就是您想要做的 - 在加载主窗体时将启动画面放在前面。

关于c# - 当 ShowInTaskbar = false 时将另一个进程窗口置于前台,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2636721/

相关文章:

c# - F# 中使用的运算符 (-) 引发 C# 不支持指定方法的异常

c# - 在 Gtk 中,在 TreeView 中使用拖放时,如何避免在行之间拖放?

c# - 编辑 winForm VS2012 时丢失 UserControl

c# - 使用SAME Textbox在dataGridView中搜索和插入数据

c# - 如何正确停止BackgroundWorker

c# - Visual Studio 2015 不是语法高亮 Razor ,也不是 Intellisense

c# - 升级到 VS2017 后找不到任何适合该文化或中立文化错误的资源

c# - 如何使用 AutoMapper 和 OData 扩展子级别?

c# - 如何删除按钮运行时间?

c# - 如何在更新列时暂停 DataGridView