我创建了一个应用程序,它在启动时从系统托盘中启动。我用下面的帖子来实现这个目的: 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有关?
任何正确方向的指针都会很棒。
答案 0 :(得分:1)
如果您将WinForms应用程序设为单例,则可以非常轻松地进行最小化窗口恢复,
它只是使用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;
}
答案 1 :(得分:0)
如果您在主程序中编写还原逻辑,该怎么办?您可以使用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);
}