获取Alt +数字键盘的键代码,以便在SendKeys中使用

时间:2015-04-19 17:32:30

标签: delphi keycode ord

(我正试图通过互联网使SendKeys代码使用扩展字符。)Sendkeys是对VB SendKeys的模仿。我在互联网上看到了几种算法,加上Delphi 7附带的算法。我的程序使用它将键击发送到其他程序,以使数据输入更快更一致。除了Ord()报告的数字超过255的字符外,它的效果很好。

自发布此问题以来,我发现字符映射报告Alt + 0128到Alt + 255。事实证明,Ord()只报告了26个这样的字符,它们看起来像是unicode值。所以我现在有一个丑陋的工作,只是将Ord()报告的值替换为Character Map报告的替代值,更低值。所以我的Sendkeys现在看起来与记事本中的Ansi编码兼容。

我希望像AnsiChar()一样进行简单的字符转换,但是产生了完全错误的Ord()值。

我正在使用Delphi XE2和Arial字体来解决所有这个问题。 Windows字符映射实用程序报告Alt + 0147创建“左双引号”。

这个组合键提供了“Delphi控件,记事本和Word中的字符。

我的所有互联网研究都表示要使用Ord()来确定角色的数值:

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

但是这会返回8220,而不是0178.在记事本和Delphi控件中,Alt + 8220会产生,,但它仍会在Word中产生。

这显然与Ansi和Unicode有关,但我无法弄清楚如何在Delphi中编写一个将返回0178而不是8220的函数。

iConv将没有用,因为我们的目标是拥有一个独立的计划。感谢。

2 个答案:

答案 0 :(得分: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的一些评论):

答案 1 :(得分:0)

事实证明,字符映射实用程序会将Alt + 0128到Alt + 0255的键代码报告给您可以通过数字键盘输入的上部ASCII字符。它还报告了更多具有十六进制值的unicode字符。如果将该值转换为十进制,也可以通过Alt +数字键盘输入。我从未发现为什么Ord()报告的unicode值为8220但是十六进制是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');