Как преобразовать буфер в строку - PullRequest
1 голос
/ 26 марта 2019

Я использую две раскладки клавиатуры (два языка), и для написания скриптов мне нужно получить текущую раскладку клавиатуры.

Я нашел эту функцию под названием GetKeyboardLayoutNameA из user32.dll:https://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

Сценарий является лишь примером, мой вопрос:

Как получить доступ к буферу данных и получить его значение?

1 Ответ

0 голосов
/ 26 марта 2019

Избавьтесь от 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)

...