Thinkai's Blog

Autohotkey|Python|php|aardio|VOIP|IT 爱好者

ascinput()绕过输入法发送字符函数 Autohotkey 5443

作者为 发表

Autohotkey

;说明 在QQ聊天窗口中是乱码,需要发送UTF-16BE编码
ascinput(string){
u :=  A_IsUnicode ? 2 : 1 ;Unicode版ahk字符长度是2
length:=StrPut(string,"CP0")
if(A_IsUnicode)
	{
	VarSetCapacity(address,length),StrPut(string,&address,"CP0")
	}
else
	address:=string
VarSetCapacity(out,2*length*u)
index =0
Loop
{
index += 1
if (index>length-1)
	Break
asc := NumGet(address,index-1,"UChar")
if asc > 126
	{
	index += 1
	asc2 := NumGet(address,index-1,"UChar")
	asc := asc*256+asc2
	}
Send, % "{ASC " asc "}"
}
}


ascaltinput(string){
u :=  A_IsUnicode ? 2 : 1 ;Unicode版ahk字符长度是2
length:=StrPut(string,"CP0")
if(A_IsUnicode)
	{
	VarSetCapacity(address,length),StrPut(string,&address,"CP0")
	}
else
	address:=string
VarSetCapacity(out,2*length*u)
index =0
Loop
{
index += 1
if (index>length-1)
	Break
asc := NumGet(address,index-1,"UChar")
if asc > 126
	{
	index += 1
	asc2 := NumGet(address,index-1,"UChar")
	asc := asc*256+asc2
	}
StringSplit, var, asc,
Loop % var0
{
str .= "{Numpad" var%A_index% "}"
}
send, {AltDown}%str%{Altup}
str =
}
}


#z:: ;测试
ascinput("你m啊12234%^&*()")


生成随机密码函数 Autohotkey 11635

作者为 发表

Autohotkey

MsgBox % RandomPass("wd",10) ;测试

RandomPass(kind:="Wwd",length:=8){
;kind:类型 W大写 w小写 d数字 可以组合 length:长度
char := [1,2,3,4,5,6,7,8,9,"a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z",0,1,2,3,4,5,6,7,8,9]
char[0] := 0 ;定义数组
option := kind
kind = 0 ;必须先赋值  不然后面的加法无效
kind := InStr(option,"W",1) ? kind+100 : kind ;InStr区分大小写
kind := InStr(option,"w",1) ? kind+10 : kind
kind := InStr(option,"d") ? kind+1 : kind
;判断类型并设置随机数最小最大值
if kind=111
	min:=0,max:=61
else if kind=110
	min:=10,max:=61
else if kind=11
	min:=0,max:=35
else if kind=101
	min:=36,max:=71
else if kind=1
	min:=0,max=9
else if kind=10
	min:=10,max=35
else if kind=100
	min:=36,max=61
loop % length
{
Random, l, %min%, %max%
str .= char[l]
}
return str
}


自定义Chrome的User-agent模拟其他浏览器 Autokotkey 62405

作者为 发表

Autohotkey

因为新疆百度网盘分享链接打不开,手机上却能打开,可以保存到网盘再从电脑下载,所以要操作手机很麻烦,才写了这个小工具。

