创建一个窗口:
MainWindow = CreateWindowExW(
WS_EX_TOPMOST,
MainWindowClass.lpszClassName,
L"Test Player",
WS_POPUPWINDOW | SW_HIDE,
0,0, GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN),
nullptr, nullptr, hInstance, nullptr);
在 WM_CREATE 处理程序中,我想创建一个具有适当名称的托盘菜单(在本例中为“Test Player”):
case WM_CREATE:{
if( Menu ) break;
HINSTANCE hInstance = (HINSTANCE)GetWindowLongW(hWnd,GWL_HINSTANCE);
Menu = CreatePopupMenu();
int size = 24;
wchar_t name[size];
memset(name,0,size);
GetWindowTextW(hWnd,name,size);
wprintf(L"%ls / %d\n",name,GetWindowTextLengthW(hWnd)); // T / 1
memset(&Tray, 0, sizeof (NOTIFYICONDATAW));
Tray.cbSize = sizeof(Tray);
Tray.hWnd = hWnd;
Tray.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP | NIF_INFO;
Tray.uCallbackMessage = WM_TRAY_MENU;
Tray.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(ICO_MAIN));
wcscpy(Tray.szTip, name);
Shell_NotifyIconW(NIM_ADD, &Tray);
但是通过GetWindowText
我分别只得到第一个字母“T”,并且名称的长度在控制台输出中显示 1 个字符GetWindowTextLengthW(hWnd)
。此名称将是动态的,具体取决于应用程序的初始化设置,因此您不能将其设为全局名称。
如何在回调中获取窗口的名称?
[更新]
西里尔文正常阅读,拉丁文 - 没有。通知可以发送不同的字符组合,包括类型A
和W
1)
const int size = 24;
2)
memset(name, 0, sizeof(name));
你的 memset 只会使数组的一半无效,因为 期望以字节为单位的大小。3)项目->属性->常规:将字符集更改为使用 Unicode 字符集而不是多字节