VBscript 的 SendKeys 是否支持 Unicode?

bar*_*lop 5 unicode vbscript sendkeys hebrew

我发现 VBscriptSendKeys不支持 Unicode。它支持 A-65 等一些字母,但不支持希伯来字母表中的字母 Aleph (א) 等外来字母。问题超出其支持范围。对于 128+ 的十进制值,它会给出一个“?”,并且仅支持 ASCII 范围。

我可以在使用 Windows XP 的计算机上键入并查看希伯来语字母。因此,操作系统对角色的支持已经存在并已设置。我的源代码表明,由于该行

msgbox Chrw(1488)
Run Code Online (Sandbox Code Playgroud)

显示 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
Run Code Online (Sandbox Code Playgroud)

Hel*_*len 6

您的猜测很可能是正确的,VBscriptSendKeys不支持 Unicode

\n
\n

SendKeys在俄语 Windows XP 上使用Blade API Monitor执行的 Windows API 函数调用(使用美国英语、俄语和希伯来语键盘)的监视显示,它SendKeys不支持 Unicode。具体来说,SendKeys做了以下几件事:

\n
    \n
  1. 调用 ANSI(非 Unicode)版本的VkKeyScan函数 \xe2\x80\x94 VkKeyScanA\xe2\x80\x94 来获取要发送的字符的虚拟键代码。该函数将字符转换为VK_SHIFT+ VK_OEM_2,因此看起来在该过程之前或过程中的某个地方,Aleph 字符被转换为不同的 ANSI 字符。

    \n
  2. \n
  3. 调用该SendInput函数来发送VK_SHIFT+VK_OEM_2击键而不是 Aleph 字符。

    \n
  4. \n
\n

这里的主要问题是,要发送 Unicode 字符,SendInput必须使用KEYEVENTF_UNICODE标志调用,并且必须通过函数参数 \xe2\x80\x94 传递有问题的字符,实验表明情况并非如此。另外,VkKeyScan对于 Unicode 字符,实际上并不需要它,因为SendInput它本身处理 Unicode 输入。

\n
\n

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

\n

barlop 添加的注释:虽然 VBScriptobj.SendKeys(..)不支持 Unicode,但 VBSendKeys.Send(..)可以。

\n