如何将缓冲区转换为字符串

时间:2019-03-26 19:30:32

标签: autohotkey

我使用两种键盘布局(两种语言),而对于正在编写的脚本,我需要获取当前的键盘布局。

我从GetKeyboardLayoutNameAhttps://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

脚本只是一个例子,我的问题是:

如何访问数据缓冲区并获取其价值?

1 个答案:

答案 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)