Определить раскладку клавиатуры

90 views
Skip to first unread message

Дмитрий Фролов

unread,
Jul 15, 2018, 10:19:47 AM7/15/18
to Golang Russian
Хочу получить под windows текущий язык ввода активного окна

var (
    user32                      
= syscall.NewLazyDLL("user32.dll")
    procGetKeyboardLayoutName    
= user32.NewProc("GetKeyboardLayoutNameA")
    procGetKeyboardLayout        
= user32.NewProc("GetKeyboardLayout")
    procGetForegroundWindow      
= user32.NewProc("GetForegroundWindow")
    procGetWindowThreadProcessID
= user32.NewProc("GetWindowThreadProcessId")
)

func
GetForegroundWindow() (hwnd syscall.Handle, err error) {
    r0
, _, e1 := syscall.Syscall(procGetForegroundWindow.Addr(), 0, 0, 0, 0)
   
if e1 != 0 {
        err
= error(e1)
       
return
   
}
    hwnd
= syscall.Handle(r0)
   
return
}

func
GetWindowThreadProcessID(hwnd syscall.Handle) (uintptr, int) {
   
var processID int
    ret
, _, _ := procGetWindowThreadProcessID.Call(
        uintptr
(hwnd),
        uintptr
(unsafe.Pointer(&processID)))

   
return uintptr(ret), processID
}

func main
() {

   
for {
       
var str *string
        n
, _, err := procGetKeyboardLayoutName.Call(uintptr(unsafe.Pointer(&str)))
        fmt
.Println(n, str, err)

       
Handle, _ := GetForegroundWindow()
        _
, processID := GetWindowThreadProcessID(Handle)

        hklLayout
, _, err2 := procGetKeyboardLayout.Call(uintptr(processID))
        fmt
.Println(hklLayout, processID, err2)

        hklLayout
, _, err2 = procGetKeyboardLayout.Call(uintptr(0))
        fmt
.Println(hklLayout, err2)

        time
.Sleep(5000 * time.Millisecond)
   
}

}

Получаю следующее:
1 0x3931343030303030 The operation completed successfully.
0 5388 The operation completed successfully.
68748313 The operation completed successfully.
1 строка: procGetKeyboardLayoutName возвращает всегда русскую раскладку несмотря на переключения языка
2 строка: при переключении между окнами processID меняется, возвращает всегда 0
3 строка: возвращает всегда 68748313, что это значит вообще не пойму.
В интернете много примеров кейлоггера, но не видел как определить раскладку, видимо англоязычных это не интересует.


Daniel Podolsky

unread,
Jul 15, 2018, 10:22:01 AM7/15/18
to gola...@googlegroups.com
Это не про go вопрос, а про win api. 

--
Вы получили это сообщение, поскольку подписаны на группу "Golang Russian".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес golang-ru+...@googlegroups.com.
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.
Reply all
Reply to author
Forward
0 new messages