;预定义UA   可以输入自己的UA在编辑框内
360安全浏览器5_0_on_Windows_7_x64_IE9 = Mozilla/4.0 (compatible`; MSIE 7.0`; Windows NT 6.1`; WOW64`; Trident/5.0`; SLCC2`; .NET CLR 2.0.50727`; .NET CLR 3.5.30729`; .NET CLR 3.0.30729`; Media Center PC 6.0`; .NET4.0C`; .NET4.0E)
360安全浏览器5_0_on_Windows_XP_x86_IE6 = Mozilla/4.0 (compatible`; MSIE 6.0`; Windows NT 5.1`; SV1`; QQDownload 732`; .NET4.0C`; .NET4.0E)
360安全浏览器5_0自带IE8内核版_on_Windows_XP_x86_IE6 = Mozilla/4.0 (compatible`; MSIE 7.0`; Windows NT 5.1`; Trident/4.0`; SV1`; QQDownload 732`; .NET4.0C`; .NET4.0E`; 360SE)
360急速浏览器6_0_IE9_IE10模式_on_Windows_7_x64_IE9 = Mozilla/5.0 (compatible`; MSIE 9.0`; Windows NT 6.1`; WOW64`; Trident/5.0`; SLCC2`; .NET CLR 2.0.50727`; .NET CLR 3.5.30729`; .NET CLR 3.0.30729`; Media Center PC 6.0`; .NET4.0C`; .NET4.0E)
360急速浏览器6_0_急速模式_on_Windows_7_x64 = Mozilla/5.0 (Windows NT 6.1`; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.89 Safari/537.1
360急速浏览器6_0_急速模式_on_Windows_XP_x86 = Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.89 Safari/537.1
360急速浏览器6_0_兼容模式_on_Windows_7_x64_IE9 = Mozilla/4.0 (compatible`; MSIE 7.0`; Windows NT 6.1`; WOW64`; Trident/5.0`; SLCC2`; .NET CLR 2.0.50727`; .NET CLR 3.5.30729`; .NET CLR 3.0.30729`; Media Center PC 6.0`; .NET4.0C`; .NET4.0E)
360急速浏览器6_0_兼容模式_on_Windows_XP_x86_IE6 = Mozilla/4.0 (compatible`; MSIE 6.0`; Windows NT 5.1`; SV1`; QQDownload 732`; .NET4.0C`; .NET4.0E)
Chrome_on_Windows_7 = Mozilla/5.0 (Windows NT 6.1`; WOW64) AppleWebKit/535.7 (KHTML, like Gecko) Chrome/16.0.912.36 Safari/535.7
Chrome_x64_37_0_2062_124_on_Windows_8_1_X64 = Mozilla/5.0 (Windows NT 6.3`; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.124 Safari/537.36
Chrome_x64_on_Ubuntu_12_04_1_x64 = Mozilla/5.0 (X11`; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11
Chrome_x86_10_0_648_133_on_Windows_7_x64 = Mozilla/5.0 (Windows`; U`; Windows NT 6.1`; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.133 Safari/534.16
Chrome_x86_23_0_1271_64_on_Windows_7_x64 = Mozilla/5.0 (Windows NT 6.1`; WOW64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11
IE_8_on_XP = Mozilla/4.0 (compatible`; MSIE 8.0`; Windows NT 5.1`; Trident/4.0`; .NET CLR 1.1.4322`; .NET CLR 2.0.50727`; .NET CLR 3.0.04506.30`; .NET CLR 3.0.04506.648`; .NET CLR 3.5.21022`; .NET CLR 3.0.4506.2152`; .NET CLR 3.5.30729`; .NET4.0C`; .NET4.0E)
IE_9_on_Windows_7 = Mozilla/5.0 (compatible`; MSIE 9.0`; Windows NT 6.1`; WOW64`; Trident/5.0`; SLCC2`; .NET CLR 2.0.50727`; .NET CLR 3.5.30729`; .NET CLR 3.0.30729`; Media Center PC 6.0`; Zune 4.0`; InfoPath.3`; MS-RTC LM 8`; .NET4.0C`; .NET4.0E)
IE11_x64_on_Windows_8_1_x64 = Mozilla/5.0 (Windows NT 6.3`; WOW64`; Trident/7.0`; rv:11.0) like Gecko
IE9_x64_on_Windows_7_x64 = Mozilla/5.0 (compatible`; MSIE 9.0`; Windows NT 6.1`; Win64`; x64`; Trident/5.0)
IE9_x86_on_Windows_7_x64 = Mozilla/5.0 (compatible`; MSIE 9.0`; Windows NT 6.1`; WOW64`; Trident/5.0)
iPad = Mozilla/5.0 (iPad`; CPU OS 6_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A403 Safari/8536.25
iPhone3 = Mozilla/5.0 (iPhone`; U`; CPU iPhone OS 3_0 like Mac OS X`; en-us) AppleWebKit/420.1 (KHTML, like Gecko) Version/3.0 Mobile/1A542a Safari/419.3
iPhone4 = Mozilla/5.0 (iPhone`; U`; CPU iPhone OS 4_0 like Mac OS X`; en-us) AppleWebKit/532.9 (KHTML, like Gecko) Version/4.0.5 Mobile/8A293 Safari/6531.22.7
iPod = Mozilla/5.0 (iPod`; CPU iPhone OS 5_0_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9A405 Safari/7534.48.3
Nokia_N97 = Mozilla/5.0 (SymbianOS/9.4`; Series60/5.0 NokiaN97-1/20.0.019`; Profile/MIDP-2.1 Configuration/CLDC-1.1) AppleWebKit/525 (KHTML, like Gecko) BrowserNG/7.1.18124
Opera_19_0_1326_59_on_Windows_8_1_X64 = Mozilla/5.0 (Windows NT 6.3`; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.102 Safari/537.36 OPR/19.0.1326.59
Opera_Mini_on_Symbian = Opera/9.80 (J2ME/MIDP`; Opera Mini/9.80 (S60`; SymbOS`; Opera Mobi/23.348`; U`; en) Presto/2.5.25 Version/10.54
Opera浏览器_on_Mac_OS_X_10_6 = Opera/9.80 (Macintosh`; Intel Mac OS X 10.6.8`; U`; en) Presto/2.9.168 Version/11.52
Opera浏览器_on_Windows_7 = Opera/9.80 (Windows NT 6.1`; U`; en) Presto/2.9.168 Version/11.52
Opera浏览器_on_XP = Opera/9.80 (Windows NT 5.1`; U`; en) Presto/2.9.168 Version/11.52
QQ浏览器7_0_on_Windows_7_x64_IE9 = Mozilla/5.0 (compatible`; MSIE 9.0`; Windows NT 6.1`; WOW64`; Trident/5.0`; SLCC2`; .NET CLR 2.0.50727`; .NET CLR 3.5.30729`; .NET CLR 3.0.30729`; Media Center PC 6.0`; .NET4.0C`; .NET4.0E`; QQBrowser/7.0.3698.400)
QQ浏览器7_0_on_Windows_XP_x86_IE6 = Mozilla/4.0 (compatible`; MSIE 6.0`; Windows NT 5.1`; SV1`; QQDownload 732`; .NET4.0C`; .NET4.0E)
QQ浏览器7_7_2_on_Windows_8_1_X64 = Mozilla/5.0 (Windows NT 6.3`; WOW64`; Trident/7.0`; rv:11.0`; QQBrowser/7.7.28658.400) like Gecko
Safari_on_Mac_OS_X_10_6 = Mozilla/5.0 (Macintosh`; U`; Intel Mac OS X 10_6_8`; en-US) AppleWebKit/533.21.1 (KHTML, like Gecko) Version/5.0.5 Safari/533.21.1
Safari_on_Windows_7 = Mozilla/5.0 (Windows`; U`; Windows NT 6.1`; en-US) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27
UC浏览器9_9_3_on_Huawei_P6_Adorid_4_4_2 = Mozilla/5.0?(Linux`;?U`;?Android?4.4.2`;?zh-CN`;?HUAWEI?P6-C00?Build/HuaweiP6-C00)?AppleWebKit/533.1?(KHTML,?like?Gecko)?Version/4.0?UCBrowser/9.9.3.478?U3/0.8.0?Mobile?Safari/533.1
UC浏览器9_9_6_on_红米1S_Adorid_4_3 = Mozilla/5.0?(Linux`;?U`;?Android?4.3`;?zh-CN`;?HM?1SW?Build/JLS36C)?AppleWebKit/533.1?(KHTML,?like?Gecko)?Version/4.0?UCBrowser/9.9.6.495?U3/0.8.0?Mobile?Safari/533.1
UC浏览器PC版_高速模式_on_Windows_8_1_X64 = Mozilla/5.0 (Windows NT 6.3`; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.107 UBrowser/1.0.355.1275 Safari/537.36
UC浏览器PC版_兼容模式_on_Windows_8_1_X64 = Mozilla/5.0 (Windows NT 6.3`; WOW64`; Trident/7.0`; rv:11.0 UBrowser/1.0.355.1275) like Gecko
UC浏览器PC手机模拟器 = Mozilla/4.0 (compatible`; MSIE 4.01`; Windows CE`; .NET4.0E)/UCWEB 7.4.0.57/31/999
Waterfox_16_0_on_Windows_7_x64 = Mozilla/5.0 (Windows NT 6.1`; Win64`; x64`; rv:16.0) Gecko/20121026 Firefox/16.0
WebOS_HP_Touchpad = Mozilla/5.0 (hp-tablet`; Linux`; hpwOS/3.0.0`; U`; en-US) AppleWebKit/534.6 (KHTML, like Gecko) wOSBrowser/233.70 Safari/534.6 TouchPad/1.0
Windows_Phone_Mango = Mozilla/5.0 (compatible`; MSIE 9.0`; Windows Phone OS 7.5`; Trident/5.0`; IEMobile/9.0`; HTC`; Titan)
Windows_Phone_OS_7_5_and_IE_9 = Mozilla/5.0 (compatible`; MSIE 9.0`; Windows Phone OS 7.5`; Trident/5.0`; IEMobile/9.0)
安卓_N1 = Mozilla/5.0 (Linux`; U`; Android 2.3.7`; en-us`; Nexus One Build/FRF91) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1
安卓_Opera_Mobile = Opera/9.80 (Android 2.3.4`; Linux`; Opera Mobi/build-1107180945`; U`; en-GB) Presto/2.8.149 Version/11.10
安卓_Pad_Moto_Xoom = Mozilla/5.0 (Linux`; U`; Android 3.0`; en-us`; Xoom Build/HRI39) AppleWebKit/534.13 (KHTML, like Gecko) Version/4.0 Safari/534.13
安卓_QQ浏览器_For_安卓 = MQQBrowser/26 Mozilla/5.0 (Linux`; U`; Android 2.3.7`; zh-cn`; MB200 Build/GRJ22`; CyanogenMod-7) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1
安卓_UC_For_安卓 = JUC (Linux`; U`; 2.3.7`; zh-cn`; MB200`; 800*480) UCWEB7.9.3.103/139/999
安卓_火狐手机版Fennec = Mozilla/5.0 (Windows NT 6.1`; WOW64`; rv:7.0a1) Gecko/20110623 Firefox/7.0a1 Fennec/7.0a1
百度浏览器6_5_on_Windows_8_1_X64 = Mozilla/5.0 (Windows NT 6.2`; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.146 BIDUBrowser/6.x Safari/537.36
黑莓6 = Mozilla/5.0 (BlackBerry`; U`; BlackBerry 9800`; en) AppleWebKit/534.1+ (KHTML, like Gecko) Version/6.0.0.337 Mobile Safari/534.1+
黑莓7 = Mozilla/5.0 (BlackBerry`; U`; BlackBerry 9850`; en-US) AppleWebKit/534.11+ (KHTML, like Gecko) Version/7.0.0.115 Mobile Safari/534.11+
火狐_8_on_Linux_X11 = Mozilla/5.0 (X11`; Linux i686`; rv:8.0) Gecko/20100101 Firefox/8.0
火狐_8_on_Mac_OS_X_10_6 = Mozilla/5.0 (Macintosh`; U`; Intel Mac OS X 10.6.8`; en-US`; rv:8.0) Gecko/20100101 Firefox/8.0
火狐_8_on_Windows_7 = Mozilla/5.0 (Windows`; U`; Windows NT 6.1`; en-US`; rv:8.0) Gecko/20100101 Firefox/8.0
火狐_8_on_XP = Mozilla/5.0 (Windows`; U`; Windows NT 5.1`; en-US`; rv:8.0) Gecko/20100101 Firefox/8.0
火狐_x64_3_6_10_on_Ubuntu_10_10_x64 = Mozilla/5.0 (X11`; U`; Linux x86_64`; zh-CN`; rv:1.9.2.10) Gecko/20100922 Ubuntu/10.10 (maverick) Firefox/3.6.10
火狐_x64_4_0b13pre_on_Windows_7_x64 = Mozilla/5.0 (Windows NT 6.1`; Win64`; x64`; rv:2.0b13pre) Gecko/20110307 Firefox/4.0b13pre
火狐_x64_on_Ubuntu_12_04_1_x64 = Mozilla/5.0 (X11`; Ubuntu`; Linux x86_64`; rv:16.0) Gecko/20100101 Firefox/16.0
火狐_x86_3_6_15_on_Windows_7_x64 = Mozilla/5.0 (Windows`; U`; Windows NT 6.1`; zh-CN`; rv:1.9.2.15) Gecko/20110303 Firefox/3.6.15
猎豹浏览器1_5_9_2888_急速模式on_Windows_7_x64 = Mozilla/5.0 (Windows NT 6.1`; WOW64) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.84 Safari/535.11 LBBROWSER
猎豹浏览器1_5_9_2888_兼容模式_on_Windows_7_x64 = Mozilla/4.0 (compatible`; MSIE 7.0`; Windows NT 6.1`; WOW64`; Trident/5.0`; SLCC2`; .NET CLR 2.0.50727`; .NET CLR 3.5.30729`; .NET CLR 3.0.30729`; Media Center PC 6.0`; .NET4.0C`; .NET4.0E)
猎豹浏览器2_0_10_3198_急速模式on_Windows_7_x64 = Mozilla/5.0 (Windows NT 6.1`; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.71 Safari/537.1 LBBROWSER
猎豹浏览器2_0_10_3198_兼容模式on_Windows_7_x64 = Mozilla/5.0 (compatible`; MSIE 9.0`; Windows NT 6.1`; WOW64`; Trident/5.0`; SLCC2`; .NET CLR 2.0.50727`; .NET CLR 3.5.30729`; .NET CLR 3.0.30729`; Media Center PC 6.0`; .NET4.0C`; .NET4.0E`; LBBROWSER)
猎豹浏览器2_0_10_3198_兼容模式on_Windows_XP_x86_IE6 = Mozilla/4.0 (compatible`; MSIE 6.0`; Windows NT 5.1`; SV1`; QQDownload 732`; .NET4.0C`; .NET4.0E`; LBBROWSER)`"
搜狗浏览器4_0_高速模式_on_Windows_XP_x86 = Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.84 Safari/535.11 SE 2.X MetaSr 1.0
搜狗浏览器4_0_兼容模式_on_Windows_XP_x86_IE6 = Mozilla/4.0 (compatible`; MSIE 7.0`; Windows NT 5.1`; Trident/4.0`; SV1`; QQDownload 732`; .NET4.0C`; .NET4.0E`; SE 2.X MetaSr 1.0)
搜狗浏览器5_0_高速模式_on_Windows_10_X64 = Mozilla/5.0 (Windows NT 6.3`; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.63 Safari/537.36 SE 2.X MetaSr 1.0
搜狗浏览器5_1_高速模式_on_Windows_8_1_X64 = Mozilla/5.0 (Windows NT 6.3`; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.153 Safari/537.36 SE 2.X MetaSr 1.0
搜狗浏览器5_1_兼容模式_on_Windows_8_1_X64 = Mozilla/5.0 (Windows NT 6.3`; WOW64`; Trident/7.0`; rv:11.0`; SE 2.X MetaSr 1.0) like Gecko
淘宝浏览器2_0_on_Windows_7_x64 = Mozilla/5.0 (Windows NT 6.1`; WOW64) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.11 TaoBrowser/2.0 Safari/536.11
微信5_4_on_Huawei_P6_Adorid_4_4_2 = Mozilla/5.0 (Linux`; Android 4.4.2`; HUAWEI P6-C00 Build/HuaweiP6-C00) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/30.0.0.0 Mobile Safari/537.36 MicroMessenger/5.4.0.66_r807534.480 NetType/WIFI
微信6_0_on_红米1S_Adorid_4_3 = Mozilla/5.0?(Linux`;?U`;?Android?4.3`;?zh-cn`;?HM?1SW?Build/JLS36C)?AppleWebKit/534.30?(KHTML,?like?Gecko)?Version/4.0?Mobile?Safari/534.30?MicroMessenger/6.0.0.50_r844973.501?NetType/WIFI
自带浏览器_on_Huawei_P6_Adorid_4_4_2 = Mozilla/5.0?(Linux`;?Android?4.4.2`;?HUAWEI?P6-C00?Build/HuaweiP6-C00)?AppleWebKit/537.36?(KHTML,?like?Gecko)?Version/4.0?Chrome/30.0.0.0?Mobile?Safari/537.36
自带浏览器_on_安卓_2_2 = Mozilla/5.0 (Linux`; U`; Android 2.2.1`; zh-cn`; HTC_Wildfire_A3333 Build/FRG83D) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1
自带浏览器_on_安卓_2_3_5 = Mozilla/5.0 (Linux`; U`; Android 2.3.5`; en-us`; HTC Vision Build/GRI40) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1
自带浏览器_on_红米1S_Adorid_4_3 = Mozilla/5.0?(Linux`;?U`;?Android?4.3`;?zh-cn`;?HM?1SW?Build/JLS36C)?AppleWebKit/537.36?(KHTML,?like?Gecko)?Version/4.0?Mobile?Safari/537.36?XiaoMi/MiuiBrowser/2.0.1
RegRead, Chrome_path, HKCU, Software\Microsoft\Windows\CurrentVersion\App Paths\chrome.exe,
if !ErrorLevel
	{
	Gui,Add,Text,x0 w200 h12,选择你想要模拟的浏览器:
	Gui,Add,ComboBox,x0 y20 w300 vua, 360安全浏览器5_0_on_Windows_7_x64_IE9|360安全浏览器5_0_on_Windows_XP_x86_IE6|360安全浏览器5_0自带IE8内核版_on_Windows_XP_x86_IE6|360急速浏览器6_0_IE9_IE10模式_on_Windows_7_x64_IE9|360急速浏览器6_0_急速模式_on_Windows_7_x64|360急速浏览器6_0_急速模式_on_Windows_XP_x86|360急速浏览器6_0_兼容模式_on_Windows_7_x64_IE9|360急速浏览器6_0_兼容模式_on_Windows_XP_x86_IE6|Chrome_on_Windows_7|Chrome_x64_37_0_2062_124_on_Windows_8_1_X64|Chrome_x64_on_Ubuntu_12_04_1_x64|Chrome_x86_10_0_648_133_on_Windows_7_x64|Chrome_x86_23_0_1271_64_on_Windows_7_x64|IE_8_on_XP|IE_9_on_Windows_7|IE11_x64_on_Windows_8_1_x64|IE9_x64_on_Windows_7_x64|IE9_x86_on_Windows_7_x64|iPad|iPhone3|iPhone4|iPod|Nokia_N97|Opera_19_0_1326_59_on_Windows_8_1_X64|Opera_Mini_on_Symbian|Opera浏览器_on_Mac_OS_X_10_6|Opera浏览器_on_Windows_7|Opera浏览器_on_XP|QQ浏览器7_0_on_Windows_7_x64_IE9|QQ浏览器7_0_on_Windows_XP_x86_IE6|QQ浏览器7_7_2_on_Windows_8_1_X64|Safari_on_Mac_OS_X_10_6|Safari_on_Windows_7|UC浏览器9_9_3_on_Huawei_P6_Adorid_4_4_2|UC浏览器9_9_6_on_红米1S_Adorid_4_3|UC浏览器PC版_高速模式_on_Windows_8_1_X64|UC浏览器PC版_兼容模式_on_Windows_8_1_X64|UC浏览器PC手机模拟器|Waterfox_16_0_on_Windows_7_x64|WebOS_HP_Touchpad|Windows_Phone_Mango|Windows_Phone_OS_7_5_and_IE_9|安卓_N1|安卓_Opera_Mobile|安卓_Pad_Moto_Xoom|安卓_QQ浏览器_For_安卓|安卓_UC_For_安卓|安卓_火狐手机版Fennec|百度浏览器6_5_on_Windows_8_1_X64|黑莓6|黑莓7|火狐_8_on_Linux_X11|火狐_8_on_Mac_OS_X_10_6|火狐_8_on_Windows_7|火狐_8_on_XP|火狐_x64_3_6_10_on_Ubuntu_10_10_x64|火狐_x64_4_0b13pre_on_Windows_7_x64|火狐_x64_on_Ubuntu_12_04_1_x64|火狐_x86_3_6_15_on_Windows_7_x64|猎豹浏览器1_5_9_2888_急速模式on_Windows_7_x64|猎豹浏览器1_5_9_2888_兼容模式_on_Windows_7_x64|猎豹浏览器2_0_10_3198_急速模式on_Windows_7_x64|猎豹浏览器2_0_10_3198_兼容模式on_Windows_7_x64|猎豹浏览器2_0_10_3198_兼容模式on_Windows_XP_x86_IE6|搜狗浏览器4_0_高速模式_on_Windows_XP_x86|搜狗浏览器4_0_兼容模式_on_Windows_XP_x86_IE6|搜狗浏览器5_0_高速模式_on_Windows_10_X64|搜狗浏览器5_1_高速模式_on_Windows_8_1_X64|搜狗浏览器5_1_兼容模式_on_Windows_8_1_X64|淘宝浏览器2_0_on_Windows_7_x64|微信5_4_on_Huawei_P6_Adorid_4_4_2|微信6_0_on_红米1S_Adorid_4_3|自带浏览器_on_Huawei_P6_Adorid_4_4_2|自带浏览器_on_安卓_2_2|自带浏览器_on_安卓_2_3_5|自带浏览器_on_红米1S_Adorid_4_3
	Gui,Add,Button,x300 y0 w80 h40 ggo,启动Chrome
	Gui,Show, , 自定义Chrome的User-agent模拟其他浏览器
	Return
	}
Else
	MsgBox, 4112, 提示, 没有安装Chrome或者无权限访问注册表!,
ExitApp

go:
gui, Submit
useragent = % %ua%
if !useragent
	useragent := ua
Run, %Chrome_path% -user-agent="%useragent%"
ExitApp

GuiClose:
ExitApp

自定义Chrome的User-agent模拟其他浏览器.zip


PrintScreen并保存以备粘贴 Autohtokey 3331

作者为 发表

Autohotkey

#c::
GetClip:
ClipSave := ClipboardAll
Send, {PrintScreen}
Sleep, 200
Clip := ClipboardAll
Clipboard := ClipSave
a := fileopen("clip.tmp","w")
a.RawWrite(Clip,StrLen(Clip))
a.Close()
Return

#v::
ReadClip:
ClipSave := ClipboardAll
;读取文件到剪切板
FileRead, Clipboard, *c clip.tmp
Send, ^v
Sleep, 200
Clipboard := ClipSave
Return


RawWrite、Rawread示例 Autohotkey 3678

作者为 发表

Autohotkey

;写
a := fileopen("test.txt","w") ;写入方式打开
b := ClipboardAll ;赋值从剪切板
u :=  A_IsUnicode ? 2 : 1 ;Unicode版长度为2
a.RawWrite(b,StrLen(b)*u) ;长度为变量的长度
a.Close()
;读
a := fileopen("test.txt","r")
c = 0
a.Rawread(c,a.Length)
ListVars
Pause


获取变量的十六进制视图函数两枚 Autohotkey 6807

作者为 发表

Autohotkey

;调用测试示例
a := ClipboardAll ;赋值
;两种方法测试耗时
oldtime := A_TickCount
test1 := HexOut(a) ;方法1
time1 := A_TickCount-oldtime
oldtime := A_TickCount
test2 := HexOut2(a) ;方法2
time2 := A_TickCount-oldtime
;MsgBox, 64, 提示, 方法1:%test1%`n耗时:%time1%ms`n`n方法2:%test2%`n耗时:%time2%ms
MsgBox, 64, 提示, 方法1耗时:%time1%ms`n`n方法2耗时:%time2%ms


HexOut(var,h:=0){
u :=  A_IsUnicode ? 2 : 1 ;Unicode版ahk字符长度是2
hex := {0:0,1:1,2:2,3:3,4:4,5:5,6:6,7:7,8:8,9:9,10:"A",11:"B",12:"C",13:"D",14:"E",15:"F"} ;预置0-F的十六进制值
Loop % StrLen(var) ;循环变量的长度/次
{
char := NumGet(var, (A_index-1)*u, "UChar") ;内存读取无格式单字节Asc值
;串接
out .= hex[Floor(char/16)] hex[mod(char,16)] ;十进制转十六进制 Floor向下取整第二位 mod取余数第一位 并分别十六进制
}
if h = 1
	Return "0x" out ;返回0xFF格式
Else
	Return out ;返回FF格式
}

HexOut2(var,h:=0){
u :=  A_IsUnicode ? 2 : 1
Loop % StrLen(var) ;循环变量的长度/次
{
char := NumGet(&var, (A_index-1)*u, "UChar") ;内存读取无格式单字节Asc值
;串接十六进制
SetFormat, IntegerFast, hex
StringReplace, char, char, 0x, , All
SetFormat, IntegerFast, d
out .= StrLen(char)=2 ? char : "0" char
}
if h = 1
	Return "0x" out ;返回0xFF格式
Else
	Return out ;返回FF格式
}


在ahk中可能会有以下几种情况会用到URL:

  1. 需要打开某网站,并且会模拟登陆什么的。这种情况可以分3种:

    (1)打开网址,通过ImageSearch等方式找到位置点击并登陆。

    常用命令:

Run,  ;打开百度 
Run, D:\Program Files (x86)\sogouexplorer\SogouExplorer.exe http://thinkai.net ;指定浏览器打开
Run, iexplore.exe http://ahk8.com, , hide ;隐藏打开 一定程度不起作用

Loop
{
ImageSearch, out_x, out_y, 0, 0, %A_ScreenWidth%, %A_ScreenHeight%, d:\test.bmp ;全屏找BMP图片 找到退出循环
If !errorlevel
	{
	MsgBox, 找到该BMP,左上角坐标是%out_x%`,%out_y%
	}
}

    (2)IE打开,通过COM打开网址并进行一系列静默操作(类似ControlSend)。可以参考星雨朝霞写的AHKinfo 窗口信息工具 和 一键登录AHK中文论坛[网页操作]


    (3)后台静默打开。这时就可能要用到WGET UrlDownloadToFile UrlDownloadToVar WinHttp.WinHttpRequest.5.1这四个函数了。

    WGET wget是一个从网络上自动下载文件的自由工具,支持通过HTTP、HTTPS、FTP三个最常见的TCP/IP协议下载,并可以使用HTTP代理.Windows版:wget.zip 功能比较全,建议用此命令来模拟登陆,支持post数据,支持cookie,支持改user-agent。下面是程序的参数:

GNU Wget 1.11.4, a non-interactive network retriever.
Usage: wget [OPTION]... [URL]...

Mandatory arguments to long options are mandatory for short options too.

Startup:
  -V,  --version           display the version of Wget and exit.
  -h,  --help              print this help.
  -b,  --background        go to background after startup.
  -e,  --execute=COMMAND   execute a `.wgetrc'-style command.

Logging and input file:
  -o,  --output-file=FILE    log messages to FILE.
  -a,  --append-output=FILE  append messages to FILE.
  -d,  --debug               print lots of debugging information.
  -q,  --quiet               quiet (no output).
  -v,  --verbose             be verbose (this is the default).
  -nv, --no-verbose          turn off verboseness, without being quiet.
  -i,  --input-file=FILE     download URLs found in FILE.
  -F,  --force-html          treat input file as HTML.
  -B,  --base=URL            prepends URL to relative links in -F -i file.

Download:
  -t,  --tries=NUMBER            set number of retries to NUMBER (0 unlimits).
       --retry-connrefused       retry even if connection is refused.
  -O,  --output-document=FILE    write documents to FILE.
  -nc, --no-clobber              skip downloads that would download to
                                 existing files.
  -c,  --continue                resume getting a partially-downloaded file.
       --progress=TYPE           select progress gauge type.
  -N,  --timestamping            don't re-retrieve files unless newer than
                                 local.
  -S,  --server-response         print server response.
       --spider                  don't download anything.
  -T,  --timeout=SECONDS         set all timeout values to SECONDS.
       --dns-timeout=SECS        set the DNS lookup timeout to SECS.
       --connect-timeout=SECS    set the connect timeout to SECS.
       --read-timeout=SECS       set the read timeout to SECS.
  -w,  --wait=SECONDS            wait SECONDS between retrievals.
       --waitretry=SECONDS       wait 1..SECONDS between retries of a retrieval.
       --random-wait             wait from 0...2*WAIT secs between retrievals.
       --no-proxy                explicitly turn off proxy.
  -Q,  --quota=NUMBER            set retrieval quota to NUMBER.
       --bind-address=ADDRESS    bind to ADDRESS (hostname or IP) on local host.
       --limit-rate=RATE         limit download rate to RATE.
       --no-dns-cache            disable caching DNS lookups.
       --restrict-file-names=OS  restrict chars in file names to ones OS allows.
       --ignore-case             ignore case when matching files/directories.
       --user=USER               set both ftp and http user to USER.
       --password=PASS           set both ftp and http password to PASS.

Directories:
  -nd, --no-directories           don't create directories.
  -x,  --force-directories        force creation of directories.
  -nH, --no-host-directories      don't create host directories.
       --protocol-directories     use protocol name in directories.
  -P,  --directory-prefix=PREFIX  save files to PREFIX/...
       --cut-dirs=NUMBER          ignore NUMBER remote directory components.

HTTP options:
       --http-user=USER        set http user to USER.
       --http-password=PASS    set http password to PASS.
       --no-cache              disallow server-cached data.
  -E,  --html-extension        save HTML documents with `.html' extension.
       --ignore-length         ignore `Content-Length' header field.
       --header=STRING         insert STRING among the headers.
       --max-redirect          maximum redirections allowed per page.
       --proxy-user=USER       set USER as proxy username.
       --proxy-password=PASS   set PASS as proxy password.
       --referer=URL           include `Referer: URL' header in HTTP request.
       --save-headers          save the HTTP headers to file.
  -U,  --user-agent=AGENT      identify as AGENT instead of Wget/VERSION.
       --no-http-keep-alive    disable HTTP keep-alive (persistent connections).
       --no-cookies            don't use cookies.
       --load-cookies=FILE     load cookies from FILE before session.
       --save-cookies=FILE     save cookies to FILE after session.
       --keep-session-cookies  load and save session (non-permanent) cookies.
       --post-data=STRING      use the POST method; send STRING as the data.
       --post-file=FILE        use the POST method; send contents of FILE.
       --content-disposition   honor the Content-Disposition header when
                               choosing local file names (EXPERIMENTAL).
       --auth-no-challenge     Send Basic HTTP authentication information
                               without first waiting for the server's
                               challenge.

HTTPS (SSL/TLS) options:
       --secure-protocol=PR     choose secure protocol, one of auto, SSLv2,
                                SSLv3, and TLSv1.
       --no-check-certificate   don't validate the server's certificate.
       --certificate=FILE       client certificate file.
       --certificate-type=TYPE  client certificate type, PEM or DER.
       --private-key=FILE       private key file.
       --private-key-type=TYPE  private key type, PEM or DER.
       --ca-certificate=FILE    file with the bundle of CA's.
       --ca-directory=DIR       directory where hash list of CA's is stored.
       --random-file=FILE       file with random data for seeding the SSL PRNG.
       --egd-file=FILE          file naming the EGD socket with random data.

FTP options:
       --ftp-user=USER         set ftp user to USER.
       --ftp-password=PASS     set ftp password to PASS.
       --no-remove-listing     don't remove `.listing' files.
       --no-glob               turn off FTP file name globbing.
       --no-passive-ftp        disable the "passive" transfer mode.
       --retr-symlinks         when recursing, get linked-to files (not dir).
       --preserve-permissions  preserve remote file permissions.

Recursive download:
  -r,  --recursive          specify recursive download.
  -l,  --level=NUMBER       maximum recursion depth (inf or 0 for infinite).
       --delete-after       delete files locally after downloading them.
  -k,  --convert-links      make links in downloaded HTML point to local files.
  -K,  --backup-converted   before converting file X, back up as X.orig.
  -m,  --mirror             shortcut for -N -r -l inf --no-remove-listing.
  -p,  --page-requisites    get all images, etc. needed to display HTML page.
       --strict-comments    turn on strict (SGML) handling of HTML comments.

Recursive accept/reject:
  -A,  --accept=LIST               comma-separated list of accepted extensions.
  -R,  --reject=LIST               comma-separated list of rejected extensions.
  -D,  --domains=LIST              comma-separated list of accepted domains.
       --exclude-domains=LIST      comma-separated list of rejected domains.
       --follow-ftp                follow FTP links from HTML documents.
       --follow-tags=LIST          comma-separated list of followed HTML tags.
       --ignore-tags=LIST          comma-separated list of ignored HTML tags.
  -H,  --span-hosts                go to foreign hosts when recursive.
  -L,  --relative                  follow relative links only.
  -I,  --include-directories=LIST  list of allowed directories.
  -X,  --exclude-directories=LIST  list of excluded directories.
  -np, --no-parent                 don't ascend to the parent directory.

Mail bug reports and suggestions to <bug-wget@gnu.org>.


    UrlDownloadToFile 是AHK自带的一个命令。支持http和ftp,但不能提交数据等,但是速度很快。注意如果通过此命令执行网页代码比如php时间过长的话会自己断掉。所以可以使用WGET等。

    UrlDownloadToVar 这是官方论坛上的一个函数,主要通过Dllcall下载数据到变量,不产生文件,缺点是较慢。下面是它的代码:

msgbox % UrlDownloadToVar(" ;调用演示 

UrlDownloadToVar(URL, Proxy="", ProxyBypass="") {
AutoTrim, Off
hModule := DllCall("LoadLibrary", "str", "wininet.dll") 

If (Proxy != "")
AccessType=3
Else
AccessType=1
;INTERNET_OPEN_TYPE_PRECONFIG                    0   // use registry configuration
;INTERNET_OPEN_TYPE_DIRECT                       1   // direct to net
;INTERNET_OPEN_TYPE_PROXY                        3   // via named proxy
;INTERNET_OPEN_TYPE_PRECONFIG_WITH_NO_AUTOPROXY  4   // prevent using java/script/INS

io_hInternet := DllCall("wininet\InternetOpenA"
, "str", "" ;lpszAgent
, "uint", AccessType
, "str", Proxy
, "str", ProxyBypass
, "uint", 0) ;dwFlags

iou := DllCall("wininet\InternetOpenUrlA"
, "uint", io_hInternet
, "str", url
, "str", "" ;lpszHeaders
, "uint", 0 ;dwHeadersLength
, "uint", 0x80000000 ;dwFlags: INTERNET_FLAG_RELOAD = 0x80000000 // retrieve the original item
, "uint", 0) ;dwContext

If (ErrorLevel != 0 or iou = 0) {
DllCall("FreeLibrary", "uint", hModule)
return 0
}

VarSetCapacity(buffer, 512, 0)
VarSetCapacity(NumberOfBytesRead, 4, 0)
Loop
{
  irf := DllCall("wininet\InternetReadFile", "uint", iou, "uint", &buffer, "uint", 512, "uint", &NumberOfBytesRead)
  NOBR = 0
  Loop 4  ; Build the integer by adding up its bytes. - ExtractInteger
    NOBR += *(&NumberOfBytesRead + A_Index-1) << 8*(A_Index-1)
  IfEqual, NOBR, 0, break
  ;BytesReadTotal += NOBR
  DllCall("lstrcpy", "str", buffer, "uint", &buffer)
  res = %res%%buffer%
}
StringTrimRight, res, res, 2

DllCall("wininet\InternetCloseHandle",  "uint", iou)
DllCall("wininet\InternetCloseHandle",  "uint", io_hInternet)
DllCall("FreeLibrary", "uint", hModule)
AutoTrim, on
return, res
}

    WinHttp.WinHttpRequest.5.1 是官方手册里面一个示例,通过COM下载数据到变量。

  1. 热键定义

    亲,你了解热键吗?热键,又叫快速键或快捷键,指通过某些特定的按键、按键顺序或按键组合来完成一个操作,很多快捷键往往与如 Ctrl 键、Shift 键、Alt 键、Fn 键以及 Windows 平台下的 Windows 键和 Mac 机上的 Meta 键等配合使用。在Autohotkey中热键涵盖了键盘、鼠标、游戏手柄、遥控器以及特殊按键。不了解的同学可以在帮助页面内查看。

2. 使用方式

    (1)可以通过“热键::”的方式,在脚本中直接定义,但是缺点是不可以灵活设置。例:

^!z::
Msgbox, 你按了Ctrl+Alt+z!
Return

    (2)可以用hotkey命令,Hotkey, 热键, 标签, 选项(开On/关Off/其他)。其中,热键和标签都可以是变量。例:

#Persistent ;一直运行
Hotkey, ^!z, my_label, On
Return

my_label:
MsgBox, 你按了%A_ThisHotkey%!
return

    (3)可以发送到默认窗口或者指定窗口或控件。参见Send / SendRaw / SendInput / SendPlay / SendEvent ControlSend / ControlSendRaw

3. 热键组合方式

    组合模式为【修饰符】+【按键修饰符】+【键】或者【键】&【键】。

    修饰符:

    ~:激发热键时,不会屏蔽(被操作系统隐藏)热键中按键原有的功能。

            $:通常只在脚本使用 Send 命令发送包含了热键自身的按键时才需要使用此符号, 此时可以避免触发它自己。

    按键修饰符:

    #(Win 徽标键) !(Alt) ^(Ctrl) +(Shift) <>(左右区域) <^>!(AltGr) UP(抬起)

    详见热键前缀符号表 (修饰符)

    示例:

;挂上键盘钩子 便于查看所有按下的键
#UseHook
#InstallKeybdHook
#InstallKeybdHook
a::
/::
`::
F1:: ;辅助键
~x:: ;Ctrl+x
#q:: ;Win+q
^!+m:: ;Ctrl+Alt+Shift+m
^LButton:: ;Ctrl+鼠标左键
^RButton:: ;Ctrl+鼠标右键
^MButton:: ;Ctrl+鼠标中键
^WheelDown:: ;Ctrl+鼠标滚轮下滑
^WheelUp:: ;Ctrl+鼠标滚轮上滑
^SC20:: ;Ctrl+d
^VK53:: ;Ctrl+s
$#z:: ;Win+z 屏蔽send发送的此热键触发
a & b:: ;a+b
MsgBox, 你按下了%A_ThisHotkey%!
Return

提示,要监控所有按键操作的话,可以在脚本头加上:

#UseHook
#InstallKeybdHook
#InstallKeybdHook

然后双击autohotkey图标,按照下图或者Ctrl+K查看所有按键,还会有VK、SC值以及作用窗口:



Autohotkey+php+sqlserver呼叫中心外呼数据提交工具案例 6013

作者为 发表

Autohotkey

本人写来单位自用的一个呼叫中心外呼的一个提取/提交数据工具,po出来仅供交流学习之用。

php接口(UTF-8):

<?php
$c = new PDO( "sqlsrv:server=(local); Database = ", "username", "password", array(PDO::SQLSRV_ATTR_DIRECT_QUERY => true)); 
if (isset($_GET['str'])){
$str_obj = explode(";",urldecode($_GET['str']));
$str = $str_obj[0];
$token = substr($str,(strlen($str)-12),12);
if ($token=="))))"){
	if (isset($_GET['o'])){
	if ($_GET['o']==1){
	echo qt((substr($str,0,(strlen($str)-12))));
	}else if ($_GET['o']==2){
	echo get_rowcount((substr($str,0,(strlen($str)-12))));
	}
	}else{
		echo  query((substr($str,0,(strlen($str)-12))));
	}
}else{
	echo "Error token!";
}
}
function get_rowcount($query){
	global $c;
	$stmt = $c->prepare( $query, array(PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL));
	$stmt->execute();
	global $rowcount;
	$rowcount=NULL;
	 $rowcount = $stmt->rowCount();
	return $rowcount;
}
function query($query){
	global $c;
	$stmt = $c->prepare( $query, array(PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL));
	$stmt->execute();
	global $rowcount;
	$rowcount=NULL;
	 $rowcount = $stmt->rowCount();
	if(stripos($query, 'update') !== false){
	      return "UP".$rowcount; 
	}elseif(stripos($query, 'delete') !== false){
	      return "DE".$rowcount; 
	}elseif(stripos($query, 'insert') !== false){
	      return "IN".$rowcount; 
	}else{
	$content=NULL;
	if( $stmt->rowCount() == 0){
	      return "";
	}else{
	   while ( $row = $stmt->fetch( PDO::FETCH_NUM ) ){
		for($i = 0; $i < $stmt->columnCount(); $i++)
	     {
	          $type=gettype($row[$i]);
	          if ($type=="object"){
	          	 $var=$row[$i];
	          	 $time=str_replace("T"," ",$var->format(DateTime::ISO8601));
	          	 $time=substr($time,0,19);
	          	 $time=$time.".000"; 
	         	 $content=$content.$time.",";
	          }else{
	          	  $ctmp=str_replace(",",",",$row[$i]);
	          	  $content=$content.$ctmp.",";
	          }
	     }
	     $content=$content."\n";
	}
	$content=str_replace(",\n","\n",$content);
	return $content;
	}
	}
}
function qt($query){
	global $c;
	$stmt = $c->prepare( $query, array(PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL));
	$stmt->execute();
	global $rowcount;
	$rowcount=NULL;
	 $rowcount = $stmt->rowCount();
	if(stripos($query, 'update') !== false){
	      return "UP".$rowcount; 
	}elseif(stripos($query, 'delete') !== false){
	      return "DE".$rowcount; 
	}elseif(stripos($query, 'insert') !== false){
	      return "IN".$rowcount; 
	}else{
	$content=NULL;
	if( $stmt->rowCount() == 0){
	      return "NO";
	}else{
	 $a = $stmt->fetch( PDO::FETCH_ASSOC);
	 $Fields = array_keys($a); 
	 global $titles;
	 $titles=NULL;
	 for($i = 0; $i < $stmt->columnCount(); $i++)
		{
		$name=iconv('GB2312','UTF-8',$Fields[$i]);
		$titles=$titles."$name,";
		} 
		$titles=$titles."\r\n";
		$titles=str_replace(",\r\n","",$titles);
		$content = $titles."\r\n";
	   $stmt->execute();
	   while ( $row = $stmt->fetch( PDO::FETCH_NUM ) ){
		for($i = 0; $i < $stmt->columnCount(); $i++)
	     {
	          $type=gettype($row[$i]);
	          if ($type=="object"){
	          	 $var=$row[$i];
	          	 $time=str_replace("T"," ",$var->format(DateTime::ISO8601));
	          	 $time=substr($time,0,19);
	          	 $time=$time.".000"; 
	         	 $content=$content.$time.",";
	          }else{
	          	  $ctmp=str_replace(",",",",$row[$i]);
	          	  $content=$content.$ctmp.",";
	          }
	     }
	     $content=$content."\r\n";
	}
	$content=str_replace(",\r\n","\r\n",$content);
	return $content;
	}
	}
}
?>

数据库结构(三张表):

USE [Database1]
GO

DROP TABLE [dbo].[增值业务目标客户]
GO

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[增值业务目标客户](
	[地区] [nvarchar](50) NOT NULL,
	[手机号码] [nvarchar](11) NOT NULL,
	[外呼业务] [nvarchar](50) NOT NULL,
	[语种] [nvarchar](50) NULL,
	[导入日期] [date] NULL,
	[ID] [int] IDENTITY(1,1) NOT NULL,
	[SID] [int] NULL,
	[工号] [nvarchar](50) NULL,
 CONSTRAINT [PK_增值业务] PRIMARY KEY CLUSTERED 
(
	[ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

DROP TABLE [dbo].[增值业务目标任务]
GO

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[增值业务目标任务](
	[地区] [nvarchar](50) NOT NULL,
	[外呼业务] [nvarchar](50) NOT NULL,
	[语种] [nvarchar](50) NOT NULL,
	[导入日期] [date] NOT NULL,
	[locked] [int] NULL,
	[id] [int] IDENTITY(1,1) NOT NULL
) ON [PRIMARY]

GO



ALTER TABLE [dbo].[增值业务数据提交] DROP CONSTRAINT [DF_增值业务数据提交_导入时间]
GO

ALTER TABLE [dbo].[增值业务数据提交] DROP CONSTRAINT [DF_增值业务数据提交_提交日期]
GO

ALTER TABLE [dbo].[增值业务数据提交] DROP CONSTRAINT [DF_增值业务数据提交_提交单位]
GO

DROP TABLE [dbo].[增值业务数据提交]
GO

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[增值业务数据提交](
	[工号] [nvarchar](50) NULL,
	[姓名] [nvarchar](50) NULL,
	[外呼日期] [nvarchar](50) NULL,
	[业务类型] [nvarchar](50) NULL,
	[地州] [nvarchar](50) NULL,
	[语种] [nvarchar](50) NULL,
	[用户号码] [nvarchar](50) NULL,
	[接通情况] [nvarchar](50) NULL,
	[备注] [nvarchar](255) NULL,
	[质检结果] [nvarchar](50) NULL,
	[质检备注] [nvarchar](50) NULL,
	[质检人] [nvarchar](50) NULL,
	[质检时间] [datetime] NULL,
	[提交单位] [nvarchar](50) NULL,
	[提交日期] [date] NULL,
	[ID] [int] IDENTITY(1,1) NOT NULL,
	[LID] [int] NULL,
	[导入时间] [datetime] NULL
) ON [PRIMARY]

GO

ALTER TABLE [dbo].[增值业务数据提交] ADD  CONSTRAINT [DF_增值业务数据提交_提交单位]  DEFAULT (N'呼叫中心') FOR [提交单位]
GO

ALTER TABLE [dbo].[增值业务数据提交] ADD  CONSTRAINT [DF_增值业务数据提交_提交日期]  DEFAULT (CONVERT([date],getdate())) FOR [提交日期]
GO

ALTER TABLE [dbo].[增值业务数据提交] ADD  CONSTRAINT [DF_增值业务数据提交_导入时间]  DEFAULT (getdate()) FOR [导入时间]
GO

Autohotkey代码(ANSI32):

#SingleInstance force ;单线程
FileEncoding, UTF-8 ;php pdo是utf-8的
FileInstall, 1.bmp, 1.bmp ;打电话的图标
FileInstall, 2.bmp, 2.bmp
;数据库配置信息
host = 135.230.71.1
api = http://%host%/sqlapi.php ;接口url
oldtime = %A_TickCount% ;上次点击时间
;检查连通性
if Not InStr(ping_info := ping(host),"正常")
	{
	MsgBox, 4112, 网络错误, % ping_info
	ExitApp
	}
;登陆界面
gui, login:add, text, x0 y0 w60 h20, 工号:
gui, login:add, edit, x60 y0 w200 h20 vuser_id,
gui, login:add, text, x0 y20 w60 h20, 姓名:
gui, login:add, edit, x60 y20 w200 h20 vuser_name,
gui, login:add, text, x0 y40 w60 h20, 语种:
gui, login:add, DropDownList, x60 y40 w200 h60 vuser_lang, 汉语|英语
gui, login:add, button, x0 y60 w260 h20 glogin, 登陆
gui, login:show, , 坐席登陆
gui, login:+AlwaysOnTop
Return

login:
Gui, login:Submit, NoHide
if user_lang=
	{
	MsgBox, 4112, 错误, 未选择语种!
	Return
	}
user_id := StrLen(user_id)=3 ? user_id : SubStr(user_id,1,3) ;只保留前三位
user_id := user_id "#" ;添加#
;检查工号是否在数据库内
if (get_1_result("SELECT count(*) FROM [Database1].[dbo].[用户表] where 工号='" user_id "'")>0)
	{
	gui, login:Destroy
	goto, show
	}
Else
	{
	MsgBox, 4112, 错误, 没有此工号!
	}
Return

show:
;创建界面
Gui,main:Add,Text,x0 y3 w60 h12,当前任务:
Gui,main:Font,Normal s8 c0x0 Bold,Verdana
Gui,main:Add,Text,x60 y3 w260 h15 vtask_name,
Gui,main:Font
Gui,main:Add,Button,x320 y0 w40 h20 gchoose, 选择
Gui,main:Add,Text,x360 y3 w60 h12,任务信息:
Gui,main:Font,Normal s8 Bold,Verdana
Gui,main:Add,Text,x420 y3 w230 h15 vtask_info,
Gui,main:Font
Gui,main:Add,Text,x0 y23 w60 h12,联系电话:
Gui,main:Font,Normal s9 c0x0 Bold,Verdana
Gui,main:Add,Edit,x60 y20 w120 h20 ReadOnly 1 Border vphone,
Gui,main:Font
Gui,main:Add,Button,x180 y20 w50 h20 gcall,外呼
Gui,main:Add,Text,x230 y23 w60 h12,接通情况:
Gui,main:Add,DropDownList,x290 y20 w200 vcalling_result, 通后挂断|无人接听|成功|关机|无法接通|少数民族|停机|用户考虑|空号|拒绝使用|老人小孩|不是机主
Gui,main:Add,Text,x0 y43 w60 h12,备注:
Gui,main:Add,Edit,x60 y40 w430 h20 vnote,
Gui,main:Add,ListView,x0 y60 w650 h108, 工号|姓名|外呼日期|业务类型|地州|语种|用户号码|接通情况|备注|质检结果|质检备注|质检人|质检时间|提交单位|提交日期|ID|LID|导入时间
Gui,main:Add,Button,x490 y20 w80 h40 gsubmit, 提交
Gui,main:Add,Button,x570 y20 w80 h40 gupdate, 修改
Gui,main:Show,w650 h170 , xx呼叫中心增值业务
Gui,main:+AlwaysOnTop
Gui,main:Default
Gosub, show_lv ;显示当日已拨打电话
Return



submit:
;检查是否频繁提交
if newtime<>
	oldtime = %newtime%
newtime = %A_TickCount%
timediff := newtime-oldtime
if timediff < 6000
	{
	MsgBox, 4144, 提示, 请勿频繁提交,稍后再试!
	Return
	}
;获取表单
gui, main:submit, NoHide
GuiControl, main:Choose, calling_result, 0
GuiControl, main:, note,
calldate = %A_YYYY%-%A_MM%-%A_DD%
;插入
effect_row := get_rowcount("INSERT INTO [Database1].[dbo].[增值业务数据提交] ([工号],[姓名],[外呼日期],[业务类型],[语种],[地州],[用户号码],[接通情况],[备注],[LID])Values('" user_id "','" user_name "','" calldate "','" business "','" user_lang "','" area "','" phone "','" calling_result "','" note "','" id "')")
;获取刚才插入的id
sid := get_1_result("select top 1 id from [Database1].[dbo].[增值业务数据提交] where 工号='" user_id "' and 外呼日期='" calldate "' and 用户号码='" phone "' order by id desc")
;在目标客户表里添加sid 即提交表里的id
effect_row := get_rowcount("update [Database1].[dbo].[增值业务目标客户] set sid='" sid "' where id='" id "'")
Gosub, show_lv
goto, get_task
Return

update:
;获取单击点中的行
FocusedRowNumber := LV_GetNext(0, "F")
if not FocusedRowNumber
	{
	MsgBox, 4144, 提示, 您未选择任何当已提交数据!
	Return
	}
LV_GetText(e_id, FocusedRowNumber, 16)

WinGetPos, x, y, , , xx呼叫中心增值业务
gui, main:Hide
WinHide, xx呼叫中心增值业务
gui, 3:Destroy
gui, 3:add, DropDownList, x0 y0 w200 h600 ve_calling_result, 通后挂断|无人接听|成功|关机|无法接通|少数民族|停机|用户考虑|空号|拒绝使用|老人小孩|不是机主
gui, 3:add, Button, x200 y0 w40 h20 gsubupdate,确定
gui, 3:show, x%x% y%y% , 修改接通情况
Return

subupdate:
GuiControlGet, e_calling_result
;排除没有选择的情况
if e_calling_result <>
	{
	gui, 3:Destroy
	gui, main:show
	;更新
	effect_row := get_rowcount("update [Database1].[dbo].[增值业务数据提交] set 接通情况='" e_calling_result "' where id='" e_id "'")
	}
Return


call:
;在拨打界面网页内直接输入号码并点击拨打
Clipboard = %phone%
WinWait, 客服中心拨打界面
WinActivate, 客服中心拨打界面
error = 1
Loop, 1000
{
ImageSearch, x, y, 0, 0, %A_ScreenWidth%, %A_ScreenHeight%, 1.bmp
if !Errorlevel
	{
	x+=30
	y+=5
	MouseClick, Left, %x%, %y%
	loop, 20
	{
	Send, {Delete}{BackSpace}
	}
	send, ^v
	error = 0
	Break
	}
Sleep, 50
}
if error = 0
	{
	Loop, 1000
	{
	ImageSearch, x, y, 0, 0, %A_ScreenWidth%, %A_ScreenHeight%, 2.bmp
	if !Errorlevel
		{
		x+=10
		y+=5
		MouseClick, Left, %x%, %y%
		Break
		}
	Sleep, 50
	}
	}
Return


show_lv:
;删除现有
LV_Delete()
;获取当日该工号外呼提交数据倒序前20项
result := get_result("select top 20 * from [Database1].[dbo].[增值业务数据提交] where 工号='" user_id "' and 外呼日期=cast(cast(getdate() as date) as nvarchar) and 接通情况 is not null order by id desc")
;按行分割
StringSplit, line, result, `n
loop % line0
{
;赋值临时行
tmp_line = % line%A_index%
	if tmp_line<> ;不为空
	{
	StringSplit, var, tmp_line, `,
	LV_Add("",var1,var2,var3,var4,var5,var6,var7,var8,var9,var10,var11,var12,var13,var14,var15,var16,var17,var18)
	}
}
;自动调整列宽
LV_ModifyCol()
Return

choose:
WinGetPos, x, y, , , xx呼叫中心增值业务
gui, main:Hide
WinHide, xx呼叫中心增值业务
;查询目标任务表中放行的目标客户表中的数据
result := get_result("SELECT [地区]+[外呼业务]+[语种]+cast([导入日期] as nvarchar) FROM [Database1].[dbo].[增值业务目标客户] where [地区]+[外呼业务]+[语种]+cast([导入日期] as nvarchar) in (SELECT [地区]+[外呼业务]+[语种]+cast([导入日期] as nvarchar) FROM [Database1].[dbo].[增值业务目标任务] where locked=0 and [语种]='" user_lang "') group by [地区]+[外呼业务]+[语种]+cast([导入日期] as nvarchar)")
gui, 2:Destroy
StringReplace, tasks, result, `n, |, All
gui, 2:add, DropDownList, x0 y0 w300 h600 vctask, %tasks%
gui, 2:add, Button, x300 y0 w40 h20 gsubchoose,确定
gui, 2:show, x%x% y%y% , 选择任务
Return

subchoose:
GuiControlGet, ctask
gui, 2:Destroy
gui, main:show
GuiControl, main:, task_name, %ctask%
;显示任务信息,15间隔重复
SetTimer, show_task_info, 15000
oldtime = %A_TickCount%
goto, get_task
Return

get_task:
;检查是否有该工号占有但是没有提交的数据  提交的数据会有sid
if (get_1_result("SELECT count(*) FROM [Database1].[dbo].[增值业务目标客户] where [地区]+[外呼业务]+[语种]+cast([导入日期] as nvarchar)='" ctask "' and 工号='" user_id "' and sid is null")<1)
	{
	;占有一个
	effect_row := get_rowcount("update [Database1].[dbo].[增值业务目标客户] set 工号='" user_id "' where id=(SELECT TOP 1 id FROM [Database1].[dbo].[增值业务目标客户] where [地区]+[外呼业务]+[语种]+cast([导入日期] as nvarchar)='" ctask "' and 工号 is null)")
	}
;获取已占有数据量
tmp_rows := get_1_result("SELECT count(*) FROM [Database1].[dbo].[增值业务目标客户] where [地区]+[外呼业务]+[语种]+cast([导入日期] as nvarchar)='" ctask "' and 工号='" user_id "' and sid is null")
if tmp_rows > 0
	{
	;获取已占有数据
	tmp_row := get_1_result("SELECT TOP 1 * FROM [Database1].[dbo].[增值业务目标客户] where [地区]+[外呼业务]+[语种]+cast([导入日期] as nvarchar)='" ctask "' and 工号='" user_id "' and sid is null")
	;分割数据
	StringSplit, tmp_var, tmp_row, `,
	area := tmp_var1
	phone := tmp_var2
	business := tmp_var3
	id := tmp_var6
	GuiControl, main:, phone, %phone%
	}
Else
	{
	MsgBox, 4112, 提示, 当前任务已空!
	}
Return


show_task_info:
GuiControl, main:, task_info, % "当前任务总量:" get_1_result("SELECT count(*) FROM [Database1].[dbo].[增值业务目标客户] where [地区]+[外呼业务]+[语种]+cast([导入日期] as nvarchar)='" ctask "'")
Sleep, 2800
GuiControl, main:, task_info, % "当前任务剩余量:" get_1_result("SELECT count(*) FROM [Database1].[dbo].[增值业务目标客户] where [地区]+[外呼业务]+[语种]+cast([导入日期] as nvarchar)='" ctask "' and [工号] is null")
Sleep, 2800
GuiControl, main:, task_info, % "您当日的外呼量:" get_1_result("select count(*) from [Database1].[dbo].[增值业务数据提交] where 工号='" user_id "' and 外呼日期=cast(getdate() as date) and 接通情况 is not null")
Sleep, 2800
GuiControl, main:, task_info, % "您当日的外呼成功量:" get_1_result("select count(*) from [Database1].[dbo].[增值业务数据提交] where 工号='" user_id "' and 外呼日期=cast(getdate() as date) and 接通情况='成功' and (质检结果 is null or 质检结果='合格')")
Sleep, 2800
GuiControl, main:, task_info, % "您当日的质检不合格量:" get_1_result("select count(*) from [Database1].[dbo].[增值业务数据提交] where 工号='" user_id "' and 外呼日期=cast(getdate() as date) and 接通情况='成功' and 质检结果='不合格'")
Return

;ping检查网络函数
ping(ip){
RunWait, %ComSpec% /c ping -n 1 %ip% >%A_Temp%\ahk_ping.tmp, , Hide
FileRead, content, %A_Temp%\ahk_ping.tmp
StringReplace, content, content, `r, , All
StringSplit, var, content, `n
If content Contains 请求超时,Request timed out
	Return "请求超时"
If content Contains 找不到主机,could not find host
	Return "找不到主机"
If content Contains 无法访问目标主机,Destination host unreachable
	Return "无法访问目标主机"
Else
	{
	time := RegExReplace(var3, "(来自|Reply from) \d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}[\s的回复|]*: (字节|bytes)=\d{1,3}\ (时间|time)[=<](\d{1,3})ms TTL=\d{1,3}","$4")
	Return "正常 time:" time "ms"
	}
}

;转码函数
urlencode(string,utf8:=1){
if (utf8=1 && A_IsUnicode<>1)
	{
	clip := ClipboardAll
	Clipboard = %string%
	Transform, string, Unicode
	Clipboard := clip
	}
StringLen, len, string
Loop % len
{
SetFormat, IntegerFast, hex
StringMid, out, string, %A_Index%, 1
hex := Asc(out)
hex2 := hex
StringReplace, hex, hex, 0x, , All
SetFormat, IntegerFast, d
hex2 := hex2
If (hex2==33 || (hex2>=39 && hex2 <=42) || hex2==45 || hex2 ==46 || (hex2>=48 && hex2<=57)    || (hex2>=65 && hex2<=90) || hex2==95 || (hex2>=97 && hex2<=122) || hex2==126)
	content .= out
Else
	content .= "`%" hex
}
Return content
}

;执行SQL并返回带标题的csv逗号分隔格式的结果的函数
get_result_with_colname(sql){
global api ;全局变量
URLDownloadToFile, % api "?str=" urlencode(sql "))))") "&o=1", %A_Temp%\res_with_colname.tmp
FileRead, result, %A_Temp%\res_with_colname.tmp
Return result
}

;执行SQL并返回不带标题的csv逗号分隔格式的结果的函数
get_result(sql){
global api
URLDownloadToFile, % api "?str=" urlencode(sql "))))"), %A_Temp%\res.tmp
FileRead, result, %A_Temp%\res.tmp
Return result
}

;执行SQL并返回不带标题的csv逗号分隔格式的第一项结果的函数
get_1_result(sql){
global api
URLDownloadToFile, % api "?str=" urlencode(sql "))))"), %A_Temp%\1res.tmp
FileReadLine, result, %A_Temp%\1res.tmp, 1
Return result
}

;执行SQL并返回影响结果数量的函数
get_rowcount(sql){
global api
URLDownloadToFile, % api "?str=" urlencode(sql "))))") "&o=2", %A_Temp%\rowcount
FileReadLine, result, %A_Temp%\rowcount.tmp, 1
Return result
}

loginGuiclose:
mainGuiClose:
ExitApp

ahk+php+sqlserver呼叫中心外呼数据提交工具案例.zip


多级(原七级)文字点击输入菜单 Autohotkey 5271

作者为 发表

Autohotkey

应网友jem需求编写。

2014-09-23更新:

多级(原七级)文字点击输入菜单.zip

;多级字符输入菜单 by Thinkai @2014-09-23
;EscapeChar = | ;菜单分隔符。不建议用中文字符,可能会导致显示错误。默认为“,”
;加载文件到数组
e := file_menu_2_obj("e.csv")
Return

;写你的热键并调用函数
::c::
#e::
create_menu(e)
return


file_menu_2_obj(file){
;加载菜单文件到数组
if !file
  {
  MsgBox, 4112, 错误, 文件%file%不存在!
  return "Error:No file"
  }
Else
  {
  FileRead, content, %file%
  Return csv2obj(content)
  }
}

csv2obj(string){
;csv分隔符格式文本转object函数
obj := Object() ;初始化
StringReplace, string, string, `r, , All ;去回车
StringSplit, var, string, `n ;按行分割
Loop % var0 ;循环读取
{
tmp_line := var%A_Index% ;赋值临时行
if tmp_line <>
    {
    tmp_obj := string_2_obj(tmp_line) ;文本转object函数
    obj := combine_obj(tmp_obj,obj) ;合并数组
    }
}
return obj
}
;文本转object函数
string_2_obj(string){
;全局分隔符
global EscapeChar
if (!EscapeChar)
	EscapeChar = ,
obj := object() ;初始化
StringSplit, var, string, %EscapeChar% ;按分隔符分割
if var0 > 1
    {
    ;下级成为上级的一个key
	Loop % var0-1
    {
    index := var0-A_index
    index2 := index+1
    obj%index% := object()
    obj%index%[var%index2%] := 0
	}
	;下级数组成为上级数组的一个key
	Loop % var0-2
    {
    index := var0-A_index-1
    index2 := index+1
    obj%index%[var%index2%] := obj%index2%
    }
    ;定义根数组
	obj[var1] := obj1
    return obj
    }
Else
    {
    ;只有一个值
	obj[var1] := 0
    return obj
    }
}

combine_obj(obj1,obj2){
;联合数组函数
for k,v in obj1
    {
    if (inobj(obj2,k)) ;两个数组有相同键
        {
		if (isobject(obj1[k]) && isobject(obj2[k])) ;都是数组 合并
            obj2[k] := combine_obj(obj1[k],obj2[k])
        Else if (isobject(obj1[k]) && !isobject(obj2[k])) ; 数组2的相应键不是数组 赋值为数组1的对应键
            obj2[k] := obj1[k]
        }
    Else
        {
        obj2[k] := v ;数组2没有该键 添加
        }
    }
Return obj2
}

create_menu(obj,menu_name:="main",index:=1){
;创建并显示菜单函数
keys := ["",1,2,3,4,5,6,7,8,9,0,"a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"]
;创建主菜单
Menu, % menu_name, add,
Menu, % menu_name, DeleteAll
;枚举数组
for k,v in obj
{
index += 1
;如果该项是数组
if (IsObject(v))
	{
	submenu_name = %menu_name%_%k% ;定义子菜单菜单名
	;预创建子菜单 不然报错
    Menu, % submenu_name, add,
    Menu, % submenu_name, DeleteAll
	;添加子菜单
	Menu, % menu_name, add, % k ? "(&" keys[index] ") " k : "", :%submenu_name%
    create_menu(v,submenu_name)
	}
Else
	{
	;单独项
	Menu, % menu_name, add, % k ? "(&" keys[index] ") " k : "", MenuHandler
	}
}
;如果是根菜单,显示它
if menu_name = main
    menu,% menu_name, show
}



inobj(obj,key){
;判断数组内是否有指定字符的键值或变量
for k,v in obj
{
if k = %key%
    return 1
}
}


MenuHandler: ;点击菜单句柄
;转存剪切板  直接粘贴 支持中文
clip := ClipboardAll
;发送括号后面的内容
;应jem要求加入父级
StringSplit, father, A_ThisMenu, _
father = % father%father0%
current := RegExReplace(A_ThisMenuItem,"\(.*\)\s*(.*)","$1")
result := father="main" ? current : father "/" current
StringReplace, result, result, `r, , All
Clipboard := result
Send, ^v
;加等待时间 以防部分程序反应慢获取到原剪切板数据
Sleep,200
Clipboard := clip
return

七级文字点击输入菜单.zip

;七级字符输入菜单 by Thinkai @2014-09-13
EscapeChar = | ;菜单分隔符。不建议用中文字符,可能会导致显示错误。默认为“,”
;加载文件到数组
;q := file_menu_2_obj("q.txt")
;w := file_menu_2_obj("w.txt")

;无文件情况的演示
example =
(
男|高|娘
男|高|娘|搞基
男|高|娘|异性恋
男|高|娘|双性恋
男|高|猛
男|高|猪肝
男|富|帅|就|是|拽
男|帅
男|矮
男|矬
男|穷
女|白|富|美|就|是|拽
女|富
女|美
女|黑
女|穷
女|丑
人妖
畜生
禽类
微生物
)
IfNotExist, e.txt
  {
  FileAppend, %example%, e.txt
  }
;演示段落完毕

e := file_menu_2_obj("e.txt")
Return

;写你的热键并调用函数
;::a::
;#q::
;调用函数
;create_menu(q)
;return

;::b::
;#w::
;create_menu(w)
;return

::c::
#e::
create_menu(e)
return


file_menu_2_obj(file){
;加载菜单文件到数组
if !file
  {
  MsgBox, 4112, 错误, 文件%file%不存在!
  return "Error:No file"
  }
Else
  {
  FileRead, content, %file%
  Return menu_string_2_obj(content)
  }
}

menu_string_2_obj(string){
;文本菜单项转为多维数组,请请定义好EscapeChar菜单分隔符
global EscapeChar
if (!EscapeChar)
	EscapeChar = ,
out := Object()
StringSplit, var, string, `n
Loop % var0
{
if (var%A_Index%)
StringSplit, tmp, var%A_Index%, %EscapeChar%
if (tmp%tmp0%)
	{
	if tmp0 = 1
		{
		if (!inobj(out,var%A_index%))
			out[var%A_index%] := "0"
		}
	Else if tmp0 = 2
		{
		if (!IsObject(out[tmp1]))
			{
			out[tmp1] := Object()
			}
		if (!inobj(out[tmp1],tmp2))
			out[tmp1][tmp2] := "0"
		}
	Else if tmp0 = 3
		{
		if (!IsObject(out[tmp1]))
			{
			out[tmp1] := Object()
			}
		if (!IsObject(out[tmp1][tmp2]))
			{
			out[tmp1][tmp2] := Object()
			}
		if (!inobj(out[tmp1][tmp2],tmp3))
			out[tmp1][tmp2][tmp3] := "0"
		}
	Else if tmp0 = 4
		{
		if (!IsObject(out[tmp1]))
			{
			out[tmp1] := Object()
			}
		if (!IsObject(out[tmp1][tmp2]))
			{
			out[tmp1][tmp2] := Object()
			}
		if (!IsObject(out[tmp1][tmp2][tmp3]))
			{
			out[tmp1][tmp2][tmp3] := Object()
			}
		if (!inobj(out[tmp1][tmp2][tmp3],tmp4))
			out[tmp1][tmp2][tmp3][tmp4] := "0"
		}
	Else if tmp0 = 5
		{
		if (!IsObject(out[tmp1]))
			{
			out[tmp1] := Object()
			}
		if (!IsObject(out[tmp1][tmp2]))
			{
			out[tmp1][tmp2] := Object()
			}
		if (!IsObject(out[tmp1][tmp2][tmp3]))
			{
			out[tmp1][tmp2][tmp3] := Object()
			}
		if (!IsObject(out[tmp1][tmp2][tmp3][tmp4]))
			{
			out[tmp1][tmp2][tmp3][tmp4] := Object()
			}
		if (!inobj(out[tmp1][tmp2][tmp3][tmp4],tmp5))
			out[tmp1][tmp2][tmp3][tmp4][tmp5] := "0"
		}
	Else if tmp0 = 6
		{
		if (!IsObject(out[tmp1]))
			{
			out[tmp1] := Object()
			}
		if (!IsObject(out[tmp1][tmp2]))
			{
			out[tmp1][tmp2] := Object()
			}
		if (!IsObject(out[tmp1][tmp2][tmp3]))
			{
			out[tmp1][tmp2][tmp3] := Object()
			}
		if (!IsObject(out[tmp1][tmp2][tmp3][tmp4]))
			{
			out[tmp1][tmp2][tmp3][tmp4] := Object()
			}
		if (!IsObject(out[tmp1][tmp2][tmp3][tmp4][tmp5]))
			{
			out[tmp1][tmp2][tmp3][tmp4][tmp5] := Object()
			}
		if (!inobj(out[tmp1][tmp2][tmp3][tmp4][tmp5],tmp6))
			out[tmp1][tmp2][tmp3][tmp4][tmp5][tmp6] := "0"
		}
	Else if tmp0 = 7
		{
		if (!IsObject(out[tmp1]))
			{
			out[tmp1] := Object()
			}
		if (!IsObject(out[tmp1][tmp2]))
			{
			out[tmp1][tmp2] := Object()
			}
		if (!IsObject(out[tmp1][tmp2][tmp3]))
			{
			out[tmp1][tmp2][tmp3] := Object()
			}
		if (!IsObject(out[tmp1][tmp2][tmp3][tmp4]))
			{
			out[tmp1][tmp2][tmp3][tmp4] := Object()
			}
		if (!IsObject(out[tmp1][tmp2][tmp3][tmp4][tmp5]))
			{
			out[tmp1][tmp2][tmp3][tmp4][tmp5] := Object()
			}
		if (!IsObject(out[tmp1][tmp2][tmp3][tmp4][tmp5][tmp6]))
			{
			out[tmp1][tmp2][tmp3][tmp4][tmp5][tmp6] := Object()
			}
		if (!inobj(out[tmp1][tmp2][tmp3][tmp4][tmp5][tmp6],tmp7))
			out[tmp1][tmp2][tmp3][tmp4][tmp5][tmp6][tmp7] := "0"
		}
	}
}
Return out
}
MsgBox % A_IsUnicode



create_menu(out){
;创建并显示菜单函数,传入菜单数组,菜单点击到MenuHandler标签
keys := ["",1,2,3,4,5,6,7,8,9,0,"a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"]
Menu, main, add,
Menu, main,DeleteAll
index1 = 1
for k,v in out
{
index1 += 1
if (IsObject(v))
	{
	Menu, main_%k%, add,
	Menu, main_%k%, DeleteAll
	Menu, main, add, % k ? "(&" keys[index1] ") " k : "", :main_%k%
	subkey1 := k
	index2 = 1
	for k,v in out[subkey1]
	{
	index2 += 1
	if (IsObject(v))
		{
		Menu, main_%subkey1%_%k%, add,
		Menu, main_%subkey1%_%k%, DeleteAll
		Menu, main_%subkey1%, add, % k ? "(&" keys[index2] ") " k : "", :main_%subkey1%_%k%
		subkey2 := k
		index3 = 1
		for k,v in out[subkey1][subkey2]
		{
		index3 += 1
		if (IsObject(v))
			{
			Menu, main_%subkey1%_%subkey2%_%k%, add,
			Menu, main_%subkey1%_%subkey2%_%k%, DeleteAll
			Menu, main_%subkey1%_%subkey2%, add, % k ? "(&" keys[index3] ") " k : "", :main_%subkey1%_%subkey2%_%k%
			subkey3 := k
			index4 = 1
			for k,v in out[subkey1][subkey2][subkey3]
			{
			index4 += 1
			if (IsObject(v))
				{
				Menu, main_%subkey1%_%subkey2%_%subkey3%_%k%, add,
				Menu, main_%subkey1%_%subkey2%_%subkey3%_%k%, DeleteAll
				Menu, main_%subkey1%_%subkey2%_%subkey3%, add, % k ? "(&" keys[index4] ") " k : "", :main_%subkey1%_%subkey2%_%subkey3%_%k%
				subkey4 := k
				index5 = 1
				for k,v in out[subkey1][subkey2][subkey3][subkey4]
				{
				index5 += 1
				if (IsObject(v))
					{
					Menu, main_%subkey1%_%subkey2%_%subkey3%_%subkey4%_%k%, add,
					Menu, main_%subkey1%_%subkey2%_%subkey3%_%subkey4%_%k%, DeleteAll
					Menu, main_%subkey1%_%subkey2%_%subkey3%_%subkey4%, add, % k ? "(&" keys[index5] ") " k : "", :main_%subkey1%_%subkey2%_%subkey3%_%subkey4%_%k%
					subkey5 := k
					index6 = 1
					for k,v in out[subkey1][subkey2][subkey3][subkey4][subkey5]
					{
					index6 += 1
					if (IsObject(v))
						{
						Menu, main_%subkey1%_%subkey2%_%subkey3%_%subkey4%_%subkey5%_%k%, add,
						Menu, main_%subkey1%_%subkey2%_%subkey3%_%subkey4%_%subkey5%_%k%, DeleteAll
						Menu, main_%subkey1%_%subkey2%_%subkey3%_%subkey4%_%subkey5%, add, % k ? "(&" keys[index6] ") " k : "", :main_%subkey1%_%subkey2%_%subkey3%_%subkey4%_%subkey5%_%k%
						subkey6 := k
						index7 = 1
						for k,v in out[subkey1][subkey2][subkey3][subkey4][subkey5][subkey6]
						{
						index7 += 1
						Menu, main_%subkey1%_%subkey2%_%subkey3%_%subkey4%_%subkey5%_%subkey6%, add, % k ? "(&" keys[index7] ") " k : "", MenuHandler
						}
						}
					Else
						{
						Menu, main_%subkey1%_%subkey2%_%subkey3%_%subkey4%_%subkey5%, add, % k ? "(&" keys[index6] ") " k : "", MenuHandler
						}
					}
					}
				Else
					{
					Menu, main_%subkey1%_%subkey2%_%subkey3%_%subkey4%, add, % k ? "(&" keys[index5] ") " k : "", MenuHandler
					}
				}
				}
			Else
				{
				Menu, main_%subkey1%_%subkey2%_%subkey3%, add, % k ? "(&" keys[index4] ") " k : "", MenuHandler
				}
			}
			}
		Else
			{
			Menu, main_%subkey1%_%subkey2%, add, % k ? "(&" keys[index3] ") " k : "", MenuHandler
			}
		}
		}
	Else
		{
		Menu,  main_%subkey1%, add, % k ? "(&" keys[index2] ") " k : "", MenuHandler
		}
	}
	}
Else
	{
	Menu, main, add, % k ? "(&" keys[index1] ") " k : "", MenuHandler
	}
}
menu, main, show
}

inobj(obj,key){
;判断数组内是否有指定字符的键值或变量
var = 0
for k,v in obj
{
if if (k=key and v=key)
	var = 3
Else if (k=key)
	var := var>1 ? var : 1
Else if (v=key)
	var := var>2 ? var : 2
}
Return var
}


MenuHandler:
;转存剪切板  直接粘贴 支持中文
clip := ClipboardAll
;发送括号后面的内容
Clipboard := RegExReplace(A_ThisMenuItem,"\(.*\)\s*(.*)","$1")
Send, ^v
Sleep,200
Clipboard := clip
return



友情链接:Autohotkey中文论坛Autohotkey中文帮助Autohotkey官网我的B站直播间Autohotkey中文网联系作者免GooglePlay APK下载

 主题设计 • skyfrit.com  Thinkai's Blog | 保留所有权利

43 queries in 1.167 seconds |