2012-05-10 4 views
3

J'ai créé une application qui démarre dans la barre d'état système au démarrage. Je le poste ci-dessous pour y parvenir: How to start WinForm app minimized to tray?Restaurer l'application à partir de la barre d'état système en cliquant sur le raccourci du bureau

Cette application permet également que d'une seule instance à exécuter: http://www.codeproject.com/Articles/32908/C-Single-Instance-App-With-the-Ability-To-Restore

Le problème que je reçois est quand je commence l'application, il minmizes au système plateau, mais si je clique sur l'icône du bureau, il n'apparaît pas. Je dois cliquer sur l'icône dans le bac pour restaurer l'application. Si je le redimensionne ensuite, puis cliquez sur l'icône du bureau, il apparaît.

Ceci est ma deuxième tentative d'application winform, est-ce quelque chose à voir avec SetVisibleCore?

Tout pointeur dans la bonne direction serait génial.

+1

laissez-moi voir votre codez – animaonline

+0

Jetez un oeil à cette question: http://stackoverflow.com/questions/4611828/maximize-application-in-system-tray – M4N

+0

J'utilise le code des deux liens ci-dessus , http://www.codeproject.com/KB/cs/SingleInstanceAppMutex/SingleInstanceMutexSampleV2.txt – Boomerang

Répondre

1

Si vous faites votre application WinForms un singleton, alors il est très facile de faire la fenêtre réduite de restauration,

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

Il est juste une autre variante de l'utilisation de WindowsFormsApplicationBase espace de noms Microsoft.VisualBasic.ApplicationServices. Plus facile/meilleur que l'utilisation d'un Mutex.

Vous pouvez changer

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; 
    } 
+0

Salut, c'est une application Winform? – Boomerang

+0

Juste édité ma réponse. –

+0

Juste essayé l'exemple donné et il ne fonctionne pas du tout quand je clique sur mon icône de bureau, son encore affiché dans ma barre d'état système cependant. L'un des codes de ce http://stackoverflow.com/questions/1730731/how-to-start-winform-app-minimized-to-tray provoquerait-il un conflit? – Boomerang

0

si vous écrivez la logique de restauration dans votre principale. Vous pouvez le faire en utilisant la fonction ShowWindow et le drapeau 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); 
} 
Questions connexes