| 事实上是使用SetCursorPos()便可以了,而它的参数是对应於萤的座标,而不是对应某一个Window的Logic座标。这个例子中的MoveCursor()所传入的POINTAPI也是相对於萤屏的座标,指的是从点FromP移动到ToP。最後面我也付了Showje的文章,使用的方式全部不同,不管是他的或我的,都有一个地方要解决才能做为Mouse自动导引的程式,那就是Mouse在自动Move时,如何让使用者不能移动Mouse,而这个问题就要使用JournalPlayBackHook,底下的程式中,使用EnableHook,FreeHook,这两个函数是Copy自如何使键盘、Mouse失效。 '以下程式在.bas TypeRECT LeftAsLong ToPAsLong RightAsLong BottomAsLong EndType TypePOINTAPI XAsLong YAsLong EndType DeclareFunctionSetCursorPosLib"user32"(ByValXAsLong,ByValYAsLong)AsLong DeclareFunctionGetWindowRectLib"user32"(ByValhwndAsLong,lpRectAsRECT)AsLong DeclareSubSleepLib"kernel32"(ByValdwMillisecondsAsLong) PublicSubMoveCursor(FromPAsPOINTAPI,ToPAsPOINTAPI) DimstepxAsLong,stepyAsLong,kAsLong DimiAsLong,jAsLong,sDelayAsLong stepx=1 stepy=1 i=(ToP.X-FromP.X) Ifi<0Thenstepx=-1 i=(ToP.Y-FromP.Y) Ifi<0Thenstepy=-1 'CallEnableHook'如果有Includehtmapi53.htm的.bas时,会DisableMouse Fori=FromP.XToToP.XStepstepx CallSetCursorPos(i,FromP.Y) Sleep(1)'让Mouse的移动慢一点,这样效果较好 Nexti Fori=FromP.YToToP.YStepstepy CallSetCursorPos(ToP.X,i) Sleep(1) Nexti 'CallFreeHook'EnableMouse EndSub '以下程式在Form中,需3个Command按键 PrivateSubCommand3_Click() Dimrect5AsRECT Dimp1AsPOINTAPI,p2AsPOINTAPI CallGetWindowRect(Command1.hwnd,rect5)'取得Command1相对於Screen的座标 p1.X=(rect5.Left rect5.Right)\2 p1.Y=(rect5.ToP rect5.Bottom)\2 CallGetWindowRect(Command2.hwnd,rect5) p2.X=(rect5.Left rect5.Right)\2 p2.Y=(rect5.ToP rect5.Bottom)\2 CallMoveCursor(p1,p2)'Mouse由Command1->Command2 EndSub 另外从Showje的站有Copy以下的程式码,也是做相同的果,只是使用的API全部不同 '以下程式在Form中,需2个Command按键 '以下置於form的一般宣告区 PrivateDeclareSubmouse_eventLib"user32"_ (_ ByValdwFlagsAsLong,_ ByValdxAsLong,_ ByValdyAsLong,_ ByValcButtonsAsLong,_ ByValdwExtraInfoAsLong_ ) PrivateDeclareFunctionClientToScreenLib"user32"_ (_ ByValhwndAsLong,_ lpPointAsPOINTAPI_ )AsLong PrivateDeclareFunctionGetSystemMetricsLib"user32"_ (_ ByValnIndexAsLong_ )AsLong PrivateDeclareFunctionGetCursorPosLib"user32"_ (_ lpPointAsPOINTAPI_ )AsLong
PrivateTypePOINTAPI xAsLong yAsLong EndType PrivateTypeOSVERSIONINFO dwOSVersionInfoSizeAsLong dwMajorVersionAsLong dwMinorVersionAsLong dwBuildNumberAsLong dwPlatformIdAsLong szCSDVersionAsString*128 EndType
PrivateConstMOUSEEVENTF_MOVE=&H1'mousemove PrivateConstMOUSEEVENTF_LEFTDOWN=&H2'leftbuttondown PrivateConstMOUSEEVENTF_LEFTUP=&H4'leftbuttonup PrivateConstMOUSEEVENTF_ABSOLUTE=&H8000'absolutemove
PrivateSubCommand1_Click() DimptAsPOINTAPI Dimdl& Dimdestx&,desty&,curx&,cury& Dimdistx&,disty& Dimscreenx&,screeny& Dimfinished Dimptsperx&,ptspery& pt.x=10 pt.y=10 dl&=ClientToScreen(Command2.hwnd,pt) screenx&=GetSystemMetrics(0)'0表x轴 screeny&=GetSystemMetrics(1)'1表y轴 destx&=pt.x*&HFFFF&/screenx& desty&=pt.y*&HFFFF&/screeny&
ptsperx&=&HFFFF&/screenx& ptspery&=&HFFFF&/screeny& 'Nowmoveit Do dl&=GetCursorPos(pt) curx&=pt.x*&HFFFF&/screenx& cury&=pt.y*&HFFFF&/screeny& distx&=destx&-curx& disty&=desty&-cury& If(Abs(distx&)<2*ptsperx&AndAbs(disty&)<2*ptspery)Then 'Closeenough,gotherestoftheway curx&=destx& cury&=desty& finished=True Else 'Movecloser curx&=curx& Sgn(distx&)*ptsperx*2 cury&=cury& Sgn(disty&)*ptspery*2 EndIf mouse_eventMOUSEEVENTF_ABSOLUTE_ OrMOUSEEVENTF_MOVE,curx,cury,0,0 LoopWhileNotfinished '到家了,按上右键吧!注:是左键,Showje的笔误 '以下是在(curx,cury)的座标下,模拟Mouse左键的downandup mouse_eventMOUSEEVENTF_ABSOLUTEOr_ MOUSEEVENTF_LEFTDOWN,curx,cury,0,0 mouse_eventMOUSEEVENTF_ABSOLUTEOr_ MOUSEEVENTF_LEFTUP,curx,cury,0,0 EndSub PrivateSubCommand2_Click() MsgBox"看你往哪儿逃!哈!!" EndSub ->
|