Как эмулировать нажатие кнопок в определенной раскладке?
Есть проблема - написал простую программу, вставляющую метку времени в текущее окно ввода посредством эмуляции нажатий кнопок, но есть одно "но":
"03ю03ю2019 18Ж48Ж58" :) как видите не совсем то, что должно быть, а именно если текущий язык ввода русский, то вместо "." (точка) печатается "ю", а вместо ":" (двоеточие) "Ж".
Есть идея сделать принудительный перевод раскладки из русской в английскую и такой способ есть, но тогда хотелось бы ее восстанавливать, но здесь другое "НО", как узнать какая раскладка, точнее язык ввода активен для текущего окна ввода?
банально numpad del: если точка - английская раскладка. если запятая, то русская
еще у винды есть инструмент для создания клавиатуры, с которым можно заморочиться
создать 2 раскладки и назначить точку и двоеточие на какие-нибудь ненужные клавиши (в обоих раскладках)
Для эмуляции ввода используйте SendInput API — оно позволяет эмулировать ввод любых символов и поддерживает юникод. Вот тут есть пример использования: https://github.com/nnCron/plugins/blob/master/send...
Ну или можете просто скачать, поставить ннкрон как приложение, плагины sendinput и strings, и использовать задачу примерно такого типа:
#( Вставка_даты
WatchHotKey: "@+d" \ Alt+Shift+D
SingleInstance
Action:
BEGIN
VK_MENU KEY-PRESSED?
[CHAR] D KEY-PRESSED? OR
VK_LSHIFT KEY-PRESSED? OR
WHILE
50 PAUSE
REPEAT
" %DD%/%MM%/%YYYY% %hh%:%mm%" AKEYS
)#
прикольно, но зачем изобретать велосипед, когда полно скриптовых языков типа руби/рнр/перл/питон из которых можно вызывать теже функции винапи?! неужели ннкрон может их переплюнуть?!
Да,а чем keybd_event хуже SendInput?
А что насчет текущей раскладки и конкретно языка ввода?!
Нашел семейство функций GetKeyboardLayout* но такое впечатление, что это не завершенное API, т.к. скажем GetKeyboardLayoutList возвращает список неких layout - не понятно, что под этим подразумевается, т.к. к примеру GetKeyboardLayoutName всегда возвращает строку 0000409 не зависимо от текущего языка ввода...
Вот именно! Вы как раз таки про изобретенные велосипеды и говорите — форт старше всех эти пхп, руби и питонов вместе взятых. Кроме того, как скриптовый язык по простоте реализации и возможностях он опять же их всех уделывает вместе взятых как стоячих (да и вряд ли вообще когда либо будет изобретено что-то более простое, и в тоже время гибкое). Известны случаи встраивания форта в девайсы с 256 байтами памяти, да именно байтами. Кроме того, он не только интерпретируемый, но еще и компилируемый, благодаря чему по скорости выполнения программ он стоит недалеко от С и ассемблера (это если не учитывать простоту вставки ассемблерного кода), а по компактности программ вообще на вершине. Вес самого ннкрона 430кб и пару мегабайт в оперативной памяти занимает. А там около порядка 3000-4000 слов (процедур), и это без учета плагинов. При этом он на лету в доли секунд интерпетирует и компилирует пару мегабайт исходников нескольких десятков плагинов. А у ближайшего аналога автоита один только дистрибутив 11 мегабайт. Кстати, существуют Форт-процессоры, для которых Форт как язык программирования является ассемблером. При этом существуют не только софт-процессоры (в ПЛИС), но и в реальном кремнии. Отличным примером форт-процессора в кремнии является чип SeaForth со 144 ядрами, созданный в 2012 году, размером в квадратный сантиметр, потребляющий 650 милливатт и выдающий 96 миллиардов операций в секунду с целыми числами (подробнее). На базе этого чипа был создан слуховой аппарат со средний вставной наушник и стоящий что-то около сотни-двух долларов и выдающий звук качеством лучше, чем все аналоги за тысячи долларов (но он вроде не получил широкого распространения, т.к. "задавили" производители более дорогих устройств или что-то в этом духе — точная и дальнейшая судьба данного устройства мне неизвестна). Ну и еще несколько примеров применения форта: загрузчик FreeBSD, космические аппараты NASA, различные встраиваемые системы, а еще Форт является отцом пост-скрипта, который используется для печати.
А что насчет текущей раскладки и конкретно языка ввода?!
SendInput как раз таки хороша тем, что не зависит от раскладки и языка ввода — какую строку ему передаешь, такую оно и печатает. Единственный минус: ввод в играх, т.к. там используются криворучные системы ввода — поэтому сендинпут работает лишь в некоторых играх, как и многие другие методы эмуляции ввода в винде.
VoidVolker, звучит заманчиво особенно на фоне гигабайтных архивов дистрибутивов :)
А что посоветуете для установки в качестве ОС на апельстнку (Orange Pi PC) ?
Нашел семейство функций GetKeyboardLayout* но такое впечатление, что это не завершенное API, т.к. скажем GetKeyboardLayoutList возвращает список неких layout - не понятно, что под этим подразумевается, т.к. к примеру GetKeyboardLayoutName всегда возвращает строку 0000409 не зависимо от текущего языка ввода...
звучит заманчиво особенно на фоне гигабайтных архивов дистрибутивов :)
Да, очень заманчиво. Но есть и минусы — слишком высокая гибкость, очень широкие возможности применения и отсутствие современных стандартов. Как результат — каждый программист на форте пишет в своем стиле, разные применения — разные, иногда даже противоположные требования — все это приводит к низкой совместимости различных форт систем. Именно систем, т.к. форт можно рассматривать как: ЯП, систему программирования, операционную систему, интерпретатор, компилятор и еще много как. Ннкрон по функционалу один из мощнейших автоматизаторов для Windows.
А что посоветуете для установки в качестве ОС на апельстнку (Orange Pi PC) ?
VoidVolker, rя бы рад не изобретать велосипед, но для меня хватит и самописного самоката в руках, нежели магическо-всесильного чуда-юда в облаках :)
я избалован ООП и для меня та портянка тяжела, мне бы что-то типа
desktop.keystoke(...) и просто и понятно, не нужно никакой документации, которую еще и найти нужно и скачать.
самое странное, что SendInput как-то отказывается работать, пробовал разные варианты :(
пока хреначу по старинке 04ю03ю2019 20Ж47Ж09
:)
Значит, как-то неправильно вызываете. Там все просто на самом деле, надо сделать вот такую структуру (слева - размер в байтах):
4 -- Тип события, 0 — мышь, 1 — клавиатура
2 -- Vk, VirtualKey — код символа в ANSI кодировке
2 -- Scan, Код символа в юникоде при использовании юникода
4 -- Flags, флаги
4 -- time
4 -- ExtraInfo
Остальное не нужно. Флагов для клавиатуры два:
0x2 KEYEVENTF_KEYUP
0x4 KEYEVENTF_UNICODE
Для отправки ANSI символа:
Записываем код символа в поле Vk, остальное по нулям.
Затем записываем в структуру флаг KEYEVENTF_KEYUP и еще раз отправляем.
Для юникода точно также, только еще ставим флаг KEYEVENTF_UNICODE, а символ записываем в поле Scan.
В SendInput передаем адрес структуры и её размер.