2010-07-07 74 views
3

我发现VBscript的SendKeys不支持Unicode。它支持一些像A-65,但不包括像希伯来字母表中的Aleph(א)这样的外来字母。 Prob超出支持范围。可能是128+的十进制值,它给出了一个“?”,它只支持ASCII范围。VBscript的SendKeys支持Unicode吗?

我可以使用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 
+0

你已经安装了哪些键盘布局,以及你的** Languange用于非Unicode程序**在区域和语言选项中设置? – Helen 2010-07-07 22:08:55

+1

至于语言和布局。语言英语英国与布局英语英国。语言英语美国与布局英语美国。语言希伯来语与布局希伯来语。至于“非unicode程序的语言”,英语美国。我试过希伯来语。无论哪种方式,msgbox都会显示msgbox chrw(1488)的字符Aleph。 (它总是)但是当设置“non-unicode程序的语言”(需要重启)时,设置为US,记事本显示?为sendkeys chrw(1488)。当设置为希伯来语时,记事本不会为sendkeys chrw(1488)显示任何内容,因此仍然不会显示sendkeys chrw(1488)的字符。 – barlop 2010-07-08 00:08:37

+0

我编辑了你的文章来改善格式,希望你不介意。如果你确实介意,请随时编辑回来。 – Helen 2010-07-08 08:35:18

回答

3

你很有可能猜对了VBscript的SendKeys不支持Unicode


SendKeys(俄罗斯的Windows XP美国英语,俄语和希伯来语键盘使用API MonitorBlade API Monitor)执行Windows API函数调用监测显示,SendKeys不支持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标志和问题必须通过函数参数传递的字符被称为 - 的实验表明,这一切都不是这样的。另外,在Unicode字符的情况下,实际上不需要VkKeyScan,因为SendInput本身处理Unicode输入。


鉴于此,为Unicode输入发送到从VBScript的应用程序的唯一方法是编写一个定制的实用程序或COM组件,将利用SendInput正确,并从你的脚本中调用该实用程序/组件。 (VBScript没有任何本地方法来访问Windows API。)由barlop

虽然VBScript的obj.SendKeys(..)不支持Unicode添加

注意,VB的SendKeys.Send(..)会。

+0

好的研究..有趣..我在Visual Basic几年前(VK_SHIFT)中看到过一些这样的事情,这是各种键的常量。那是不是也可以通过vbscript访问windows API的程序员?我似乎没有一本书可以阅读。 我确实发现这个链接,有人声称已经写了一些东西来解决看起来像等效问题,在视觉基本 http://vb.mvps.org/samples/SendInput/ 我不知道它是否可以转移到的VBScript。 – barlop 2010-07-09 21:16:47

+0

@barlop:不,VBScript无法访问Windows API。但是,您可以创建一个自定义实用程序,该实用程序将使用必要的WinAPI函数并从VBScript代码中调用该实用程序。 – Helen 2010-07-12 13:32:58

-2

尝试在记事本中将字体设置为Microsoft Sans Serif

+1

不,请参阅原始问题:“我认为MS Word或记事本,如果他们确实有问题显示一个字符(例如,当字体不支持字符),他们会显示一个盒子,而不是一个问号。无论如何在记事本的情况下。“ – Philipp 2010-07-08 08:51:54

+1

right philipp。另外,Arial ,时间新罗马,或任何我使用的字体,当然支持aleph字符..所以自然,更改为ms sans serif字体(支持它的另一种字体)不会使其工作。 – barlop 2010-07-08 09:09:53

+0

好的,值得试试 Mhhh – Trefex 2010-07-08 10:41:38

0

我使用Dragon自然地使用希伯来语,SendKeys确实无法发送希伯来字符,即使它们在宏编辑器中显示,但是,我所做的是将剪贴板设置为我想要的希伯来文本,然后将SendKeys用Ctrl-V粘贴,并且确实有效,它只是SendKeys与编码混淆。

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

这将覆盖用户剪贴板,并不会混合命令字符(Ctrl,Alt,Shift键)与希伯来文字工作,但它是一个变通。

+0

有趣的..和重新“这将覆盖用户剪贴板”,你可以预先保存用户的剪贴板,并做两行'剪贴板(“טקסטבעברית”)'和 'SendKeys(“^ V”)'并把它无论是在剪贴板中,回到剪贴板。以便不会覆盖/丢失用户剪贴板中的内容。 – barlop 2018-01-13 07:47:23

+0

你说得对,我是为自己做的,所以我不关心剪贴板,但保存和恢复剪贴板确实更好(尽管剪贴板内容不是纯文本时存在问题) – 2018-01-14 08:24:38