Мое приложение всегда должно быть свернуто в системный трей, а не на панель задач.
Для этого я обрабатываю WM_SYSCOMMAND
/ SC_MINIMIZE
:
case WM_SYSCOMMAND:
switch (wParam)
{
case SC_MINIMIZE:
minimizeToTray();
return FALSE;
...
Это однако не охватывает события, когда окно свернуто без WM_SYSCOMMAND
.
Например: я могу свернуть окно, используя Win+D
(показать рабочий стол).
Для покрытия в этом случае я обрабатываю WM_ACTIVATE
/ WA_INACTIVE
:
case WM_ACTIVATE:
{
if (LOWORD(wParam) == WA_INACTIVE && HIWORD(wParam) != 0)
{
minimizeToTray();
}
...
, который, по-видимому, only работает, если окно активно перед отображением рабочего стола.
Проблемы:
Когда окно уже неактивно, WM_ACTIVATE
не обнаруживает минимизацию. Какое сообщение говорит мне, что неактивное окно свернуто?
РЕДАКТИРОВАТЬ: Кажется, что WM_WINDOWPOSCHANGED
является правильным местом, чтобы проверить, свернуто ли окно, когда оно не активно.
Кроме того, когда я активирую какое-то другое приложение, которое развернуто, полностью охватывающее мое собственное приложение, я также хочу свернуть в трей, но не знаю, есть ли сообщение для обработки в этом случае. Старшее слово wParam
для WM_ACTIVATE
в этом случае 0
(как и в случае, если окно было только что деактивировано, но все еще видно).