Восстановление окна из системного трея при разрешении только одного экземпляра этой программы - PullRequest
4 голосов
/ 04 января 2011

хорошо, заголовок довольно длинный и должен указывать на проблему, с которой я сталкиваюсь.

Вот код при сворачивании в трее значков:

void MainFormResize(object sender, EventArgs e)
        {
            if (WindowState == FormWindowState.Minimized)
            {
                this.Hide();
                this.ShowInTaskbar = false;
            }
        }

Когда программауже открыт и в системном трее, и все же кто-то хочет открыть другой экземпляр этого, затем:

    private static void Main(string[] args)
            {
                bool createdNew = true;
                using (Mutex mutex = new Mutex(true, "IPADcommunicator", out createdNew))
                {
                    if (createdNew)
                    {
                        Application.EnableVisualStyles();
                        Application.SetCompatibleTextRenderingDefault(false);
                        Application.Run(new MainForm());
                    }
                    else
                    {
                        Process current = Process.GetCurrentProcess();
                        foreach (Process process in Process.GetProcessesByName(current.ProcessName))
                        {
                            if (process.Id != current.Id)
                            {
                                IntPtr handle = FindWindow(null,"IPADcommunicator");
                                SetForegroundWindow(handle);
                                ShowWindow(handle,5);

                                break;
                            }
                        }
...

Однако, это не работает должным образом.Главное окно не восстановлено.Я много гуглил и не нашел решения этой проблемы.Заранее спасибо!

Ответы [ 2 ]

6 голосов
/ 04 января 2011

Вызов SetForegroundWindow () для невидимого окна не будет работать. Есть много других возможных сбоев, FindWindow () является несчастным, когда вы начинаете передавать ноль.

Не придумывайте это сами. В .NET уже есть отличная встроенная поддержка приложений для одного экземпляра. Вы даже можете получить уведомление при запуске 2-й копии и передать командную строку. Что вам и нужно, просто восстановите окно вместо взлома API. Код, который вам нужен здесь .

1 голос
/ 04 февраля 2011

После просмотра десятков решений, включая ссылку от Ганса, я не верю, что ссылка на принятый ответ восстановит приложение из системного списка. Все, что он делает, это правильно управляет одним экземпляром и передает аргументы одному экземпляру.

Более полное решение, способное управлять единичным экземпляром, восстанавливать свернутое окно и восстанавливать системное окно, можно найти здесь в codeplex. http://www.codeproject.com/KB/cs/SingleInstanceAppMutex.aspx

Это также очень просто включить в свой собственный код.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...