在AHK脚本中使用Send发送中文
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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
}