Комментарии 25
а идея то хороша, можно привязать к rgb подсветке внутри пк, что бы не делать спец лампу
p.s. недавно захотел себе сделать переключение языка по КАПСУ в win 11 и пришлось свой вариант написать, а то на autohotkey античит Battlefield 6 жаловался...
source (с#)
да писала нейронка, но работает безотказно, вроде как последняя версия (если не ошибся с файлом), а затем для exe делаем автозапуск от админа и работает везде (во всех окнах и приложениях)
using System;
using System.Diagnostics;
using System.Runtime.InteropServices;
class Program
{
private const int WH_KEYBOARD_LL = 13;
private const int WM_KEYDOWN = 0x0100;
private const int VK_CAPITAL = 0x14;
private static LowLevelKeyboardProc _proc = HookCallback;
private static IntPtr _hookID = IntPtr.Zero;
static void Main()
{
TurnOffCapsLock();
_hookID = SetHook(_proc);
MSG msg;
while (GetMessage(out msg, IntPtr.Zero, 0, 0))
{
TranslateMessage(ref msg);
DispatchMessage(ref msg);
}
UnhookWindowsHookEx(_hookID);
}
private static IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam)
{
if (nCode >= 0 && wParam == (IntPtr)WM_KEYDOWN)
{
int vkCode = Marshal.ReadInt32(lParam);
if (vkCode == VK_CAPITAL)
{
SendAltShift();
return (IntPtr)1;
}
}
return CallNextHookEx(_hookID, nCode, wParam, lParam);
}
private static void SendAltShift()
{
keybd_event(0x12, 0, 0, 0);
keybd_event(0x10, 0, 0, 0);
keybd_event(0x10, 0, 0x0002, 0);
keybd_event(0x12, 0, 0x0002, 0);
}
private static void TurnOffCapsLock()
{
if ((GetKeyState(VK_CAPITAL) & 0x0001) != 0)
{
keybd_event(VK_CAPITAL, 0x45, 0, 0);
keybd_event(VK_CAPITAL, 0x45, 0x0002, 0);
}
}
private static IntPtr SetHook(LowLevelKeyboardProc proc)
{
using (Process curProcess = Process.GetCurrentProcess())
using (ProcessModule curModule = curProcess.MainModule)
{
return SetWindowsHookEx(WH_KEYBOARD_LL, proc,
GetModuleHandle(curModule.ModuleName), 0);
}
}
private delegate IntPtr LowLevelKeyboardProc(int nCode, IntPtr wParam, IntPtr lParam);
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern IntPtr SetWindowsHookEx(int idHook, LowLevelKeyboardProc lpfn, IntPtr hMod, uint dwThreadId);
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
private static extern bool UnhookWindowsHookEx(IntPtr hhk);
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern IntPtr CallNextHookEx(IntPtr hhk, int nCode, IntPtr wParam, IntPtr lParam);
[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern IntPtr GetModuleHandle(string lpModuleName);
[DllImport("user32.dll")]
static extern bool GetMessage(out MSG lpMsg, IntPtr hWnd, uint wMsgFilterMin, uint wMsgFilterMax);
[DllImport("user32.dll")]
static extern bool TranslateMessage([In] ref MSG lpMsg);
[DllImport("user32.dll")]
static extern IntPtr DispatchMessage([In] ref MSG lpMsg);
[DllImport("user32.dll")]
static extern void keybd_event(byte bVk, byte bScan, uint dwFlags, int dwExtraInfo);
[DllImport("user32.dll")]
static extern short GetKeyState(int nVirtKey);
[StructLayout(LayoutKind.Sequential)]
public struct MSG
{
public IntPtr hwnd;
public uint message;
public IntPtr wParam;
public IntPtr lParam;
public uint time;
public Point pt;
}
[StructLayout(LayoutKind.Sequential)]
public struct Point
{
public int x;
public int y;
}
}
Прикольно, конечно. Но неужели человек не знаком с Punto Switcher?
Вполне знаком, но для меня не подходит.
Самая боль:
переключает язык не вовремя,
ломает пароли,
путается в аббревиатурах и коде.
В итоге править текст вручную быстрее, чем “умный” алгоритм.подозрения в слежке? Доверяете ему пароли?
Твои боли в программе купируются:
| переключает язык не вовремя
Предусмотрено отключение автоматического переключения (остается только по горячим клавишам).
| ломает пароли
Предусмотрено отключение Punto в избранных программах.
| путается в аббревиатурах
Предусмотрено ведение словаря слов, на какие не реагировать.
| подозрения в слежке
Использую версию Punto до ее покупки Яндексом. Подозрений нет.
Программа must have. Пользуюсь лет 15 каждый день. И в ней еще масса других полезных фич, например, настройки по автозамене или ведение дневника набора, который меня не раз выручал.
Повторю, что пытался использовать этот софт. Не зашло по причине того, что предсказуемость результата ввода резко падает. Т.е. еще хуже чем вообще без клавиатурного помощника.
Так, ещё раз -- можно ОТКЛЮЧИТЬ автопереключение раскладки, что убирает все Ваши проблемы, в т.ч. непредсказуемость ввода.
В этом случае Punto Switcher используется в двух случаях:
- если вы начали набирать в неправильной раскладке и сразу (в пределах одного слова) это увидели - нажимаете Pause;
- если набрано уже много слов в неправильной раскладке - выделяете этот текст и нажимаете Shift+Pause.
В обоих случаях текст "чинится", ещё и переключение в нужную раскладку происходит.
там, в углу экрана, мелким шрифтом притаилась надпись EN или RU
setxkbmap -option grp_led:scroll
Слушает изменения раскладки клавиатуры.
В реальном времени? Или по событию (нажатие клавиш, переключение окон)?
Плагин для Gnome генерирует DBUS событие при переключении раскладки. Служба на основе программы на python ждет события переключения и дает сигнал на смену цвета в контроллер arduino
По событию читается (передается в качестве аргумента) реальное состояние раскладки, или происходит изменение цвета относительно предыдущего запомненного состояния?
Если переключаются два окна, в которых разные раскладки, это событие отрабатывается?
Ну, в целом довольно неплохо, а предусмотрено ли то, что языков в раскладке будет не 2, а допустим, мне ещё периодически нужны всякие умляуты или ещё что-то более специфическое
Кубик красивый получился, тоже попробую как-нибудь такой собрать.
Для RGB-светодиода не обязательно целую ардуину ставить. Достаточно одного адаптера USB-RS485. Требование к адаптеру: он должен работать в 7-битном режиме на скорости 3 Мбит/с. Например, FTDI.
Идея красивая. Но я уже лет 15 пользуюсь более практичным решением. Когда смотришь на экран, а не на клавиатуру - максимум, что успеваешь набрать в неправильной раскладке - 3 символа. Более того, я все эти годы, на всех ОС настраиваю переключение раскладки по CapsLock (ну а для чего она еще нужна?), и лампочка на кнопке показывает мне раскладку. Тут правда возникнут проблемы у тех, кто использует более двух раскладок.
А не надо высматривать мелкий текст на экране – у меня вот прямо сейчас вообще индикация раскладки отсутствует (спрятана).
Нужно просто вместо ПЕРЕКЛЮЧЕНИЯ раскладки использовать два разных хоткея для ВКЛЮЧЕНИЯ нужной (En/Ru). В этом случае перед началом набора просто тыкается нужный хоткей, и, независимо от того, какая раскладка была до этого, набор начинается в правильной.
В Windows это можно сделать даже стандартными средствами системы, но там очень неудобные (для меня) варианты предлагаются, поэтому я использую Punto Switcher (En на левом Ctrl, Ru на правом).
Оффтоп. Почему не получила распространение моя идея? Выделив текст и переключив раскладку, получаем смену раскладки для уже напечатанного текста.
есть православная xneur, может озвучивать нажатия
то есть без всякой индикации, на слух можно понять в какой раскладке производится ввод
само собой, автопереключение — зло, отключаю всегда во всяких punto/ninja/xneur
одна беда, что делать, когда придёт wayland

Индикация смены раскладки клавиатуры в виде лампы с RGB-светодиодом для Gnome