首页 > 解决方案 > win32 窗口阻止键盘布局更改

问题描述

我遇到了一个问题,即当应用程序处于焦点时,用户无法更改键盘布局。单击任务栏中的语言首选项或使用快捷键 Alt+Shift 时,它不起作用。我也没有收到任何WM_INPUTLANGCHANGEREQUESTWM_INPUTLANGCHANGE事件,这是我所期望的。

#include <Windows.h>
#include <stdio.h>

static int close_requested = 0;

static LRESULT CALLBACK wnd_proc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    switch (msg) {
    case WM_CLOSE:
        close_requested = 1;
        break;
    case WM_INPUTLANGCHANGE:
        puts("WM_INPUTLANGCHANGE");
        break;
    case WM_INPUTLANGCHANGEREQUEST:
        puts("WM_INPUTLANGCHANGEREQUEST");
        break;
    }

    return DefWindowProc(hWnd, msg, wParam, lParam);
}

int main(void)
{
    const HINSTANCE hInst = GetModuleHandle(NULL);

    const WNDCLASS wc = {
        .hInstance = hInst,
        .hIcon = LoadIcon(NULL, IDI_APPLICATION),
        .lpszClassName = TEXT("test-class"),
        .lpfnWndProc = wnd_proc,
    };

    RegisterClass(&wc);

    const HWND hWnd = CreateWindowEx(0, TEXT("test-class"), TEXT("Test"), WS_OVERLAPPEDWINDOW | WS_VISIBLE, 0, 0, 1920, 1080, NULL, NULL, hInst, NULL);

    while (!close_requested) {
        MSG msg;
        while (PeekMessage(&msg, hWnd, 0, 0, PM_REMOVE)) {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    }

    DestroyWindow(hWnd);
    return 0;
}

我不确定是什么导致我的应用程序阻止用户更改其键盘布局。我一直在用US International键盘Microsoft IME进行测试。English (United States)如果键盘保持不变,例如 a和 aEnglish (United Kingdom)具有相同的键盘布局 ( US International) ,我也无法更改语言首选项。

是否有任何我应该处理的 Windows 消息,或者在创建窗口时是否需要设置任何其他标志?

标签: cwinapikeyboard

解决方案


我认为您使用的消息循环导致了问题。将消息循环修改为:

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

它可以为我工作,我建议你参考使用消息和消息队列来澄清两个消息循环之间的区别。

编辑:

您也可以使用:

while (!close_requested) {
    MSG msg;
    while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
}

错误原因由 IInspectable 给出:过滤窗口消息的危险


推荐阅读