Можно ли отправить сигнал в Windows Explorer, чтобы заставить его обновить systray значки?

К сожалению, это было ограничение уведомлений Firebase в SDK 9.0.0-9.6.1. Когда приложение находится в фоновом режиме, значок манифеста используется из манифеста (с требуемым оттенком Android) для сообщений, отправленных с консоли.

С SDK 9.8.0 вы можете переопределить значение по умолчанию! В вашем AndroidManifest.xml вы можете установить следующие поля для настройки значка и цвета:

<meta-data
        android:name="com.google.firebase.messaging.default_notification_icon"
        android:resource="@drawable/notification_icon" />
<meta-data android:name="com.google.firebase.messaging.default_notification_color"
        android:resource="@color/google_blue" />

Обратите внимание, что если приложение находится на переднем плане (или отправлено сообщение с данными), вы можете полностью использовать свои собственную логику для настройки дисплея. Вы также можете всегда настраивать значок, отправляя сообщение из API HTTP / XMPP.

11
задан Taryn 15 June 2014 в 21:23
поделиться

5 ответов

Взгляните на эту запись в блоге: ОБНОВЛЕНИЕ ОБЛАСТИ УВЕДОМЛЕНИЙ ТАСКБАРА . Я использую этот код для обновления панели задач, чтобы избавиться от потерянных значков, и он отлично работает. Запись в блоге очень информативна и дает прекрасное объяснение шагов, которые автор выполнил, чтобы найти свое решение.

#define FW(x,y) FindWindowEx(x, NULL, y, L"")

void RefreshTaskbarNotificationArea()
{
    HWND hNotificationArea;
    RECT r;

    GetClientRect(
        hNotificationArea = FindWindowEx(
            FW(FW(FW(NULL, L"Shell_TrayWnd"), L"TrayNotifyWnd"), L"SysPager"),
            NULL,
            L"ToolbarWindow32",
            // L"Notification Area"), // Windows XP
            L"User Promoted Notification Area"), // Windows 7 and up
        &r);

    for (LONG x = 0; x < r.right; x += 5)
        for (LONG y = 0; y < r.bottom; y += 5)
            SendMessage(
                hNotificationArea,
                WM_MOUSEMOVE,
                0,
                (y << 16) + x);
}
11
ответ дан 3 December 2019 в 02:31
поделиться

Включайте следующий код с Вашим для обновления Системного лотка.

public const int WM_PAINT = 0xF;
[DllImport("USER32.DLL")]
public static extern int SendMessage(IntPtr hwnd, int msg, int character,
                                     IntPtr lpsText);

Send WM_PAINT Message to paint System Tray which will refresh it.
SendMessage(traynotifywnd, WM_PAINT, 0, IntPtr.Zero);
4
ответ дан 3 December 2019 в 02:31
поделиться

Насколько я знаю, что это не возможный Gustavo - это до каждого приложения, чтобы поместить его notifyicon в systray и гарантировать, что это сохранено в правильном состоянии.

Вы будете замечать иногда, когда катастрофические отказы explorer.exe, что определенные значки не вновь появляются - это не то, потому что их процесс отказал, просто что их приложение не поместило notifyicon в systray когда новый экземпляр запущенного explorer.exe. Еще раз это - приложение, это ответственно.

Извините, что не имел лучшие новости для Вас!

2
ответ дан 3 December 2019 в 02:31
поделиться

Я использую следующий код C++ для получения дескриптора окна к окну лотка.Примечание: это было только протестировано на Windows XP.

HWND FindSystemTrayIcons(void)
{
    // the system tray icons are contained in a specific window hierarchy;
    // use the Spy++ utility to see the chain
    HWND hwndTray = ::FindWindow("Shell_TrayWnd", "");
    if (hwndTray == NULL)
        return NULL;
    HWND hwndNotifyWnd = ::FindWindowEx(hwndTray, NULL, "TrayNotifyWnd", "");
    if (hwndNotifyWnd == NULL)
        return NULL;
    HWND hwndSysPager = ::FindWindowEx(hwndNotifyWnd, NULL, "SysPager", "");
    if (hwndSysPager == NULL)
        return NULL;
    return ::FindWindowEx(hwndSysPager, NULL, "ToolbarWindow32", "Notification Area");
}
1
ответ дан 3 December 2019 в 02:31
поделиться

В прошлом году я освещал эту проблему в своем блоге Codeaholic в статье под названием [Delphi] Обновление SysTray .

Мое решение - Delphi ActiveX / COM DLL. Ссылка для загрузки по-прежнему работает (хотя я не знаю, сколько еще времени, поскольку мое членство в PLUG истекло).

2
ответ дан 3 December 2019 в 02:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: