Поддерживает ли SendBeys VBscript Unicode? - PullRequest
3 голосов
/ 08 июля 2010

Я обнаружил, что VBscript SendKeys не поддерживает Unicode. Он поддерживает некоторые, такие как A-65, но не иностранные буквы, такие как буква Aleph (א) из еврейского алфавита. Вероятно, за пределами поддерживаемого диапазона. Может быть для десятичных значений 128+, он дает «?» И поддерживает только диапазон ASCII.

Я могу печатать и видеть буквы на иврите на моем компьютере, используя Windows XP. Так что поддержка ОС для персонажей есть и настроена. Мой исходный код демонстрирует это, так как строка

msgbox Chrw(1488)

отображает символ Aleph, и я отображал его в Блокноте и MS Word.

Мне кажется, что он отправляет знак вопроса для персонажа, которого он не распознает. Я думаю, что MS Word или Блокнот, если у них была проблема с отображением символа (например, когда шрифт не поддерживает символ), они отображали бы поле, а не знак вопроса. Конечно, в случае блокнота в любом случае. Так что похоже на SendKeys проблему. Есть идеи? Любое решение?

Dim objShell

Set objShell = CreateObject("WScript.Shell")

objShell.Run "notepad" ''#can change to winword

Wscript.Sleep 2000

msgbox Chrw(1488)  ''#aleph

objShell.SendKeys ("abc" & ChrW(1488) & "abc")  ''#bang, it displays a ? instead of an aleph

WScript.Quit

Ответы [ 3 ]

4 голосов
/ 09 июля 2010

Скорее всего, вы правы, что VBscript SendKeys не поддерживает Unicode .

Мониторинг вызовов функций Windows API, выполняемых SendKeys (с использованием API Monitor и Blade API Monitor в русской Windows XP с английскими клавиатурами США, русского и иврита) показывает, что SendKeys isnне знает Unicode.В частности, SendKeys выполняет следующие действия:

  1. Вызывает ANSI (не Unicode) версию функции VkKeyScan - VkKeyScanA - для получения виртуальногокод ключа персонажа для отправки.Эта функция переводит символ в VK_SHIFT + VK_OEM_2, поэтому кажется, что где-то до или в процессе символ Aleph преобразуется в другой символ ANSI.

  2. ВызываетSendInput функция для отправки VK_SHIFT + VK_OEM_2 нажатий вместо символа Aleph.

Основная проблема здесь заключается в том, чтобы отправить символ Unicode, SendInput должен вызываться с флагом KEYEVENTF_UNICODE, а соответствующий символ должен передаваться через параметры функции - эксперимент показывает, что это не так.Кроме того, VkKeyScan на самом деле не требуется в случае символа Unicode, так как SendInput сам обрабатывает ввод Unicode.

Учитывая это, единственный способ отправить входные данные Unicode в приложение из VBScript - это написать пользовательскую утилиту или компонент COM, который будет правильно использовать SendInput, и вызвать эту утилиту / компонент из вашего скрипта.(VBScript не имеет никаких собственных средств для доступа к API Windows.)

Примечание добавлено barlop

Хотя obj.SendKeys (..) vbscript не является юникодомПомните, что SendKeys.Send (..) VB будет.

1 голос
/ 13 января 2018

Я использую Dragon Naturally Speaking с ивритом, и SendKeys действительно не может отправлять ивритские символы, даже если они отображаются в редакторе макросов, однако я установил в буфер обмена нужный текст на иврите, а затем SendKeys с Ctrl-V для вставки, и это работает, просто SendKeys портит кодировку.

Clipboard("טקסט בעברית")
SendKeys("^V")

Это заменит пользовательский буфер обмена и не будет работать для смешивания командных символов (Ctrl, Alt, Shift) с ивритом, но это обходной путь.

0 голосов
/ 08 июля 2010

Попробуйте установить шрифт на Microsoft Sans Serif в Блокноте.

...