c++ - Shell_NotifyIcon 在系统托盘中创建空白、无响应的图标
问题描述
我正在尝试制作一个简单的系统托盘图标应用程序。这是代码的核心。
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) );
当显然没有其他人这样做时,为什么我必须对其进行类型转换?
这可能与我的问题有关,也可能无关,但绝对是可疑的。
解决方案
第一件事是您没有设置标志来指示提供了哪些字段:
nid.uFlags = NIF_ICON | NIF_TIP | NIF_GUID | NIF_MESSAGE;
我还怀疑您可能混合了 Unicode / ASCII 代码。您应该明确使用宽字符版本的函数。
推荐阅读
- c# - 将类对象的可观察集合绑定到 ListBox 和 UserControl (WPF)
- sql - 使用局部变量在 SQL 中设置表字段
- c++ - 使用线程类在 C++ 中构造动态线程数组时出错
- c# - 使用泛型和接口时如何解决“无隐式引用转换”问题
- angular - 得到以下错误 => ERROR 错误:ViewDestroyedError:尝试使用已破坏的视图:detectChanges
- elasticsearch - Elasticsearch 未启动 Search Guard 错误
- android - Android.Views.InflateException:'二进制 XML 文件第 2 行:二进制 XML 文件第 2 行:膨胀类片段时出错'
- node.js - 在 Heroku Hobby 上托管一个小型企业网站?
- html - 在 Servicenow 中需要有关 CSS 内联对齐的帮助
- javascript - 如何在 highchart 列单击时显示弹出窗口