首页 > 解决方案 > 如何将缓冲区转换为字符串

问题描述

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

我发现这个函数是从以下位置调用GetKeyboardLayoutNameAuser32.dllhttps ://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-getkeyboardlayoutnamea

它只接受一个参数,并指向存储区域设置标识符的缓冲区:

接收输入语言环境标识符名称的缓冲区(长度至少为 KL_NAMELENGTH 个字符),包括终止空字符。这将是提供给 LoadKeyboardLayout 函数的字符串的副本,除非发生布局替换。

所以我写了这个脚本,我曾经StrGet将缓冲区转换为String,这似乎不起作用。我在这里做错了什么?

F7::
    VarSetCapacity(LocaleID, 8, 0)
    DllCall("GetKeyboardLayoutNameA", "Str", LocaleID)
    MsgBox, % LocaleID
    clipboard := StrGet(LocaleID)
Return

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

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

标签: autohotkey

解决方案


摆脱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)


推荐阅读