Я застрял здесь на 4 дня. Я сделал функцию, которая помещает программу в системный трей, но проблема здесь в том, что она не будет показывать заголовок и сообщение. Что я делаю неправильно? Я даже сделал отдельную функцию, чтобы определить, что windows os
мы работаем и инициализируем cbSize
на основе обнаруженного Os. Любая помощь будет оценена. Сильфон это функция.
РЕДАКТИРОВАТЬ: я использую Windows 7
и значок отображается в системном трее, но не показывает сообщение или заголовок. Я также делаю это консольное приложение прямо сейчас, так как это будет использоваться в качестве плагина в Unity3D
, Мне нужно решение, которое использует windows api, но не форму windows, так как я не хочу, чтобы из этого открывалось новое окно.
void createSystemTray()
{
HWND wHandler = GetDesktopWindow();
NOTIFYICONDATA iData;
ZeroMemory(&iData,sizeof(iData));if(getOsVersion()=="Windows Vista" || getOsVersion()=="Windows 7" || getOsVersion()=="Windows 8" || getOsVersion()=="Windows 8.1")
{
iData.cbSize = sizeof(NOTIFYICONDATA);
}
else if (getOsVersion()=="Windows XP"||getOsVersion()=="Windows XP Professional x64 Edition")
{
iData.cbSize = NOTIFYICONDATA_V3_SIZE;
}
else if (getOsVersion()=="Windows 2000")
{
iData.cbSize = NOTIFYICONDATA_V2_SIZE;
}
else if (getOsVersion()=="UNKNOWN OS")
{
//Assume we have old Windows Os such as Me,95....
iData.cbSize = NOTIFYICONDATA_V1_SIZE;
}
iData.hWnd = wHandler;
iData.uID = 100;
iData.uVersion = NOTIFYICON_VERSION_4;
iData.uCallbackMessage = WM_MESSAGE;
iData.hIcon = LoadIcon(NULL,(LPCTSTR)IDI_WARNING);
lstrcpy(iData.szTip,"My First Tray Icon");
lstrcpy(iData.szInfo,"My App Info");
lstrcpy(iData.szInfoTitle,"My Info Title");
iData.uFlags = NIF_MESSAGE|NIF_ICON|NIF_TIP;
Shell_NotifyIcon(NIM_SETVERSION,&iData); //called only when usingNIM_ADD
Shell_NotifyIcon(NIM_ADD,&iData);
}
я добавил NIF_INFO
к uFlags
и проблема ушла. Теперь он отображает все, включая текст, заголовок и заголовок информации.
Код ниже это то, что решил.
iData.uFlags = NIF_MESSAGE|NIF_ICON|NIF_TIP|NIF_SHOWTIP|NIF_INFO;
Ваша самая большая проблема с кодом в вопросе состоит в том, что вы передаете неправильный дескриптор окна. Вы должны передать одну из ваших оконных ручек. Но вместо этого вы передаете дескриптор окна рабочего стола.
Вам нужно будет создать окно и использовать его дескриптор. Окно не должно быть видимым. Я считаю, что вы можете использовать только окно сообщения.
Вы также должны позвонить NIM_SETVERSION
после NIM_ADD
,
Я очень скептически отношусь к тому, что переключение версий основано на проверке равенства строк. Ваш код сломается, например, в Windows 9. Использовать вспомогательные функции версии.
Вы также не выполняете проверку ошибок. Это не самая простая функция для вызова, но ваша неспособность проверить ошибки делает вещи еще сложнее, чем они должны быть. Пожалуйста, прочтите документацию и добавьте код проверки ошибок.