26 / 26 / 8
Регистрация: 14.05.2011
Сообщений: 242
1

Как узнать, нажата ли кнопка свертывания окна?

02.11.2013, 01:18. Показов 1048. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
и вместо стандартных действий свертывания окна направить его в трей? Я предпологаю надо делать хук, но на какое событие и как?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.11.2013, 01:18
Ответы с готовыми решениями:

Уведомление WM_SYSKEYDOWN: как узнать, какая системная кнопка была нажата?
Всем привет, есть вопрос по WM_SYSKEYDOWN а именно: что значит параметр lParam и как из него узнать...

Как получить сообщение о том, что была нажата кнопка RADIOBUTTON?
Здравствуйте! Как получить сообщение о том, что была нажата одна из кнопок RADIOBUTTON? То есть,...

Пауза в цикле, пока не нажата кнопка
Подскажите, как реализовать следующий алгоритм: for (a = 0; a <= 10 ; a++) { hButton1 =...

как узнать нажата ли кнопка
как сделать так чтобы при нажатии на Button1 выполнялись операторы записанные в Button2 ? или как...

9
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32591 / 21060 / 8134
Регистрация: 22.10.2011
Сообщений: 36,332
Записей в блоге: 8
02.11.2013, 01:27 2
Ловить WM_SYSCOMMAND + SC_MINIMIZE
1
121 / 121 / 32
Регистрация: 04.03.2013
Сообщений: 370
02.11.2013, 01:40 3
ShellNotifyIcon. Для сворачивания окна в трей.
0
шКодер самоучка
2175 / 1882 / 912
Регистрация: 09.10.2013
Сообщений: 4,146
Записей в блоге: 7
02.11.2013, 12:06 4
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#define WM_SYSTRAYICON WM_USER+10
/// WindowProc(...) {
static NOTIFYICONDATA nid;
switch(msg) {
/// ....
case WM_MINIMIZE:
ShowWindow(hwnd, 0);
break;
/// ....
case WM_SYSTRAYICON:
SetForegroundWindow(hwnd);
ShowWindow(hwbd, 1);
break;
case WM_CREATE:
TrayIcon(hwnd,icon, message, nid);
///...
break;
case WM_DESTROY:
DelTrayIcon(nid);
break;
///....
}
return DefWindowProc(...);
}
// установка иконки в трей
void TrayIcon(HWND parent, HICON icon, const char* sztip,NOTIFYICONDATA& nid) {
    nid.cbSize = sizeof(NOTIFYICONDATA);
    nid.hWnd = parent;
    nid.uID = 1;
    nid.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP;
    nid.uCallbackMessage = WM_SYSTRAYICON;
    nid.hIcon = icon;
    lstrcpy(nid.szTip, sztip);
    Shell_NotifyIconA(NIM_ADD, &nid);
}
 
// удаление иконки в трее
void DelTrayIcon(NOTIFYICONDATA& nid) {
    Shell_NotifyIconA(NIM_DELETE, &nid);
}
както так
смотрите информацию по использованым функциям
давно c использованием WinAPI не программировал, могут быть ошибки

Добавлено через 11 минут
т.е. чтобы свернуть окно в трей надо добавить туда иконку, а потом просто сделать окно невидимым.
1
26 / 26 / 8
Регистрация: 14.05.2011
Сообщений: 242
02.11.2013, 14:37  [ТС] 5
все получилось, теперь еще одна проблема, как создать контекстное меню при клике правой кнопкой мыши по иконке в трее и при двойном клике левой открывать окно программы? на msdn читал так и не въехал. Понял только, что приходят сообщения о действиях с иконкой WM_SYSTRAYICON
0
121 / 121 / 32
Регистрация: 04.03.2013
Сообщений: 370
02.11.2013, 14:41 6
Регаем иконку в трее

C++
1
2
3
4
5
6
7
8
9
             ZeroMemory (&nid, sizeof (NOTIFYICONDATA));
             nid.cbSize = sizeof (NOTIFYICONDATA);
             nid.hWnd = hwnd;
             nid.uID = ID_ICON1;
             nid.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP;
             nid.uCallbackMessage = WM_SETTINGS;
             nid.hIcon = LoadIcon (hInst, szClassName);
             lstrcpy (nid.szTip, "Clock");
             Shell_NotifyIcon (NIM_ADD, &nid);
А дальше ловим сообщение

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
        case WM_SETTINGS:
             switch (LOWORD (lParam))
             {
                    case WM_RBUTTONDOWN:
                         
                         GetCursorPos (&ptCurPos);
                         
                         TrackPopupMenu (
                         hContextMenu,
                         0,
                         ptCurPos.x,
                         ptCurPos.y,
                         0,
                         hwnd,
                         NULL);
                         
                         break;
                    }
             break;
1
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32591 / 21060 / 8134
Регистрация: 22.10.2011
Сообщений: 36,332
Записей в блоге: 8
02.11.2013, 14:54 7
FreeMan108, обычно перед TrackPopupMenu вызывается SetForegroundWindow, а после - PostMessage+WM_NULL...
1
26 / 26 / 8
Регистрация: 14.05.2011
Сообщений: 242
02.11.2013, 15:14  [ТС] 8
а PostMessage+WM_NULL для чего?
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32591 / 21060 / 8134
Регистрация: 22.10.2011
Сообщений: 36,332
Записей в блоге: 8
02.11.2013, 15:26 9
По ссылке ходил? Ремарки читал?
0
121 / 121 / 32
Регистрация: 04.03.2013
Сообщений: 370
02.11.2013, 15:26 10
Цитата Сообщение от vladoscom93 Посмотреть сообщение
а PostMessage+WM_NULL для чего?
Это для того, чтобы не было всяких багов с меню.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.11.2013, 15:26
Помогаю со студенческими работами здесь

Как узнать нажата ли кнопка?
...

Как узнать какая кнопка нажата?
У меня есть 20 кнопок обработчик события Onclick у всех одинаковый, мне необходимо поменять Caption...

Как узнать, какая кнопка нажата?
Вот код: if (!e.which && e.button) { if (e.button & 1) e.which = 1 else if (e.button & 4)...

Как узнать какая кнопка нажата на клавиатуре
Добрый день! Задача такова: нужно узнать какая кнопка нажата на клавиатуре, но это не суть, это...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru