создал я окно от эдита, чтобы не регистрировать его класс. теперь вот хочу обработать сообщение при выборе одного из пунктов сабжа. посему, при GetMessage() нужно бы указывать хэндл окна. а у меня то его нету. как быть? или же класс окна регить и делать все по-человечьи?
Не понял. Название темы про менюшку в трее, при чем тут эдит? Есть такая функция CreatePopupMenu. Вроде менюшку создает, можно и к иконке в трее ее прицепить. Или поясните задачу..
поясняю - нужно обрабатывать нажатие определенной клавиши во всех запущенных процессах (клавиши PrintScreen). Для этого я решил использовать сл: зарегистрировать горячую клавишу и через GetMessage (&messages, NULL, 0, 0) отлавливать нажатие этой клавиши во всех запущенных процессах и там уже в цикле делать: ... if (message == WM_HOTKEY) myProc(); все работает. но далее решил вот сделать чтоб по кликанью на иконке в трее (делаю ее через Shell_NotifyIcon) вырубать прогу. а для этого нужно создать и зарегистрировать окно, т.к. иначе это событие (клик) не получится для нее обработать. а если же создать и зарегить невидимое окно, указать в структуре id: id.hWnd=hWnd; ... Shell_NotifyIcon( NIM_ADD, // message identifier &id и затем уже обычно через цикл обработки сообщений проверять это нажатие на иконку, то получится, что этим циклом как бы 'перекроется' вышеописанный цикл по проверке на нажатие PrintScreen. замкнутый круг, блин. или я не туда копаю и все гораздо проще? и можно ли обрабатывать сообщения у иконки, не имея созданного для нее окна и класса? хочется разобраться. ps: может есть какое-то сообщение а-ля 'WM_Shell_NotifyIconClick' (типа клик по созданной иконке в трее)?
А что мешает отлов сообщения WM_HOTKEY и сообщения из трея сделать в одном цикле? Почему должно быть два отдельных цикла обработки сообщений? Код (Text): #define WM_NOTIFY_MESSAGE WM_USER+???? - из трея while (1){ if (!GetMessage (&msg, NULL, 0, 0)) break; if (msg.message==WM_NOTIFY_MESSAGE) break; if (msg.message == WM_HOTKEY) MyProc(); TranslateMessage (&msg); DispatchMessage (&msg); } Так не пойдёт?
2cresta: скорее всего сойдет, вот только у меня почему-то при кликаньи на моей созданной иконке в трее msg.message всегда нулю равно. и я все равно точно не пойму, чему должно быть равно сообщение WM_NOTIFY_MESSAGE. а мой 'ps' в пред. посте я так и не выяснил...
'WM_Shell_NotifyIconClick' ты сам можешь определить любое сообщение. При заполнении структуры NOTIFYICONDATA укажи его значение в nid.uCallbackMessage А в message loop действительно не приходит из трея сообщение Напрямую в WndProc передается. Остается только WM_HOTKEY перенести в WndProc - раз гора не идёт к Магомету Код (Text): RegisterHotKey(hWnd,0xBBBB,NULL,VK_SNAPSHOT); AddTrayIcon(); //----------------------------------------------------- void AddTrayIcon(){ NOTIFYICONDATA nid; RtlZeroMemory(&nid,sizeof(NOTIFYICONDATA)); nid.cbSize=sizeof(NOTIFYICONDATA); nid.uID=NULL; nid.hWnd=hWnd; nid.uFlags=NIF_ICON | NIF_MESSAGE | NIF_TIP ; nid.uCallbackMessage=WM_USER+1111;//твоё сообщение nid.hIcon=hIconAppSmall; Shell_NotifyIcon(NIM_ADD,&nid); } //-------------------------------------------------- static LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam){ switch(uMsg){ case WM_USER+1111: if ((lParam & 0xFFFF)==WM_RBUTTONUP){ Beep(2000,10); } break; case WM_HOTKEY: Beep(1000,10); break; } return DefWindowProc(hwnd, uMsg, wParam, lParam); } Вот так реагирует и на хоткей, и на клик правой мышью в трее.