我使用两种键盘布局(两种语言),而对于正在编写的脚本,我需要获取当前的键盘布局。
我从GetKeyboardLayoutNameA
:https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-getkeyboardlayoutnamea
user32.dll
的函数。
它仅接受一个参数,并指向区域标识符存储在其中的缓冲区:
用于接收输入语言环境标识符名称的缓冲区(长度至少为KL_NAMELENGTH个字符),包括终止的空字符。除非进行布局替换,否则这将是提供给LoadKeyboardLayout函数的字符串的副本。
因此,我编写了此脚本,并使用StrGet
将缓冲区转换为String,这似乎不起作用。我在这里做什么错了?
F7::
VarSetCapacity(LocaleID, 8, 0)
DllCall("GetKeyboardLayoutNameA", "Str", LocaleID)
MsgBox, % LocaleID
clipboard := StrGet(LocaleID)
Return
脚本只是一个例子,我的问题是:
如何访问数据缓冲区并获取其价值?
答案 0 :(得分:0)
摆脱StrGet
,它会正常工作。 StrGet
采用地址参数:
将在其中写入/读取字符串的地址。
但是LocaleID
不是地址。
此外,您可以使用它来获取键盘的LocaleID
:
F7::
SetFormat, Integer, H
WinGet, WinID,, A
ThreadID:=DllCall("GetWindowThreadProcessId", "UInt", WinID, "UInt", 0)
LocaleID:=DllCall("GetKeyboardLayout", "UInt", ThreadID, "UInt")
MsgBox, %LocaleID%
clipboard := LocaleID
Return
键盘标识符列表(可能会有帮助): https://msdn.microsoft.com/en-us/ie/dn938363(v=vs.94)