在AHK脚本中使用Send发送中文

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

在AHK脚本中使用Send发送中文

在脚本中使用Send发送中文

原文请见:/diary,11740703.shtml最简单的方法其实是先把要发送的内容先保存到剪贴板中去,然后在要发送的时候“粘贴”一下(Send一个Ctrl+V)即可。不过这样做有一些缺点:

1、由于使用了剪贴板,用户在Send 的过程中将不能正常使用Ctrl+C 和Ctrl+V 等剪贴板相关的功能;

2、有可能会在还没执行完“粘贴”操作之前剪贴板的内容就被修改了,结果发送了别的内容。当然还有别的方法,先引用一下下面的内容:我们通过键盘只能够输入键盘上有的字符,其实,按住ALT 键,然后在数字键盘上按表示要输入字符的十进制代码值的键,等完成输入后,释放ALT 键还可以输入键盘上没有的字符呢。如

果键入的第一个数字是“0”,该值将被识别为当前输入区域设置中的代码点或字符值。例如,在当前的输入区域设置为“英语(美国)”时(代码页1252:Windows Latin-1),按住ALT 键,然后在数字键盘上键入“0163”将产生英镑符号£

(U+00A3)。在当前输入区域是"Russia" (代码页

1251:Windows Cyrillic),相同的键顺序会产生西里尔大写字母

JE (U+0408)。而如果键入的第一位数是“1”到“9”的任意数,该值将被识别为系统OEM 代码页中的代码点。根据在“控制面板”的

“区域选项”中所指定的Windows

系统区域设置,结果各有不同。例如,如果您的系统区域设置是“英语(美国)”,代码页为437(MS-DOS 拉丁美洲),那么只要按住ALT

键,然后在数字键盘上键入“163”,就可以输入ú(U+00FA, 带重音符号的小写拉丁字母U)。如果系统区域设置是“希腊语”(OEM

代码页737 MS-DOS 希腊),相同序列将产生希腊语小写字母MU (U+03BC)。新建一个文本文件,输入“中文”这两个字并保存,然后用UltraEdit等十六进制编辑器打开并用十六进制视图显示,可看到如下内容:00000000h: D6 D0 CE C4 ; 中文可知中文这两个字的十六进制分别是0xD6D0、0xCEC4(即十进制的54992、52932),那么如果要输入“中”字,则只要按住Alt键,逐个输入其十进制数字54992即可。

这样,要实现自己的Send 函数就简单了:AHK脚本:

; GBK是GB2312的扩展,是向下兼容的,因此GB2312中的汉字的编码与GBK中

; 汉字的相同。另外,GBK中还包含繁体字的编码,GBK 中每个汉字仍然包含两

; 个字节,第一个字节的范围是0x81-0xFE(即129-254),第二个字节的范围

; 是0x40-0xFE(即64-254)。GBK中有码位23940个,包含汉字21003个。#NoEnv

SetKeyDelay, 20 ; 如因速度过快导致发送不正常请尝试修改此行的延迟数值

SendMode InputThenPlay ; 如因速度过快导致发送不正常请则注释此行或改为其它模式

SetWorkingDir %A_ScriptDir%string1 := "简体中文字符发送测试"

string2 := "繁體中文字符發送測試"F10::

Loop, 100

{

SendString( "Sending #" . A_Index . " " . string1 )

Send, {Enter}

}

ReturnSendString( string )

{

Len := StrLen(string) ; 得到字符串的长度,注意一个中文字符的长度是2,即占2个字节

Keys := "" ; 将要发送的字符序列

Index := 1 ; 用于循环

Loop

{

IsUnicodeChar := false

Code2 :=

0 ; 字符2的ASCII码

Code1 := Asc( SubStr(string, Index, 1) ) ; 得到第一个字符的ASCII值

if(Code1 >= 129 && Code1 <= 254 && Index < Len) ; 判断是否中文字符的第一个字符

{

Code2 := Asc( SubStr(string, Index+1,

1) ) ; 得到第二个字符的ASCII值

if(Code2 >= 64 && Code2 <= 254) ; 若条件成立则说明是中文字符

{

IsUnicodeChar := true

Code1 <<=

8 ; 第一个字符应放到高8位上

Code1 +=

Code2 ; 第二个字符放在低8位上

}

++Index

}

if( IsUnicodeChar )

Keys .= "{ASC " . Code1 . "}"

else

{

Keys .= "{ASC 0" . Code1 .

"}" ; 如果非中文字符,则需要前缀一个0 if( Code2 > 0 )

Keys .= "{ASC 0" . Code2 . "}"

}

++Index

if(Index > Len)

Break

}

相关文档
最新文档