2010-07-07 3 views
3

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

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

msgbox Chrw(1488) 

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

Мне кажется, что он отправляет знак вопроса персонажу, которого он не распознает. Я думаю, что MS Word или Notepad, если у них возникла проблема с отображением символа (например, когда шрифт не поддерживает символ), они будут отображать поле, а не знак вопроса. Конечно, в случае с Блокнотом в любом случае. Таким образом, это выглядит как проблема 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 
+0

Какие настройки раскладки клавиатуры вы установили, а какие ваши ** языковые настройки для программ, не поддерживающих Unicode **, в региональных и языковых настройках? – Helen

+1

Что касается языков и макетов. Язык Английский Великобритания с макетом English UK. Язык Английский США с раскладкой Английский США. Язык иврит с макетом иврита. Что касается «языка для программ, отличных от юникода», на английском языке США. Я попробовал иврит. В любом случае, msgbox отображает символ-Aleph для msgbox chrw (1488). (он всегда имеет значение). Но когда этот параметр «язык для программ, отличных от юникода» (который требует перезапуска), установлен в США, отображается блокнот? для sendkeys chrw (1488). Когда установлен на иврит, блокнот ничего не отображает для sendkeys chrw (1488). Так же не отображается символ для sendkeys chrw (1488). – barlop

+0

Я отредактировал ваше сообщение, чтобы улучшить форматирование, надеюсь, что вы не против. Если вы не против, не стесняйтесь редактировать назад. – Helen

ответ

3

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


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

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

  2. Позволяет выполнить функцию SendInput для отправки ключей, а не персонажей Алефа.

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


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

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

Хотя obj.SendKeys VBScript (в ..) не юникод известно, SendKeys.Send VB (в ..) будет.

+0

Хорошее исследование .. интерес. Я видел некоторые из таких вещей в Visual Basic лет назад (VK_SHIFT), константы для разных ключей. Это и доступ к API окон, доступный программисту в vbscript? Кажется, у меня нет книги, которая идет на нее. Я нашел эту ссылку, кто-то утверждал, что написал что-то, чтобы решить то, что похоже на эквивалентную проблему, в визуальном базовом http://vb.mvps.org/samples/SendInput/ Я не знаю, можно ли его переносить на VBScript. – barlop

+0

@barlop: Нет, VBScript не имеет доступа к Windows API. Однако вы можете создать настраиваемую утилиту, которая будет использовать необходимые функции WinAPI и вызвать эту утилиту из кода VBScript. – Helen

-2

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

+1

Нет, см. Исходный вопрос: «Я думаю, что MS Word или Блокнот, если у них возникла проблема с отображением символа (например, когда шрифт не поддерживает символ), они будут отображать поле, а не вопросительный знак. Конечно, в случае с «Блокнотом» в любом случае. » – Philipp

+1

right philipp. , раз новый roman или какой-либо шрифт, который я использую, безусловно, поддерживает символ aleph .. и поэтому, естественно, переход на шрифт ms sans serif (другой шрифт, который его поддерживает) не заставляет его работать. – barlop

+0

Хорошо, стоит Mhhh – Trefex

0

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

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

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

+0

Интересно .. и re «Что бы переопределить буфер обмена пользователей», вы можете заранее сохранить буфер обмена пользователя и сделать две строки: «Буфер обмена» («טקסט בעברית») и 'SendKeys («^V »)' и поместите его все, что было в буфере обмена, обратно в буфер обмена. Чтобы не переопределить/не потерять то, что находится в буфере обмена пользователя. – barlop

+0

Вы правы, я делаю это для себя, поэтому меня не волнует буфер обмена, но сохранение и восстановление буфера обмена действительно лучше (хотя есть проблема, когда содержимое буфера обмена не является чистым текстом) –