-
Здравствуйте, мастера! Можно ли в приложении, в котором нет ни одного графического окна, создать иконку в области уведомлений панели задач? Вызываю Shell_NotifyIcon, иконка появляется, но при наведении мыши, исчезает.
-
графического? можно без графического.
-
> Вызываю Shell_NotifyIcon
а что передается в NOTIFYICONDATA::hWnd?
-
Исчезает, по моему, когда не обрабатываются сообщения от трея.
-
> а что передается в NOTIFYICONDATA::hWnd?
hWnd := 0;
-
program Project1;
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.
-
> [5] Deltas © (28.08.09 18:58)
можно создать доп. поток с доп. окном для обработки этих сообщений.
-
Можно и не дополнительный, никто не мешает окну и консоли работать в одном потоке. То есть - делаем самое обычное tray-приложение, в OnCreate главной формы пишем AllocConsole, а в OnDestroy - FreeConsole. И все.
|