Приведенный ниже код отправляет 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
После отправки WM_CHANGEUISTATE в оконное приложение мнемоника не отображается в системном меню при доступе к меню с пом ⇐ C++
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
CSS-мнемоника: как запомнить, используется ли # или . это для класса или идентификатора?
Anonymous » » в форуме CSS - 0 Ответы
- 12 Просмотры
-
Последнее сообщение Anonymous
-