import win; namespace mouse; var function yToDy( y ){ return ..math.ceil( y * (65535 / ::User32.GetSystemMetrics(1/*_SM_CYSCREEN*/)) ) ; } var function xToDx( x ){ return ..math.ceil( x * (65535 / ::User32.GetSystemMetrics(0/*_SM_CXSCREEN*/)) ); } class INPUTDATA{ INT type; union input = { struct mi = MOUSEINPUT(); }; } class INPUTDATA.MOUSEINPUT{ INT dx; INT dy; INT mouseData; INT dwFlags; INT time; INT dwExtraInfo; } extraInfo = 0; var getPointArgs; getPointArgs = function(x=0,y=0,abs){ if(type(x)=="table"){ if(abs===null) abs = 1; if(x[["_dotNetObject"]]){ if(x.BoundingRectangle) x = x.BoundingRectangle; elseif(x.Current) x = x.Current.BoundingRectangle; if(!x) return; } if(x.left!==null) { y = x.top + x.height()/2; x = x.left + x.width()/2; } elseif(x.Left!==null) { y = x.Top + x.Height/2; x = x.Left + x.Width/2; } elseif(x.x!==null) { if(x.height!==null){ y = x.y + x.height/2; x = x.x + x.width/2; } else { y = x.y; x = x.x; } } else error("错误的坐标参数类型",3); } if(!abs) { var pt = ::POINT() ; ::User32.GetCursorPos(pt); x = pt.x + x; y = pt.y + y; } elseif(type(abs)=="table"){ if(abs[["_dotNetObject"]]){ if(abs.BoundingRectangle) abs = abs.BoundingRectangle; elseif(!abs) abs = abs.Current.BoundingRectangle; } if(abs.left!==null) { y = abs.top + y; x = abs.left + x; } elseif(abs.Left!==null) { y = abs.Top + y; x = abs.Left + x; } elseif(abs.x!==null) { y = abs.y + y; x = abs.x + x; } } return x,y; } //处理鼠标事件( x坐标,y坐标,是否绝对坐标值,事件标志 ) var send; send = function( x, y, abs , dwFlags = 0,mouseData = 0){ x,y = getPointArgs(x,y,abs); var sendData = { struct array[] = {} } sendData.array[1] = INPUTDATA(); sendData.array[1].type = 0/*_INPUT_MOUSE*/; var input = sendData.array[1].input; if( ! mouseData ) { input.mi.dx = xToDx(x)+1; input.mi.dy = yToDy(y)+1; input.mi.dwFlags = 0x1/*_MOUSEEVENTF_MOVE*/ | dwFlags | 0x8000/*_MOUSEEVENTF_ABSOLUTE*/; } else{ input.mi.dwFlags = 0x800/*_MOUSEEVENTF_WHEEL*/ input.mi.mouseData = mouseData; } input.mi.dwExtraInfo = extraInfo; ::User32.SendInput(1, sendData, ..raw.sizeof( sendData ) ) ; } var waitCmd = function( vkeyCode ){ //必须放开 while( ( ::GetAsyncKeyState( vkeyCode ) < 0)) { ..thread.delay(1) } //必须按下 while( ::GetAsyncKeyState( vkeyCode ) >= 0 ) { ..thread.delay(1) } //必须再次放开 while( ( ::GetAsyncKeyState( vkeyCode ) < 0)) { ..thread.delay(1) //就一直等待 } } var dbSpanTk = ::User32.GetDoubleClickTime() + 10; var waitCmdDb = function(vk){ if(dbSpanTk < 300) dbSpanTk = 300; var nTick ,nTick_new = 0 , 0; var pt ,pt_new = ::POINT() ,::POINT() while( true ) { waitCmd( vk ); var nTick_new = ..time.tick(); if(( nTick_new - nTick ) < dbSpanTk ) { break; } nTick = nTick_new; ..thread.delay(1); } } delayDown = 5; delayUp = 1; delayDb =10; delayMove = 5 delayClick = 10; var downDelay = function(){ ..thread.delay( delayDown ) } var upDelay = function(){ ..thread.delay( delayUp ) } var dbDelay = function(){ ..thread.delay( delayDb ) } var clickDelay = function(){ if( delayClick > delayUp ) ..thread.delay( delayClick - delayUp ) } getPos = function(){ var ptCurPos = ::POINT(); ::User32.GetCursorPos(ptCurPos); return ptCurPos.x,ptCurPos.y; } setPos = function( x=0, y=0 ){ ::User32.SetCursorPos( x, y ); } state = function(){ return GetAsyncKeyState(1/*_VK_LBUTTON*/) < 0; } wait = function(){ waitCmd(1/*_VK_LBUTTON*/); } waitDb = function(){ waitCmdDb(1/*_VK_LBUTTON*/); } moveTo = function(x2,y2,abs,step=8,tk=2) { x2,y2 = getPointArgs(x2,y2,abs); var x1,y1 = getPos(); var x,y; var xx = x2-x1; var yy = y2-y1; var k; if(..math.abs(xx) > ..math.abs(yy) ) { if(x2