2010-07-07 75 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