在下面撰寫的這個程式中,使用來自 user32.dll 的 GetKeyboardLayoutName。當我使用“English USA”布局輸入第一個符號時,我得到 00000409。這很好。但是當我將布局更改為其他內容時,例如“English UK”或“Russian”,GetKeyboardLayoutName 回傳“English USA”的代碼 - 00000409。
我對此進行了測驗,如果我在“俄語”中輸入第一個符號,它會回傳 00000419,如果我切換回“美國英語”并輸入第二個符號,GetKeyboardLayoutName 仍會回傳“俄語”的代碼 - 00000419。
using System;
using System.Runtime.InteropServices;
using System.Text;
namespace ConsoleApp2
{
class Program
{
const int KL_NAMELENGTH = 9;
[DllImport("user32.dll")]
private static extern long GetKeyboardLayoutName(StringBuilder pwszKLID);
public static string GetLayoutCode()
{
var name = new StringBuilder(KL_NAMELENGTH);
GetKeyboardLayoutName(name);
return name.ToString();
}
static void Main(string[] args)
{
Console.ReadKey();
var res = GetLayoutCode();
Console.WriteLine("\n" res);
Console.ReadKey();
res = GetLayoutCode();
Console.WriteLine("\n" res);
}
}
}
uj5u.com熱心網友回復:
問題是控制臺應用程式不允許您處理 Windows 訊息。
您可以將您的應用程式轉換為winforms應用程式,使主表單隱藏和子類WndProc來處理WM_INPUTLANGCHANGE在鍵盤布局更改時觸發的訊息:
public class MyHiddenForm : Form
{
...
protected override void WndProc(ref Message m)
{
const int WM_INPUTLANGCHANGE = 0x0051;
if (m.Msg == WM_INPUTLANGCHANGE)
{
Console.WriteLine("{0:X8} {1:X8}", m.WParam.ToInt64() , m.LParam.ToInt64());
}
base.WndProc(ref m);
}
}
另一種方法是通過 WinAPI 在將接收訊息的控制臺應用程式中創建一個隱藏視窗。但我個人更喜歡第一種方法。
uj5u.com熱心網友回復:
如果您不需要 KLID(鍵盤布局識別符號),而您只需要一種識別鍵盤布局的方法,那么您可以使用以下方法獲取 HKL(輸入區域設定識別符號):
var focusedHWnd = GetForegroundWindow();
var activeThread = GetWindowThreadProcessId(focusedHWnd, IntPtr.Zero);
var hkl = GetKeyboardLayout(activeThread);
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/376684.html
上一篇:突出顯示時XP彈出選單圖示不透明
