基本上,我要做的是让getkeyboardlayoutname返回其他进程的键盘id(klid)。默认情况下,它只为我的应用程序窗口重新运行键盘ID。我也尝试了getkeyboardlayout,但它不可调地返回了一个hkl(它接受另一个窗口的hwnd)。
或者,如果有办法把一张港币兑换成荷兰盾,那也太好了,但我怀疑有这样的事情。
那么,我怎样才能做到这一点呢?我希望能够使用获得的klid作为loadkeyboardlayout函数的参数。
最佳答案
我想出了一个解决办法,以便能够检索另一个应用程序的键盘布局。过程很简单:
使用GetKeyboardLayout在另一个应用程序中获取键盘语言的hkl。要获得另一个应用程序的句柄,可以使用GETFEYBACKWORD窗口获取窗口的句柄,然后获取GetWindowThreadProcessId以获得具有先前检索的窗口句柄的进程句柄。
使用ActivateKeyboardLayout将先前提取的hkl设置为应用程序的键盘句柄。
获取应用程序的键盘语言ID(klid)。
最后,我的应用程序将使用与其他应用程序相同的键盘语言,并且从我的应用程序中,我可以很容易地提取KLID。
这是我在项目中使用的示例代码。希望对你也有帮助。
using System.Runtime.InteropServices;
...
StringBuilder Input = new StringBuilder(9);
[DllImport("user32.dll")]
static extern uint GetKeyboardLayoutList(int nBuff, [Out] IntPtr[] lpList);
[DllImport("user32.dll")]
private static extern IntPtr LoadKeyboardLayout(string pwszKLID, uint Flags);
[DllImport("user32.dll")]
static extern bool GetKeyboardLayoutName([Out] StringBuilder pwszKLID);
[DllImport("user32.dll")]
static extern IntPtr GetKeyboardLayout(uint idThread);
[DllImport("user32.dll")]
private static extern IntPtr GetForegroundWindow();
[DllImport("user32.dll")]
static extern uint GetWindowThreadProcessId(IntPtr hWnd, IntPtr ProcessId);
[DllImport("user32.dll")]
public static extern int ActivateKeyboardLayout(int HKL, int flags);
private static extern bool PostMessage(int hhwnd, uint msg, IntPtr wparam, IntPtr lparam);
private static uint WM_INPUTLANGCHANGEREQUEST = 0x0050;
private static int HWND_BROADCAST = 0xffff;
private static uint KLF_ACTIVATE = 1;
...
public StringBuilder GetInput()
{
IntPtr layout = GetKeyboardLayout(GetWindowThreadProcessId(GetForegroundWindow(), IntPtr.Zero));
ActivateKeyboardLayout((int)layout, 100);
GetKeyboardLayoutName(Input);
return Input;
}
public void SetInput(string InputID)
{
PostMessage(HWND_BROADCAST, WM_INPUTLANGCHANGEREQUEST, IntPtr.Zero, LoadKeyboardLayout(InputID, KLF_ACTIVATE));
}
该方法
GetInput()
返回一个StringBuilder,它可以使用ToString()
方便地转换成字符串,然后使用诸如SetInput()
的方法来设置键盘语言。