Написал переключалку языков на CAPSLOCK

Вчера вдруг осознал, насколько удобней будет переключать RUS/ENG не привычным CTRL+SHIFT, а клавишей CAPS LOCK, учитывая, что я использую слепой 10-типальцевый метод и для русского, и для английского текста. (Тогда пальцы не нужно будет центрировать заново каждый раз)

Как оказалось, в Windows 10 нельзя выбрать такой вариант. Но есть некоторые сторонние программки для этого дела. И тут мне захотелось самому быстренько такую зафигачить.

Сначала кое-как вымучил такую утилитку на Go. Офигел от кривости этого всего кода, с кучей обвязок для Win32 API. В общем, получил прямо эстетическую травму. :)

В следствие чего психанул и решил сделать то же самое на языке Nim. Давно все присматриваюсь к нему, а тут хороший такой повод.

И вот тут, наконец, я получил только позитивные эмоции. :) Вот такая красота получилась в итоге. Всего менее 20 строк. И получаем утилитку, после запуска которой CAPS LOCK будет работать только как переключатель языка ввода.

# Minimal Language Layout Switcher
# Building: nim c --app:gui caps_lock_lang_switcher.nim 
import winim

proc HookCallback(nCode: int32, wParam: WPARAM, lParam: LPARAM): LRESULT {.stdcall.} =
    if nCode == HC_ACTION and wParam == WM_KEYDOWN:
        var kbdstruct: PKBDLLHOOKSTRUCT = cast[ptr KBDLLHOOKSTRUCT](lparam)
        if byte(kbdstruct.vkCode) == VK_CAPITAL:
            PostMessage(GetForegroundWindow(), WM_INPUTLANGCHANGEREQUEST, 2, 0)
            return 1 # filter this key
    return CallNextHookEx(0, nCode, wParam, lParam)

SetWindowsHookEx(WH_KEYBOARD_LL, (HOOKPROC) HookCallback, 0,  0)
PostMessage(0, 0, 0, 0) # activating process message queue (without any window)
# But if we want to stop we need to terminate process in Task Manager!

var msg: MSG
while GetMessage(msg.addr, 0, 0, 0):
discard

P.S. На всякий случай даже на Github решил код выложить.