【问题标题】:Restore application from system tray when clicking on desktop shortcut单击桌面快捷方式时从系统托盘恢复应用程序
【发布时间】:2012-05-10 07:34:37
【问题描述】:

我创建了一个应用程序,它在启动时会在系统托盘中启动。我使用下面的帖子来实现这一点: How to start WinForm app minimized to tray?

此应用程序也只允许单个实例运行: http://www.codeproject.com/Articles/32908/C-Single-Instance-App-With-the-Ability-To-Restore

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

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

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

【问题讨论】:

标签: c# winforms system-tray


【解决方案1】:

如果你将你的 WinForms 应用程序设置为单例,那么恢复最小化窗口是非常容易的,

http://www.hanselman.com/blog/TheWeeklySourceCode31SingleInstanceWinFormsAndMicrosoftVisualBasicdll.aspx

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

你可能会改变

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

    void this_StartupNextInstance(object sender, StartupNextInstanceEventArgs e)
    {
        Form1 form = MainForm as Form1; //My derived form type
        form.Show();
        form.WindowState = FormWindowState.Normal;
    }

【讨论】:

  • 嗨,这是一个 Winform 应用程序吗?
  • 刚刚尝试了给出的示例,当我单击我的桌面图标时它根本不起作用,但它仍然显示在我的系统托盘中。这个stackoverflow.com/questions/1730731/… 中的任何代码会导致任何冲突吗?
  • 您只需要其中一个。如果你按照我的建议使用 WindowsFormsApplicationBase,那么请不要使用任何 Mutex 相关的技巧。
  • 我删除了静态 void Main() 中的互斥代码并使用了给出的示例,但在我的场景中不起作用,即它不起作用。当我第一次启动应用程序时,它会在系统托盘中启动它。如果我单击桌面快捷方式,它不会最大化它。如果我双击系统托盘中的图标,它将毫无问题地最大化。如果我最小化到系统托盘,然后单击桌面图标,它就会打开。我认为这是它第一次推出的时候。我认为有些东西没有注册。
【解决方案2】:

如果您在 main.js 中编写恢复逻辑会怎样?您可以使用ShowWindow 函数和SW_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);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-18
    • 1970-01-01
    • 1970-01-01
    • 2010-10-06
    • 1970-01-01
    • 2012-09-07
    • 1970-01-01
    • 2011-02-10
    相关资源
    最近更新 更多