2012-05-10 1 views
3

Я создал приложение, которое запускается в системном трее при его запуске. Я использовал ниже пост для достижения этой цели: How to start WinForm app minimized to tray?Восстановить приложение из системного трея при нажатии на ярлык рабочего стола

Это приложение также позволяет только один экземпляр для запуска: http://www.codeproject.com/Articles/32908/C-Single-Instance-App-With-the-Ability-To-Restore

Проблемы я получаю, когда я первый запустить приложение это minmizes к системе лоток, но если я нажму значок рабочего стола, он не появится. Я должен щелкнуть значок в трее, чтобы восстановить приложение. Если я затем снова скрою его, а затем нажмите на значок рабочего стола, он появится.

Это моя вторая попытка приложения winform, это как-то связано с SetVisibleCore?

Любые указатели в правильном направлении были бы замечательными.

+1

позвольте мне видеть ваш codez – animaonline

+0

Посмотри на этом вопросе: http://stackoverflow.com/questions/4611828/maximize-application-in-system-tray – M4N

+0

я использую код из двух ссылок выше , http://www.codeproject.com/KB/cs/SingleInstanceAppMutex/SingleInstanceMutexSampleV2.txt – Boomerang

ответ

1

Если вы сделаете ваше приложение WinForms одноэлементно, то это очень легко сделать восстановить свернутое окно,

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

Это просто еще один вариант использования WindowsFormsApplicationBase из Microsoft.VisualBasic.ApplicationServices имен. Легче/лучше, чем использование 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; 
    } 
+0

Привет, это приложение Winform? – Boomerang

+0

Только что отредактировал мой ответ. –

+0

Просто попробовал приведенный пример, и он не работает вообще, когда я нажимаю на значок своего рабочего стола, но все же отображается на моем системном трее. Будет ли какой-либо код в этом http://stackoverflow.com/questions/1730731/how-to-start-winform-app-minimized-to-tray вызвать конфликт? – Boomerang

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); 
}