2015-04-19 121 views
-1

(我試圖讓SendKeys代碼從互聯網上使用擴展字符工作。)Sendkeys是模仿VB SendKeys。我在互聯網上看到了幾種算法,以及Delphi 7自帶的算法。我的程序使用它來將擊鍵發送到其他程序,以使數據輸入更快更一致。除了Ord()用255以上的數字報告的字符以外,它的效果很好。獲取用於SendKeys的Alt +數字鍵盤的鍵控代碼

自發布此問題後,我發現字符映射報告Alt + 0128到Alt + 255。事實證明,只有26個這樣的字符由Ord()報告,看起來是一個unicode值。所以我現在有一個醜陋的工作,只是用Ord()報告的值替換字符映射報告的替代值,更低值。所以我的Sendkeys現在看起來與記事本中的Ansi編碼兼容。

我希望像AnsiChar()這樣簡單的字符轉換,但卻產生了完全錯誤的Ord()值。

我對所有這個問題都使用Delphi XE2和Arial字體。 Windows字符映射實用程序報告Alt + 0147創建「左雙引號」。

這個組合鍵提供了「Delphi控件,記事本和Word中的字符」。

我所有的互聯網的研究說,使用奧德()來確定一個字符的數值:

Procedure ShowNumericKeypadCode(ch: Char); 
begin 
    showmessage('Key code = ' + Format('%4.4d',[Ord(ch)])); 
end; 

但這返回8220,而不是0178. Alt + 8220的產量∟在記事本和Delphi控制,但它仍然產生「在Word中。

這顯然是與安思對Unicode的,但我無法弄清楚如何寫在Delphi中的函數將返回0178,而不是8220

ICONV不會因爲目標有幫助是有一個獨立的計劃。謝謝。

+0

我們不知道是什麼'SendKeys'是。然而,僞造更復雜的鍵盤輸入是棘手的。通常取決於鍵盤佈局。也許如果你能解決你的問題而不冒昧的輸入僞裝,你會有更多的快樂。 –

回答

0

您可能可以使用character 0xc286 of encoding 「UTF-8」 has no equivalent in 「WIN1252」…On conversion with iconv postgres restore crashes中提到的(外部)程序iconv。這是指可從GNU Win32網站下載的程序。

鑑於iconv的實現,可以UTF-8轉換爲ASCII這樣的:

iconv -f UTF8 -t US-ASCII//TRANSLIT -o outputfile inputfile 

關於進一步的討論,這些可以幫助(大約有直接使用iconv.dll一些評論):

0

事實證明,對於可以通過數字小鍵盤輸入的高位ASCII字符,字符映射實用工具會報告從Alt + 0128到Alt + 0255的鍵碼。它還用十六進制值報告更多的unicode字符。如果您將該值轉換爲十進制,則也可以通過Alt +數字小鍵盤輸入。我從來沒有發現爲什麼Ord()報告8220的Unicode值,但十六進制是201C,字符映射表示與0178相同的字符。我發現在0128到0255之間的範圍內,Ord()僅報告26個字符,其中包含unicode值,而不是高位ASCII值。這允許一個醜陋的解決方法:

numStr := Format('%4.4d',[Ord(ch)]); 
 
     numStr := AnsiReplaceStr (numStr,'8216','0145'); //Convert from Unicode to Ansi to work with Notepad AND Word 
 
     numStr := AnsiReplaceStr (numStr,'8217','0146'); 
 
     numStr := AnsiReplaceStr (numStr,'8220','0147'); 
 
     numStr := AnsiReplaceStr (numStr,'8221','0148'); 
 
     numStr := AnsiReplaceStr (numStr,'0381','0141'); 
 
     numStr := AnsiReplaceStr (numStr,'8226','0149'); 
 
     numStr := AnsiReplaceStr (numStr,'8211','0150'); 
 
     numStr := AnsiReplaceStr (numStr,'8364','0128'); 
 
     numStr := AnsiReplaceStr (numStr,'8218','0130'); 
 
     numStr := AnsiReplaceStr (numStr,'0402','0131'); 
 
     numStr := AnsiReplaceStr (numStr,'8222','0132'); 
 
     numStr := AnsiReplaceStr (numStr,'8230','0133'); 
 
     numStr := AnsiReplaceStr (numStr,'8224','0134'); 
 
     numStr := AnsiReplaceStr (numStr,'8225','0135'); 
 
     numStr := AnsiReplaceStr (numStr,'0710','0136'); 
 
     numStr := AnsiReplaceStr (numStr,'8240','0137'); 
 
     numStr := AnsiReplaceStr (numStr,'0352','0138'); 
 
     numStr := AnsiReplaceStr (numStr,'8249','0139'); 
 
     numStr := AnsiReplaceStr (numStr,'0338','0140'); 
 

 
     numStr := AnsiReplaceStr (numStr,'8212','0151'); 
 
     numStr := AnsiReplaceStr (numStr,'0732','0152'); 
 
     numStr := AnsiReplaceStr (numStr,'8482','0153'); 
 
     numStr := AnsiReplaceStr (numStr,'0353','0154'); 
 
     numStr := AnsiReplaceStr (numStr,'0339','0155'); 
 

 
     numStr := AnsiReplaceStr (numStr,'0382','0158'); 
 
     numStr := AnsiReplaceStr (numStr,'0376','0159');