Как свернуть приложение в tray?
От: qdrj  
Дата: 05.12.09 06:14
Оценка:
Здравствуйте. Есть консольное приложение которое работает, как сервис. Возможно ли, чтобы при его запуске оно сворачивалось в трей? Я попробовал использовать ф-ю Shell_NotifyIcon, и в поле tnd.hIcon для структуры tnd указываю стандартную иконку(IDI_SHIELD). Проект компилируется, однако в трее пусто. Вообще возможно ли сделать такое для консольного приложения? Если да, то буду рад, если подскажете куда смотреть.


NOTIFYICONDATA tnd = {0};
        tnd.cbSize = sizeof(NOTIFYICONDATA);
        tnd.uFlags = NIF_ICON;
        tnd.hIcon = LoadIcon(NULL, IDI_SHIELD);

if (Shell_NotifyIcon(NIM_ADD, &tnd) == TRUE) {
    start << "TRUE   GetLastError() = " << GetLastError() << "\n";
}
else {
    start << "FALSE   GetLastError() = " << GetLastError() << "\n";
}


05.12.09 14:21: Перенесено из 'C/C++'
Re: Как свернуть приложение в tray?
От: vadimcher  
Дата: 05.12.09 07:12
Оценка: 3 (1)
Здравствуйте, qdrj, Вы писали:

Q>Здравствуйте. Есть консольное приложение которое работает, как сервис. Возможно ли, чтобы при его запуске оно сворачивалось в трей? Я попробовал использовать ф-ю Shell_NotifyIcon, и в поле tnd.hIcon для структуры tnd указываю стандартную иконку(IDI_SHIELD). Проект компилируется, однако в трее пусто. Вообще возможно ли сделать такое для консольного приложения? Если да, то буду рад, если подскажете куда смотреть.


В простейшем случае тебе надо поступить так:
1) Если у тебя Express версия, то тебе надо создать иконку и файл ресурсов вручную (Express студия официально не поддерживает ресурсы, но на самом деле она их компилирует и добавляет).
a) icon.rc
1    ICON    "icon.ico"

б) icon.ico -- создаешь где хочешь, например, в бесплатном IcoFX.
в) добавляешь оба файла в папку с исходным текстом и в ветку Resource Files проекта.
2) Показываем иконку:
{ // add tray icon
    NOTIFYICONDATA nid = {};
    nid.cbSize = sizeof nid;
    nid.hWnd = GetConsoleWindow();
    nid.uFlags = NIF_ICON;
    nid.uID = 3;
    nid.hIcon = LoadIcon(GetModuleHandle(NULL), MAKEINTRESOURCE(1));
    Shell_NotifyIcon(NIM_ADD, &nid);
}

3) Убираем, если надо: то же самое, только NIM_DELETE в конце.

Вот вроде и все.

А вот зайца кому, зайца-выбегайца?!
Re: Как свернуть приложение в tray?
От: RealBobEx  
Дата: 05.12.09 14:17
Оценка:
Здравствуйте, qdrj, Вы писали:

В дополнение к тому, что сказал vadimcher:
    nid.uCallBackMessage = WM_USER + 50 /*например; и в этой функции вывести менюшку.*/
    //И уточнение: для удаления NIM_DELETE добавляется к флагу uFlags

Однако, у Вас неверно построено приложение, судя по Вашему описанию.
Ведь сервис не создает окно по определению. Может стоит посмотреть шаблон сервиса в VS 6.0?
Там все ясно описано.
Re[2]: Как свернуть приложение в tray?
От: qdrj  
Дата: 06.12.09 09:15
Оценка:
Здравствуйте, RealBobEx, Вы писали:

RBE>Однако, у Вас неверно построено приложение, судя по Вашему описанию.

RBE>Ведь сервис не создает окно по определению. Может стоит посмотреть шаблон сервиса в VS 6.0?
RBE>Там все ясно описано.

Спасибо, за ответ. Я неправильно написал — нет консольного приложения, просто сервис.
Re[2]: Как свернуть приложение в tray?
От: qdrj  
Дата: 06.12.09 09:21
Оценка:
Здравствуйте, vadimcher, Вы писали:

V>Здравствуйте, qdrj, Вы писали:


Q>>Здравствуйте. Есть консольное приложение которое работает, как сервис. Возможно ли, чтобы при его запуске оно сворачивалось в трей? Я попробовал использовать ф-ю Shell_NotifyIcon, и в поле tnd.hIcon для структуры tnd указываю стандартную иконку(IDI_SHIELD). Проект компилируется, однако в трее пусто. Вообще возможно ли сделать такое для консольного приложения? Если да, то буду рад, если подскажете куда смотреть.


V>В простейшем случае тебе надо поступить так:

V>1) Если у тебя Express версия, то тебе надо создать иконку и файл ресурсов вручную (Express студия официально не поддерживает ресурсы, но на самом деле она их компилирует и добавляет).
V>a) icon.rc
V>
V>1    ICON    "icon.ico"
V>

V>б) icon.ico -- создаешь где хочешь, например, в бесплатном IcoFX.
V>в) добавляешь оба файла в папку с исходным текстом и в ветку Resource Files проекта.
V>2) Показываем иконку:
V>
V>{ // add tray icon
V>    NOTIFYICONDATA nid = {};
V>    nid.cbSize = sizeof nid;
V>    nid.hWnd = GetConsoleWindow();
V>    nid.uFlags = NIF_ICON;
V>    nid.uID = 3;
V>    nid.hIcon = LoadIcon(GetModuleHandle(NULL), MAKEINTRESOURCE(1));
V>    Shell_NotifyIcon(NIM_ADD, &nid);
V>}
V>

V>3) Убираем, если надо: то же самое, только NIM_DELETE в конце.

V>Вот вроде и все.


Спасибо за развернутый ответ.

nid.hWnd = GetConsoleWindow()

— наверно не подойдет, я ошибся в описании. Нет консольного окна.
Иконка вообще не отображается, как ее можно свзяать с процессом сервиса? Что указать в поле nid.hWnd?
Re: Как свернуть приложение в tray?
От: ononim  
Дата: 07.12.09 01:44
Оценка: +1
эээ. А его (сервиса) окно вообще видимо на рабочем столе? Ибо интерактивность сервиса — еще включить надо, да и под вистой+ интерактивных сервисов не бывает.
Если сервис не интерактивный (или есть ось Виста/вин7) — никаких иконок в трее без процесса в юзерской сессии (любители переключать оконную станцию процесса сервиса идут нервно курить в связи с появлением висты).
Как много веселых ребят, и все делают велосипед...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.