работа с менюшкой в трее

Тема в разделе "WASM.WIN32", создана пользователем varnie, 30 мар 2005.

  1. varnie

    varnie New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2005
    Сообщения:
    1.785
    создал я окно от эдита, чтобы не регистрировать его класс. теперь вот хочу обработать сообщение при выборе одного из пунктов сабжа. посему, при GetMessage() нужно бы указывать хэндл окна. а у меня то его нету.

    как быть?

    или же класс окна регить и делать все по-человечьи?
     
  2. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.348
    А CreateWindow случайно не возвращает хендл созданного окна?
     
  3. n0p

    n0p 10010000b

    Публикаций:
    0
    Регистрация:
    7 май 2003
    Сообщения:
    256
    Адрес:
    Новосиbeerск
    Не понял.

    Название темы про менюшку в трее, при чем тут эдит?

    Есть такая функция CreatePopupMenu. Вроде менюшку создает, можно и к иконке в трее ее прицепить.



    Или поясните задачу..
     
  4. shoo

    shoo New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2003
    Сообщения:
    1.537
    Адрес:
    Ukraine
    n0p

    это такой трюк, чтобы volodya в эту тему не заглядывал :)
     
  5. varnie

    varnie New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2005
    Сообщения:
    1.785
    поясняю - нужно обрабатывать нажатие определенной клавиши во всех запущенных процессах (клавиши 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' (типа клик по созданной иконке в трее)?
     
  6. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    А что мешает отлов сообщения WM_HOTKEY и сообщения из трея сделать в одном цикле? Почему должно быть два отдельных цикла обработки сообщений?


    Код (Text):
    1. #define WM_NOTIFY_MESSAGE    WM_USER+???? - из трея
    2.  
    3. while (1){
    4.     if (!GetMessage (&msg, NULL, 0, 0)) break;
    5.     if (msg.message==WM_NOTIFY_MESSAGE) break;
    6.     if (msg.message == WM_HOTKEY) MyProc();
    7.     TranslateMessage (&msg);
    8.     DispatchMessage (&msg);
    9. }




    Так не пойдёт?
     
  7. varnie

    varnie New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2005
    Сообщения:
    1.785
    2cresta: скорее всего сойдет, вот только у меня почему-то при кликаньи на моей созданной иконке в трее msg.message всегда нулю равно. и я все равно точно не пойму, чему должно быть равно сообщение WM_NOTIFY_MESSAGE.

    а мой 'ps' в пред. посте я так и не выяснил...
     
  8. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    'WM_Shell_NotifyIconClick'

    ты сам можешь определить любое сообщение. При заполнении структуры NOTIFYICONDATA укажи его значение в nid.uCallbackMessage



    А в message loop действительно не приходит из трея сообщение :dntknw: Напрямую в WndProc передается. Остается только WM_HOTKEY перенести в WndProc - раз гора не идёт к Магомету




    Код (Text):
    1. RegisterHotKey(hWnd,0xBBBB,NULL,VK_SNAPSHOT);
    2. AddTrayIcon();
    3.  
    4. //-----------------------------------------------------
    5. void AddTrayIcon(){
    6.     NOTIFYICONDATA      nid;
    7.     RtlZeroMemory(&nid,sizeof(NOTIFYICONDATA));
    8.     nid.cbSize=sizeof(NOTIFYICONDATA);
    9.     nid.uID=NULL;
    10.     nid.hWnd=hWnd;
    11.     nid.uFlags=NIF_ICON | NIF_MESSAGE | NIF_TIP ;
    12.     nid.uCallbackMessage=WM_USER+1111;//твоё сообщение
    13.     nid.hIcon=hIconAppSmall;
    14.     Shell_NotifyIcon(NIM_ADD,&nid);
    15. }
    16. //--------------------------------------------------
    17. static LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam){
    18.  
    19.     switch(uMsg){
    20.         case WM_USER+1111:
    21.             if ((lParam & 0xFFFF)==WM_RBUTTONUP){
    22.                 Beep(2000,10);
    23.                 }
    24.             break;
    25.         case WM_HOTKEY:
    26.             Beep(1000,10);
    27.             break;
    28.     }
    29.     return DefWindowProc(hwnd, uMsg, wParam, lParam);
    30. }




    Вот так реагирует и на хоткей, и на клик правой мышью в трее.