Как в WM_CREATE получить имя, заданное окну при создании? [закрыт]

119
25 апреля 2021, 08:30
Закрыт. Этот вопрос не по теме. Ответы на него в данный момент не принимаются.

Хотите улучшить этот вопрос? Обновите вопрос так, чтобы он вписывался в тематику Stack Overflow на русском.

Закрыт 1 год назад.

Улучшить вопрос

Создаётся окно:

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). Это имя будет динамическим, в зависимости от параметров инициализации приложения, поэтому делать его глобальным нельзя.

Как правильно получить имя окна в колбеке?

[UPDATE]

Кириллицу читает нормально, латиницу - нет. В уведомления могут посылаться разные комбинации символов, как типа A, так и W

Answer 1

1) const int size = 24;
2) memset(name, 0, sizeof(name)); у вас memset занулит только половину массива, т.к. ожидает размер в байтах.
3) Project -> Properties -> General: Character Set изменить на Use Unicode Character Set вместо Multi-byte

READ ALSO
Построение гистограммы WPF

Построение гистограммы WPF

Нужно сделать Гистограмму в wpf, но не простую, внутри каждой колонки гистограммы, должны быть другие маленькие колонки, сумма значений которых,...

207
Создание управление по типу игры Ballz

Создание управление по типу игры Ballz

Что же я прошу от вас(любому из этих пунктов я буду рад): 1)Скинуть видео урок или гайд как сделать такое управление 2)Дать ссылки на материал...

115