Конференция "WinAPI" » Консольное приложение. Иконка в области уведомлений. [D5, WinXP]
 
  • Deltas © (28.08.09 17:24) [0]
    Здравствуйте, мастера! Можно ли в приложении, в котором нет ни одного графического окна, создать иконку в области уведомлений панели задач? Вызываю Shell_NotifyIcon, иконка появляется, но при наведении мыши, исчезает.
  • Медвежонок Пятачок © (28.08.09 17:33) [1]
    графического? можно без графического.
  • clickmaker © (28.08.09 18:05) [2]
    > Вызываю Shell_NotifyIcon

    а что передается в NOTIFYICONDATA::hWnd?
  • CrytoGen (28.08.09 18:06) [3]
    Исчезает, по моему, когда не обрабатываются сообщения от трея.
  • Deltas © (28.08.09 18:10) [4]

    > а что передается в NOTIFYICONDATA::hWnd?

    hWnd := 0;
  • Deltas © (28.08.09 18:58) [5]
    program Project1;

    {$APPTYPE CONSOLE}

    uses
     Windows, Messages, SysUtils, ShellAPI;

    const
     wmNotifyIconEvent = WM_USER;

    var
     NotifyIconData: TNotifyIconData;

    begin
     SetConsoleTitle('unique name');

     Sleep(200);

     NotifyIconData.cbSize := SizeOf(NotifyIconData);
     NotifyIconData.Wnd := FindWindow(nil, PChar('unique name'));
     NotifyIconData.uID := 0;
     NotifyIconData.uFlags := NIF_MESSAGE or NIF_ICON or NIF_TIP;
     NotifyIconData.uCallbackMessage := wmNotifyIconEvent;
     NotifyIconData.hIcon := LoadIcon(0, IDI_EXCLAMATION);
     NotifyIconData.szTip := 'Warning';
     
     Shell_NotifyIcon(NIM_ADD, @NotifyIconData);
     
     Sleep(INFINITE);
    end.



    Здесь NOTIFYICONDATA::hWnd получает значение дескриптора консольного окна. Иконка в области уведомлений не пропадает при наведении мыши. Но возникает вопрос в том, как обрабатывать сообщения от иконки? GetMessage, PeekMessage не отловят это сообщение, т.к. консольное окно живет в одном из потоков процесса csrss.exe.
  • Eraser © (28.08.09 19:15) [6]
    > [5] Deltas ©   (28.08.09 18:58)

    можно создать доп. поток с доп. окном для обработки этих сообщений.
  • Юрий Зотов © (31.08.09 10:16) [7]
    Можно и не дополнительный, никто не мешает окну и консоли работать в одном потоке. То есть - делаем самое обычное tray-приложение, в OnCreate главной формы пишем AllocConsole, а в OnDestroy - FreeConsole. И все.
 
Конференция "WinAPI" » Консольное приложение. Иконка в области уведомлений. [D5, WinXP]
Есть новые Нет новых   [134434   +26][b:0][p:0.001]