Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Иконка в области уведомлений - без окна :), Такое возможно? 
V
    Опции темы
disputant
Дата 12.7.2012, 17:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 210
Регистрация: 28.11.2011

Репутация: 1
Всего: 3



Добрый день!

В Win API чайник, так что если пишу глупости - поправьте, как надо.

Есть у меня некое расчетное приложение (писано на Open Watcom как обычное консольное, int main() без всяких окон... Работает себе в фоне благодаря ключику -l=nt_win при компиляции. Если скомпилировать как консольное - ну, будет черное окошко smile)

Захотелось иметь возможность следить, как оно живет - при помощи иконки в области уведомлений (ну, типа, менять иконку в зависимости от стадии расчета, в Tip'е проценты указать... пока никаких меню).

Делаю примерно так - 

Код

    NOTIFYICONDATA nid = { 0 };
    nid.cbSize = (char*)&nid.dwState - (char*)&nid;
    nid.hWnd = 0;
    nid.uID = 100;
    nid.uCallbackMessage = WM_USER;
    nid.uFlags = NIF_ICON|NIF_TIP;
    strcpy(nid.szTip,"Test icon 1");
    nid.hIcon = LoadIcon(GetModuleHandle(NULL),MAKEINTRESOURCE(100));
    printf("Ret = %d\n",Shell_NotifyIcon(NIM_ADD,&nid));


Работает. Иконка появляется. Могу ее поменять. Но как только над ней провести мышкой - она тут же исчезает!

Что я делаю не так? и как надо?

Заранее спасибо за консультацию!



PM MAIL   Вверх
Dem_max
Дата 12.7.2012, 17:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

Репутация: 16
Всего: 39



Код ниочем.


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
disputant
Дата 12.7.2012, 18:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 210
Регистрация: 28.11.2011

Репутация: 1
Всего: 3



Цитата(Dem_max @ 12.7.2012,  17:46)
Код ниочем.

В каком смысле?

Нужно привести всю программу? smile

Ладно, вот тот минимум, для которого я хотел бы получить результат:

Код

#include <dos.h>
#include <stdio.h>
#include <windows.h>

int main(int argc, const char * argv[])
{

    NOTIFYICONDATA nid = { 0 };
    nid.cbSize = (char*)&nid.dwState - (char*)&nid;
    nid.hWnd = 0;
    nid.uID = 100;
    nid.uCallbackMessage = WM_USER;
    nid.uFlags = NIF_ICON|NIF_TIP;
    strcpy(nid.szTip,"Test icon 1");
    nid.hIcon = LoadIcon(GetModuleHandle(NULL),MAKEINTRESOURCE(100));
    printf("Ret = %d\n",Shell_NotifyIcon(NIM_ADD,&nid));

    sleep(10);
    Shell_NotifyIcon(NIM_DELETE,&nid);
}


Вот test.rc:

Код

100 ICON  "N1.ICO"


Вот компиляция:

Код

wrc test.rc 
wcl386 -xs -bm -oneatx -l=nt_win test.cpp
wrc test.res test.exe 


Файл с иконкой нукжен? smile

Хочу, чтоб эти 10 секунд иконка из трея не исчезала при проведении над ней мышкой, а напротив, чтоб показывала подсказку.

Теперь код о чем-то или опять ни о чем?

Добавлено через 13 минут и 18 секунд
Да, вдогонку: замена на 

Код

    nid.hWnd = GetConsoleWindow();


работает, если есть консольное окно. Но мне надо именно при -l=nt_win, когда окно вообще не создается (что-то типа сервиса...) - в этом случае GetConsoleWindow() не работает...

PM MAIL   Вверх
Dem_max
Дата 12.7.2012, 20:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

Репутация: 16
Всего: 39



У тебя код правильно работает, создает иконку в системном трее и через 10 мс ее удаляет.


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
feodorv
Дата 12.7.2012, 20:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 9
Всего: 45



Цитата(disputant @  12.7.2012,  18:37 Найти цитируемый пост)
    nid.cbSize = (char*)&nid.dwState - (char*)&nid;

Почему не просто sizeof(NOTIFYICONDATA)? А то непонятно, размер для какой версии Windows Вы имеете в виду.
Плюс стоит обнулить всю структуру.

Добавлено @ 20:16
Цитата(Dem_max @  12.7.2012,  21:09 Найти цитируемый пост)
создает иконку в системном трее и через 10 мс ее удаляет.

+1
Ну хотя бы Sleep( 10 * 1000 ); smile 


Это сообщение отредактировал(а) feodorv - 12.7.2012, 20:24


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
Dem_max
Дата 12.7.2012, 20:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

Репутация: 16
Всего: 39



Создай обычное Win32 приложение

только вместо создания окна сделай так
Код

hWndMain = CreateWindowEx(WS_EX_APPWINDOW, wc.lpszClassName, "Message Only Windows", WS_OVERLAPPED, 0, 0, 0, 0,  HWND_MESSAGE, NULL, hInstance, NULL);

Создастся окно которое не будет никогда видно, и которое будет принимать сообщения.


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
disputant
Дата 12.7.2012, 21:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 210
Регистрация: 28.11.2011

Репутация: 1
Всего: 3



Цитата(Dem_max @ 12.7.2012,  20:17)
Создай обычное Win32 приложение

только вместо создания окна сделай так
Код

hWndMain = CreateWindowEx(WS_EX_APPWINDOW, wc.lpszClassName, "Message Only Windows", WS_OVERLAPPED, 0, 0, 0, 0,  HWND_MESSAGE, NULL, hInstance, NULL);

Создастся окно которое не будет никогда видно, и которое будет принимать сообщения.

Сенкс, вижу, что без окна никак... Жаль :(

Впрочем, ну и пусть висит себе... Все равно если соберусь потом дописывать какое-то взаиможействие - надо же кому-то сообщения слать? 


PS всем, кто говорил про 10мс: это не Sleep, а sleep (обратите внимание на регистр первой буквы). Так что на самом деле это 10 секунд...


Это сообщение отредактировал(а) disputant - 12.7.2012, 21:35
PM MAIL   Вверх
volatile
Дата 13.7.2012, 00:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 13
Всего: 85



Цитата(disputant @  12.7.2012,  21:34 Найти цитируемый пост)
вижу, что без окна никак... Жаль :(

В принципе можно и без окна. 
nid.hWnd = GetDesktopWindow ();

Будет слать нотификейшны десктопу. 
Не совсем чисто, но должно работать.  (на всякий пожарный, лучше слать гарантированно свободное сообщение, от греха подальше)
nid.uCallbackMessage = WM_APP+1234;



PM MAIL   Вверх
disputant
Дата 13.7.2012, 12:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 210
Регистрация: 28.11.2011

Репутация: 1
Всего: 3



Цитата(volatile @ 13.7.2012,  00:06)
Цитата(disputant @  12.7.2012,  21:34 Найти цитируемый пост)
вижу, что без окна никак... Жаль :(

В принципе можно и без окна. 
nid.hWnd = GetDesktopWindow ();

Будет слать нотификейшны десктопу. 
Не совсем чисто, но должно работать.  (на всякий пожарный, лучше слать гарантированно свободное сообщение, от греха подальше)
nid.uCallbackMessage = WM_APP+1234;

Все, что ни делается - к лучшему: дописав создание окошка, я разогнался и таки написал взаимодействие с программой через меню пиктограммы в уведомлениях, что, в общем-то, было в очень дальних планах. Так что большое всем спасибо smile

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0507 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.