Написал переключалку языков на 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 решил код выложить.