2012-03-21

Ikona w tray-u, a restart explorer-a

Explorer to dosyć niestabilny proces. Wchodzenie na 100% obciążenia, crash i restart zdarzają się od czasu do czasu. W takim wypadku ikonki naszych programów znikają z tray-a. Znikają ale programy działają dalej. Jeśli nasz program był zminimalizowany do tray-a to nie mamy go jak przywrócić. Można napisać aplikacje tak by uruchomienie drugiej instancji przywróciło pierwszą. Ale co jeśli dopuszczamy działanie wielu kopii aplikacji. Zawsze możemy oczywiście program zamknąć z menadżera zadań. Ale u mnie np. jest tych ikonek mnóstwo i jak się sypnie explorer to ich tak trochę ubywa. Naprawdę nie sposób się połapać co znikło do momentu aż jest to potrzebne.

Tak więc to czego potrzebujemy to automatyczne przywracanie ikony w tray-u po restarcie explorer-a. Korzystamy tutaj z message-a jaki explorer wyśle do nas w momencie utworzenia paska zadań. Wiadomość ta nie ma przypisanego kodu, explorer rejestruje ją za pomocą nazwy TaskbarCreated.

Po pierwsze potrzebujemy eksportu do funkcji rejestrowania wiadomości:

[DllImport("user32.dll", SetLastError=true, CharSet=CharSet.Auto)]
private static extern uint RegisterWindowMessage(string a_name);

Sama rejestracja:

private uint WM_TASKBARCREATED;
WM_TASKBARCREATED = RegisterWindowMessage("TaskbarCreated");

I przechwytywanie wiadomości:

protected override void WndProc(ref Message a_msg)
{
    if (a_msg.Msg == WM_TASKBARCREATED)
    {
        if (notifyIcon.Visible)
            notifyIcon.Visible = true;
    }

    base.WndProc(ref a_msg);
}

Brak komentarzy:

Prześlij komentarz