簡體   English   中英

LoadKeyboardLayout不會更改鍵盤布局

[英]LoadKeyboardLayout doesn't change keyboard layout

我正在嘗試將鍵盤布局更改為英語,但更改未反映在Windows中。

布局已安裝,我已經使用GetKeyboardLayoutList進行了檢查。

屏幕截圖

碼:

#include <windows.h>

int main()
{
    LoadKeyboardLayout("00000409", KLF_ACTIVATE);
    return 0;
}

GetKeyboardLayoutName顯示語言已更改,但在Windows中看不到

測試代碼:

#include <windows.h>
#include <iostream>
using namespace std;

int main()
{
    TCHAR keyboard[KL_NAMELENGTH];
    GetKeyboardLayoutName(keyboard);
    cout << keyboard << endl;

    LoadKeyboardLayout("00000409", KLF_ACTIVATE);

    GetKeyboardLayoutName(keyboard);
    cout << keyboard << endl;

    return 0;
}

輸出:

00000405
00000409
[Finished in 2.2s]

更新:嘗試在不同的Windows計算機上運行.exe,結果相同

使用鍵盤布局非常棘手,對於控制台和GUI應用程序則有所不同。 而且, LoadKeyboardLayout是, LoadKeyboardLayout僅使布局“可用”以進行激活。

圖形用戶界面

  1. 應用程序必須具有GetMessageTranslateMessageDispatchMessage周期。 (崇高具有GetMessage周期)
  2. 您可以通過兩次順序調用來切換布局

     DWORD dwNewKeybLayout = 0x00000409; // Layout must be already loaded! PostMessage(hWnd, WM_INPUTLANGCHANGEREQUEST, 0, (LPARAM)dwNewKeybLayout); PostMessage(hWnd, WM_INPUTLANGCHANGE, 0, (LPARAM)dwNewKeybLayout); 

安慰

具有int main()的應用程序是控制台應用程序,它沒有GetMessage循環。 所有消息都由conhost本身處理。 這就是為什么您的GetKeyboardLayoutName將不會返回正確的結果。 決不! 沒門!

但是,您仍然可以更改在此控制台窗口中運行的所有進程的布局。 但是請記住,托管服務器會異步處理消息,並且實際布局(您無法確定或檢查)可能會在一段時間后更改。

    HWND hCon = GetConsoleWindow();
    DWORD dwNewKeybLayout = 0x00000409; // Layout must be already loaded!
    PostMessage(hCon, WM_INPUTLANGCHANGEREQUEST, 0, (LPARAM)dwNewKeybLayout);
    PostMessage(hCon, WM_INPUTLANGCHANGE, 0, (LPARAM)dwNewKeybLayout);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM