После отправки WM_CHANGEUISTATE в оконное приложение мнемоника не отображается в системном меню при доступе к меню с помC++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Гость
 После отправки WM_CHANGEUISTATE в оконное приложение мнемоника не отображается в системном меню при доступе к меню с пом

Сообщение Гость »

Приведенный ниже код отправляет WM_CHANGEUISTATE самой оконной процедуре с аргументами:
LOWORD(wParam) = UIS_CLEAR
HIWORD( wParam) = UISF_HIDEACCEL
lParam = 0x00000000
при щелчке левой кнопкой мыши по клиентской области окна.
Согласно блогу Раймонда Чена, это должно привести к отображению мнемоники в системном меню при доступе к меню с помощью мыши. Приведенный ниже абзац был взят из этой статьи:

При снятии флага отображается соответствующий индикатор. Например, если у вас
есть UIS_CLEAR для UISF_HIDEFOCUS, это означает, что вы хотите отображать
индикаторы фокуса.

В моем В этом случае у меня есть UIS_CLEAR для UISF_HIDEACCEL, что означает, что я хочу показать ускорители меню.
Если вы запустите приведенный ниже код и щелкните левой кнопкой мыши в клиентской области приложения, вы должен сделать ускорители видимыми в системном меню, даже если к этому меню осуществляется доступ с помощью мыши. Но этого не происходит, т. е. если вы активируете системное меню щелчком левой кнопки мыши по значку окна или щелчком правой кнопкой мыши по строке заголовка окна, мнемоника в меню «Система» отображаться не будет. Чего мне не хватает?
#include
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR pszCmdLine, int nCmdShow)
{
WNDCLASSEX wndclassx;
wchar_t szAppName[] = L"WM_CHANGEUISTATE";

wndclassx.cbSize = sizeof(WNDCLASSEX);
wndclassx.style = CS_HREDRAW | CS_VREDRAW;
wndclassx.lpfnWndProc = WndProc;
wndclassx.cbClsExtra = 0;
wndclassx.cbWndExtra = 0;
wndclassx.hInstance = hInstance;
wndclassx.hIcon = 0;
wndclassx.hCursor = LoadCursor(0, IDC_ARROW);
wndclassx.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
wndclassx.lpszClassName = szAppName;
wndclassx.lpszMenuName = nullptr;
wndclassx.hIconSm = 0;

if (!RegisterClassEx(&wndclassx)) return 0;

HWND hWnd = CreateWindow(szAppName, szAppName, WS_OVERLAPPEDWINDOW | WS_HSCROLL | WS_VSCROLL,
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, 0, 0, hInstance, 0);

ShowWindow(hWnd, SW_MAXIMIZE);
UpdateWindow(hWnd);

MSG msg;
while (GetMessage(&msg, 0, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}

return (int)msg.wParam;
}

LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_LBUTTONUP:
{
BOOL b;

// Note that in my system (Windows 10) I have:
//
// Control Panel > Ease of Access > Ease of Access Center > Make the keyboard easier
//
// and the option "Underline keyboard shortcuts and access keys" unmarked (the default). Therefore, the value
// returned in b below will be 0x00000000 (FALSE).

SystemParametersInfo(SPI_GETKEYBOARDCUES, 0, &b, 0);

// If b = FALSE, the SendMessage() below should underline the accelerators in the System menu, when this menu is
// accessed with the mouse. But that doesn't work. Why?

if( !b ) SendMessage(hwnd, WM_CHANGEUISTATE, MAKEWPARAM(UIS_CLEAR, UISF_HIDEACCEL), NULL);
}
break;

// Setting a break in the return below, one can see that WM_CHANGEUISTATE message is being sent to the window and
// passed to DefWindowProc().

case WM_CHANGEUISTATE:
return DefWindowProc(hwnd, message, wParam, lParam);

case WM_DESTROY:
PostQuitMessage(0);
break;

default:
return DefWindowProc(hwnd, message, wParam, lParam);
}
return 0;
}


Подробнее здесь: https://stackoverflow.com/questions/473 ... -not-shown
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»