1、9&的任意数,该值将被识别为系统 OEM代码页中的代码点。根据在&控制面板&的&区域选项&中所指定的 Windows系统区域设置,结果各有不同。例如,如果您的系统区域设置是&,代码页为 437(MS-DOS 拉丁美洲),那么只要按住 ALT键,然后在数字键盘上键入&163&,就可以输入 ú(U+00FA, 带重音符号的小写拉丁字母 U)。如果系统区域设置是&希腊语&(OEM代码页 737 MS-DOS 希腊),相同序列将产生希腊语小写字母 MU (U+03BC)。新建一个文本文件,输入&中文&这两个字并保存,然后用UltraEdit等十六进制编辑器打开并用十六进制视图显示,可看到如下
2、内容: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中有码位239
3、40个,包含汉字21003个。#NoEnvSetKeyDelay, 20 ; 如因速度过快导致发送不正常请尝试修改此行的延迟数值SendMode InputThenPlay ; 如因速度过快导致发送不正常请则注释此行或改为其它模式SetWorkingDir %A_ScriptDir%string1 := 简体中文字符发送测试string2 :繁體中文字符發送測試F10: Loop, 100 SendString( Sending # . A_Index . . string1 ) Send, Enter ReturnSendString( string ) Len := StrLen(stri
4、ng) ; 得到字符串的长度,注意一个中文字符的长度是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) ; 判断是否中文字符的第一个字符= Asc( SubStr(string, Index+1, 1) ) ; 得到第二个字
5、符的ASCII值 if(Code2 &= 64 & Code2 &= 254) ; 若条件成立则说明是中文字符= true= 8 ; 第一个字符应放到高8位上 Code1 += Code2 ; 第二个字符放在低8位上 +Index if( IsUnicodeChar ) Keys .= ASC . Code1 . elseASC 0 如果非中文字符,则需要前缀一个0 if( Code2 & 0 ) . Code2 . if(Index & Len) Break Send % KeysSendByClipboard( string, BackupClipBoard = false ) if(Ba
6、ckupClipBoard) ClipSaved := ClipboardAll ClipBoard := string Send v Clipboard := ClipSaved ClipSaved =/AU3脚本(3.2.4.0 之后的版本)由于AutoIt自从版本3.2.4.0+开始已不再提供ANSI版本,因此再写个能在新版用的测试版本:v3.3.0.0在编写的过程中,一开始是打算使用 StringToBinary/Binary/DllStructSetData 来生成一个Ansi字符串方便处理的,但因为AutoIt存在将字符串截断的问题(这个问题也算是历史悠久了),因此不得不使用API
7、来进行转换。有意思的是,在AutoIt的更新日志里面却说这个问题已经解决了:Fixed #92: DllStruct data truncated with char/wchar. 最后还是要抱怨一下默认情况下AutoIt的 Send 函数速度实在是太慢了,好在AutoHotkey的速度很理想,尽管Send这种功能我本来也很少用 :)HotKeySet(F10, SendTest)While 1 Sleep(100)WEndFunc SendTest() Local $string = A中文字符串A $begin = TimerInit() For $i = 1 To 10 _Send( $
8、string ) Send(Enter) Next $dif = TimerDiff($begin) MsgBox(0,Time passed, $dif)EndFunc; 函数: _Send 用途:发送字符串 参数:$string,待转换的字符串,既可以是字符串字面值常量也可以是一个指向包含 Unicode 字符数组的 DllStruct 元素的指针 $bSendKeys,是否发送字符串,为 false 时只返回待发送的 Keys(请参考返回 值的说明) 而不发送字符串 返回值:使用 Send 函数时传递给它的第一个参数(Keys),形如 Asc nn1Asc nn2Func _Send(
9、Const $string, $bSendKeys = true ) Local $szKeys = 待发送的按键序列 Local $nLen = StringLen($string) ; 字符串的长度 字符串的 Unicode 编码数组 Local $UnicodeStringASCIIArray = StringToASCIIArray( $string ) 因须将 $string 转换为多字节版本,下面计算足够用以保存转换成后数据的空间大小 Local $nAnsiBufferSize = ($nLen+1) * 2 用以保存转换后的结果 Local $pAnsiStringStruct
10、 = DllStructCreate(ubyte & $nAnsiBufferSize & 将 $string 转换为多字节版本 Local $nBytesWritten = WideCharToMultiByte( $string, DllStructGetPtr($pAnsiStringStruct) ) If $nBytesWritten &= 0 Then $pAnsiStringStruct = 0 Return SetError(error, 0, EndIf Local $AnsiIndex = 1 ; Ansi 字符串元素的索引 Local $value ; 要传给 Send
11、函数的数值,用以构成 Asc $value For $i = 0 To $nLen-1 $value = DllStructGetData($pAnsiStringStruct, 1, $AnsiIndex) If $UnicodeStringASCIIArray$i & 255 Then ; 大于255的字符说明是Unicode字符 $AnsiIndex += 1 $value = $value * 256 + DllStructGetData($pAnsiStringStruct, 1, $AnsiIndex) ElseIf $value & 0 Then $value = 0 $valu
12、e EndIf $szKeys &Asc $value & If $bSendKeys Then Send($szKeys) Return $szKeysEndFunc ;=&_SendFunc SendByClipboard( Const $string, $BackupClipBoard = false ) If $BackupClipBoard Then Local $bak = ClipGet() ClipPut($string)v If $BackupClipBoard Then ClipPut($bak) WideCharToMultiByte将 Unicode 字符串转换为多字节
13、字符串$UnicodeString,待转换的字符串,既可以是字符串字面值常量也可以是一个指 向包含 Unicode 字符数组的 DllStruct 元素的指针 $pMultiByte,用以保存转换结果的地址,指向一个char/byte数组的 DllStruct 元素的指针 $iCodePage,代码页写入到 $pMultiByte的字节数Func WideCharToMultiByte($UnicodeString, $pMultiByte, $iCodePage = 0) Local $aResult, $ParamType = wstr If IsPtr($UnicodeString) T
14、hen $ParamType = ptr $aResult = DllCall(Kernel32.dllintWideCharToMultiByte, $iCodePage, , 0, _ $ParamType, $UnicodeString, , -1, , 0, , 0) If error Then Return SetError(error, 0, 0), $pMultiByte, , $aResult0, If error Then Return SetError(error, 1, 0) Return $aResult0WideCharToMultiByte /AU3脚本(3.2.4
15、.0 之前的版本)(注意,最新版本(3.2.4.0+)已不再提供ANSI版本!因此请注意你的AutoIt版本):#cs运行脚本时需用 AutoIt3A.exe将 AutoIt 目录下的AutoIt3A.exe重命名为AutoIt3.exe即可(建议先备份AutoIt3.exe)编译脚本时需用 Aut2exeA.exe#ceRun(notepadWinWaitActive(CLASS:Notepad)_SendRaw(简体中文And繁體中文)Func _SendRaw($Keys) Local $KeysInUnicode = Local $len = StringLen($Keys) Loca
16、l $char1 Local $code1 Local $char2 Local $code2 Local $index = 1 While True $code2 = 0 $char1 = StringMid($Keys, $index, 1) $code1 = Asc($char1) If $code1 &= 129 And $code1 &= 254 And $index & $len Then $char2 = StringMid($Keys, $index+1, 1) $code2 = Asc($char2) If $code2 &= 64 And $code2 &= 254 Then $code1 *= 256 $code1 += $code2 $index += 1= 255 Then $code1 = $code1 $KeysInUnicode & $code1 & 0 And $code2 & 64 Then $code2 = $code2 $code2 & If $index & $len Then ExitLoop WEnd Send($KeysInUnicode)EndFunc
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1