C# 单击桌面快捷方式时从系统托盘还原应用程序

C# 单击桌面快捷方式时从系统托盘还原应用程序,c#,winforms,system-tray,C#,Winforms,System Tray,我已经创建了一个应用程序,它在启动时在系统托盘中启动。我使用以下帖子实现了这一点: 此应用程序还仅允许运行单个实例: 我遇到的问题是,当我第一次启动应用程序时,它会缩小到系统托盘,但如果我单击桌面图标,它不会出现。我必须点击托盘中的图标来恢复应用程序。如果我再次最小化它,然后单击桌面图标,它就会出现 这是我第二次尝试winform应用程序,是否与SetVisibleCore有关 任何指向正确方向的指针都很好。如果您将WinForms应用程序设置为单例,则很容易使最小化窗口还原 它只是Mic

我已经创建了一个应用程序,它在启动时在系统托盘中启动。我使用以下帖子实现了这一点:

此应用程序还仅允许运行单个实例:

我遇到的问题是,当我第一次启动应用程序时,它会缩小到系统托盘,但如果我单击桌面图标,它不会出现。我必须点击托盘中的图标来恢复应用程序。如果我再次最小化它,然后单击桌面图标,它就会出现

这是我第二次尝试winform应用程序,是否与SetVisibleCore有关


任何指向正确方向的指针都很好。

如果您将WinForms应用程序设置为单例,则很容易使最小化窗口还原

它只是Microsoft.VisualBasic.ApplicationServices命名空间中使用WindowsFormsApplicationBase的另一个变体。比使用互斥更容易/更好

你可能会改变

    void this_StartupNextInstance(object sender, StartupNextInstanceEventArgs e)
    {
        Form1 form = MainForm as Form1; //My derived form type
        form.LoadFile(e.CommandLine[1]);
    }


如果在main中编写恢复逻辑会怎么样。您可以使用函数和
SW\u MAXIMIZE
标志来实现这一点

    [DllImport("user32.dll", CharSet = CharSet.Auto)]
    [return: MarshalAs(UnmanagedType.Bool)]
    private static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);

    private const int SW_MAXIMIZE = 9; //Command to restore the window

    [STAThread]
    static void Main()
    {
        bool onlyInstance = false;
        Mutex mutex = new Mutex(true, "UniqueApplicationName", out onlyInstance);
        if (!onlyInstance) 
        {
             Process[] p = Process.GetProcessesByName("UniqueApplicationName");
             SetForegroundWindow(p[0].MainWindowHandle);
             ShowWindow(p[0].MainWindowHandle, SW_MAXIMIZE);
             return;
        }
        Application.Run(new MainForm);
        GC.KeepAlive(mutex);
}

看看这个问题:我使用上面两个链接中的代码,访问,获取WPF应用程序的答案嗨,这是一个Winform应用程序?只是尝试了给出的示例,当我单击桌面图标时,它根本不起作用,但它仍然显示在我的系统托盘中。此代码中的任何代码是否会导致冲突?您只需要其中一个。如果您按照我的建议使用WindowsFormsApplicationBase,那么请不要使用任何与互斥体相关的技巧。我删除了静态void Main()中的互斥体代码,并使用了给定的示例,但在我的场景中不起作用,即不起作用。当我第一次启动应用程序时,它会在系统托盘中启动。如果我单击桌面快捷方式,它不会将其最大化。如果我双击系统托盘中的图标,它将最大化,没有任何问题。如果我打开系统托盘,然后单击桌面图标,它会打开ok。我想这是它第一次推出的时候。我想有些东西没有注册。
    [DllImport("user32.dll", CharSet = CharSet.Auto)]
    [return: MarshalAs(UnmanagedType.Bool)]
    private static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);

    private const int SW_MAXIMIZE = 9; //Command to restore the window

    [STAThread]
    static void Main()
    {
        bool onlyInstance = false;
        Mutex mutex = new Mutex(true, "UniqueApplicationName", out onlyInstance);
        if (!onlyInstance) 
        {
             Process[] p = Process.GetProcessesByName("UniqueApplicationName");
             SetForegroundWindow(p[0].MainWindowHandle);
             ShowWindow(p[0].MainWindowHandle, SW_MAXIMIZE);
             return;
        }
        Application.Run(new MainForm);
        GC.KeepAlive(mutex);
}