//key 键盘控制 import winex; import key; namespace winex.key; delayDown = 5; delayUp = 1; delayClick = 5; OemKeyScan = ::User32.api( "OemKeyScan", "INT(WORD)"); char = function(hwnd,chr){ var vk = chr; var conv = OemKeyScan(chr); var scan = conv & 0x000000FF | 0xFF00; var laram = scan << 16 | 1; ::User32.SendNotifyMessage(hwnd, 0x100/*_WM_KEYDOWN*/, vk, laram); ::User32.SendNotifyMessage(hwnd, 0x102/*_WM_CHAR*/, vk, laram); ::User32.SendNotifyMessage(hwnd, 0x101/*_WM_KEYUP*/, vk, laram | 0xC0000000); ..thread.delay(delayClick) } send = function(hwnd,str){ if(!hwnd) hwnd = ..winex.getFocus(); str = ..string.toUtf16(str); for(i=1;#str/2;1){ char(hwnd,str[i] ); } } getScan = function(vk,ext,alt,down,n=1){ var s = ::MapVirtualKey(vk, 0) << 16 | n; if(ext) s |= 0x1000000 if(!down) s |= 0xC0000000 if(alt) s |= 0x20000000 return s; } down = function(hwnd,k,alt){ var vk,ext = ..key.getCode( k ); //必须用::User32.PostMessage,不然组合键无效 ::User32.PostMessage(hwnd,alt? 0x104: 0x100, vk ,(getScan(vk,ext,alt,true))); ..thread.delay(delayDown) } up = function(hwnd,k,alt){ var vk = ..key.getCode( k ); ::User32.PostMessage(hwnd,alt? 0x105: 0x101 ,vk ,getScan(vk,ext,alt)); ..thread.delay(delayUp) } click = function(hwnd,k,alt){ down(hwnd,k,alt); up(hwnd,k,alt); ..thread.delay(delayClick); } altDown = function(hwnd,k){ down(hwnd,k,true); } altUp = function(hwnd,k){ up(hwnd,k,true); } var altClickAux; altClickAux = function(hwnd,k,...){ ..key.setState(true,k); altDown(hwnd,k); if(...) altClickAux(hwnd,...); altUp(hwnd,k); ..key.setState(false,k) } altClick = function(hwnd,k,...){ ..key.setState(true,"ALT"); altDown(hwnd,"ALT"); altClickAux(hwnd,k,...); up(hwnd,"ALT"); ..key.setState(false,"ALT") ..thread.delay(delayClick); } combine = function(hwnd,...){ ..key.setState(true,...) var arg ={...} for(i=1;#arg ){ down(hwnd,arg[i]) } ..key.setState(true,...) for(i=#arg;1;-1 ){ up(hwnd,arg[i]) } ..key.setState(false,...) ..thread.delay(delayClick) } /**intellisense(winex.key) delayDown = 按下后的时间间隔,默认为5 delayUp = 弹起后的时间间隔,默认为1 delayClick = 完整击键之间的间隔,默认为5 down(__/*句柄*/,"键名") = 参数二可以是键名或虚拟键值 up(__/*句柄*/,"键名") = 参数二可以是键名或虚拟键值 click(__/*句柄*/,"键名") = 参数二可以是键名或虚拟键值 altDown(__/*句柄*/,"键名") = 后台发送 ALT 组合键按下消息\n参数二可以是键名或虚拟键值 altUp(__/*句柄*/,"键名") = 后台发送 ALT 组合键弹起消息\n参数二可以是键名或虚拟键值 altClick(__/*句柄*/,"键名") = 后台发送 ALT 组合键击键消息,可指定一个或多个键名或虚拟键值参数。\n如果目标窗口是外部线程应先使用 winex.attach 共享输入处理机制。\n个别按键操作可能需要先用 win.setActive 激活目标窗口(不常见) combine(hwnd,"CTRL","__") = 发送组合热键,参数个数不限.\n参数可以是键名字,或者按键的虚拟码(_VK前缀常量)\n如果目标窗口是外部线程应先使用 winex.attach 共享输入处理机制。\n个别按键操作可能需要先用 win.setActive 激活目标窗口(不常见) send(__/*句柄*/,"TEST") = 输入ASCII字符 end intellisense**/