Я пытаюсь сделать простое приложение в системном трее. Вот сердце кода.
WNDCLASSEX wx = {};
wx.cbSize = sizeof( WNDCLASSEX );
wx.lpfnWndProc = WndProc; // function which will handle messages
wx.hInstance = hInstance;
wx.lpszClassName = szWindowClass;
if ( RegisterClassEx( &wx ) == 0 ) {
fileLogger->critical("Failed to register class");
return 0;
}
HWND hWnd = CreateWindowEx(
0, // _In_ DWORD dwExStyle,
szWindowClass, // _In_opt_ LPCTSTR lpClassName,
szTitle, // _In_opt_ LPCTSTR lpWindowName,
0, // _In_ DWORD dwStyle,
0, // _In_ int x,
0, // _In_ int y,
0, // _In_ int nWidth,
0, // _In_ int nHeight,
HWND_MESSAGE, // _In_opt_ HWND hWndParent,
NULL, // _In_opt_ HMENU hMenu,
hInstance, // _In_opt_ HINSTANCE hInstance,
NULL // _In_opt_ LPVOID lpParam
);
if ( hWnd == NULL )
{
fileLogger->critical("Failed to create window. Error code "+std::to_string(GetLastError()));
return 0;
}
NOTIFYICONDATA nid = {};
nid.uVersion = NOTIFYICON_VERSION_4;
nid.cbSize = sizeof( nid );
nid.hWnd = hWnd;
nid.guidItem = myGUID;
nid.uCallbackMessage = ICON_MESSAGE;
StringCchCopy( nid.szTip, sizeof( nid.szTip )/sizeof( nid.szTip[0] ), "Starting Client" );
// Loading a windows system icon for testing
LoadIconMetric( NULL, (PCWSTR)MAKEINTRESOURCE( IDI_ASTERISK ), LIM_LARGE, &(nid.hIcon) );
if ( ! Shell_NotifyIcon( NIM_ADD, &nid ) ) {
fileLogger->critical("Shell_NotifyIcon failure.");
return 0;
}
...
Когда я компилирую и запускаю исполняемый файл из командной строки, он создает пустое пространство в системном трее. Я также немедленно возвращаюсь (возможно, нормально), хотя процесс все еще выполняется. Я не вижу всплывающей подсказки при наведении курсора на пустой значок, и пустое место сохраняется до тех пор, пока я не завершу программу вручную. Иконка не передает сообщения на WndProc
, когда я нажимаю на нее.
Возможная подсказка: согласно каждой части документации, которую я видел, эта строка
LoadIconMetric( NULL, (PCWSTR)MAKEINTRESOURCE( IDI_ASTERISK ), LIM_LARGE, &(nid.hIcon) );
Должно быть
LoadIconMetric( NULL, MAKEINTRESOURCE( IDI_ASTERISK ), LIM_LARGE, &(nid.hIcon) );
Зачем мне вводить его, когда, очевидно, никто другой не делает?
Это может или не может быть связано с моей проблемой, но определенно подозрительно.