鼠标类函数
得到当前鼠标指针的坐标:
GetCursorPos函数
声明:
public Type POINTAPI
x As Long
y As Long
End Type
Public Declare Function GetCursorPos Lib "user32" _
(lpPoint As POINTAPI) As Long 参数缺省为byref指针传递
调用:先声明一个自定义类型变量: Dim z As POINTAPI
Private Sub Timer1_Timer()
GetCursorPos z 注:这里z是引用地址传递,其值改变,就象"返回值"
Label1.Caption = z.x
Label2.Caption = z.y
End Sub
参数lpPoint返回鼠标在屏幕上坐标(不限于程序窗体),如将鼠标指针移到屏幕左上角时,z.x=0,z.y=0,而鼠标移到屏幕右下角时,z.x=639;z.y=477
===========================================================
设置鼠标在屏幕上的坐标 : SetCursorPos函数
声明:
Private Declare Function SetCursorPos Lib "user32" (ByVal X As Long, ByVal Y As Long) As Long
调用如:Private Sub Command1_Click()
Call SetCursorPos(600, 100) 将鼠标定位到屏幕(600,100)处。
End Sub
很简单,注:屏幕是以象素为单位的(与屏幕分辨率设定有关)。不是缇。
==========================================================
自动按下鼠标按纽:mouse_event过程函数
该过程能在程序中模拟手工按下或抬起鼠标,移动鼠标的操作,声明:
Public Declare Sub mouse_event Lib "user32" (ByVal dwFlags As Long, ByVal dx As Long, ByVal dy As Long, ByVal cButtons As Long, ByVal dwExtraInfo As Long)
一般只用它的第1个参数,指明按下或抬起哪个按纽,如果要模拟鼠标移动,则要用到第2,3个参数dx和dy, 而最后面两个参数始终不用。
第1个参数dwFlags的可能设置值如下:
MOUSEEVENTF_LEFTDOWN=&H2: 模拟鼠标左键按下
MOUSEEVENTF_LEFTUP :模拟鼠标左键抬起
MOUSEEVENTF_RIGHTDOWN: 模拟鼠标右键按下
MOUSEEVENTF_RIGHTUP :模拟鼠标右键抬起
MOUSEEVENTF_ABSOLUTE=&H8000: 由参数dx和dy指定鼠标坐标系统中的一个绝对位置。在鼠标坐标系统中,屏幕在水平和垂直方向上均匀分割成65535×65535个单元
MOUSEEVENTF_MOVE=&H1 :移动鼠标
调用如:在屏幕上指定位置按下鼠标左键:
Public Const MOUSEEVENTF_LEFTDOWN = &H2
Public Declare Function SetCursorPos Lib "user32" (ByVal x As Long, ByVal y As Long) As Long
Private Sub Timer1_Timer()
SetCursorPos 300, 20
mouse_event MOUSEEVENTF_LEFTDOWN, 0&, 0&, 0&, 0&
End Sub
模拟鼠标移动需要设置其dx和dy参数来确定鼠标位置,这时第1个参数用MOUSEEVENTF_MOVE加上MOUSEEVENTF_ABSOLUTE组合,如下:
Public Const MOUSEEVENTF_MOVE = &H1
Public Const MOUSEEVENTF_ABSOLUTE = &H8000
mouse_event MOUSEEVENTF_ABSOLUTE + MOUSEEVENTF_MOVE, 65535, 65535, 0&, 0& '移动鼠标
mouse_event MOUSEEVENTF_LEFTDOWN, 0&, 0&, 0&, 0& '按下鼠标
这样可省去用SetCursorPos函数,不过它不以象素为度量单位,而是将长宽分别平分为65535个鼠标位置点,要注
意。
补充说明:
参数dx-- Long,根据是否指定了MOUSEEVENTF_ABSOLUTE标志,指定水平方向的绝对位置或相对运动
参数dy-- Long,根据是否指定了MOUSEEVENTF_ABSOLUTE标志,指定垂直方向的绝对位置或相对运动
==============================================
限制鼠标活动区域函数:ClipCursor函数
限制光标只能在参数lpRect给出的矩形区域内运动。声明:
Public Declare Function ClipCursor Lib "user32" (lpRect As RECT) As Long
参数lpRect声明为RECT型,RECT的声明如下:
Public Type RECT
Left As Long
Top As Long Left,Top为左上角坐标。
Right As Long
Bottom As Long Right,Bottom为右下角坐标。
End Type
注:以上坐标使用的是屏幕坐标。
调用如:
Dim lxnRect As RECT
Private Sub Form_Click()
Static a As Boolean
a = Not a
If a = True Then 活动范围为Form1
lxnRect.Left = Form1.Left \ Screen.TwipsPerPixelX
lxnRect.Top = Form1.Top \ Screen.TwipsPerPixelY
lxnRect.Right = (Form1.Left + Form1.Width) \ Screen.TwipsPerPixelX
lxnRect.Bottom = (Form1.Top + Form1.Height) \ Screen.TwipsPerPixelY
ClipCursor lxnRect
Else 活动范围为全屏幕
lxnRect.Left = 0
lxnRect.Top = 0
lxnRect.Right = Screen.Width \ Screen.TwipsPerPixelX
lxnRect.Bottom = Screen.Height \ Screen.TwipsPerPixelY
ClipCursor lxnRect
End If
End Sub
上例是这样的,在窗体上单击时,鼠标活动限在此窗体,再单击,则恢复为全屏幕活动范围。
注:在VB中,所有尺寸都化为缇了(包括screen对象的width,height),而在API中,所有尺寸都为象素,因此,要统一单位,用转换比例 screen对象的TwipsPerPixelX和TwipsPerPixelY(好象值就等于15。不知是否固定不变。)
======================================
显示/隐藏鼠标指针:ShowCursor函数
该函数可用于隐藏鼠标,但鼠标仍然可"看不见地移动"。声明:
Declare Function ShowCursor Lib "user32" (ByVal bShow As Long) As Long
参数很简单:bShow--当为true且"函数"返回值大于等于0时,显示指针,当为false且"函数"返回值小于0时,隐藏指针。
注:该函数的函数返回值需要注意:它返回"显示计数",windows维持着一个内部显示计数;倘若bSh
ow为TRUE,那么每调用一次这个函数,计数 就会递增1;反之,如bShow为FALSE,则计数递减1。只有在这个计数大于或等于0的情况下,指针才会显示出来。而小于0时则隐藏,因此,不单是简 单地把bShow设为false就可以了。不然要想再使指针显示出来,可能会遇到困难。如:
Dim a As Boolean
Private Sub Form_Click()
a = False
x = ShowCursor(a)
Print x
End Sub
如果我们多次单击form窗体,则x的值会变为-1,-2,-3,-4……这时,如果再简单地把a改为true,则单击1次时指针不会重显,x的值会变为-3,-2,-1,0……只有多次单击使x等于大于0的时候,指针才会重显。
=======
====================================
在VB中捕捉mouse_leave事件:SetCapture和ReleaseCapture函数
SetCapture函数:设置鼠标捕获到指定窗口,使该窗口接收所有鼠标输入。
ReleaseCapture函数:释放鼠标捕获。
声明:
Declare Function SetCapture Lib "user32"(ByVal hwnd As Long) As Long
Declare Function ReleaseCapture Lib "user32"() As Long
参数:hwnd--要接收所有鼠标输入的窗口句柄。
调用如(捕捉command2的mouseleave"事件":
Private Sub Command2_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
Text1.Text = X & "," & Y
Dim MouseOver As Boolean
MouseOver = (0 <= X) And (X <= Command2.Width) And (0 <= Y) And (Y <= Command2.Height) 这里要注意,一个控件的mouse类事件返回的X,Y坐标值是此控件自身的窗口坐标,不是Form的坐标!所以左上角都是(0,0)-右下角 (width,height).
If MouseOver Then 当鼠标在command2上时,
Command2.BackColor = RGB(255, 255, 0)
SetCapture Command2.hwnd 使command2窗口响应鼠标输入。
Else 当鼠标离开时,以下写mouseleave的内容。
Command2.BackColor = RGB(120, 120, 120)
ReleaseCapture command2不再响应鼠标动作
End If
End Sub
鼠标相关函数
一、获得窗口外鼠标消息
窗口接到“WM__LBUTTONDOWN”的消息,接着鼠标光标被移出窗口外后放开。此时程序无法取得放开按键的消息,对程序而言,鼠标的左键依 然是处于按焉的状态(其实已经放开了),这样就有可能产生程序运行上的混乱。因此,为了确保程序可以正确地取得鼠标的输入消息,需要在必要的时候以下面的 函数来设定窗口,以取得鼠标在窗口外所发出的消息
HWND SetCapture(HWND hWnd);//获得窗口外的鼠标消息
如果调用了上面的函数,并输和取得鼠标消息的窗口代码,那么便可取得鼠标窗口外所发出的消息,这种方法也适用于多窗口的程序,与SetCapture()函数相对应的函数为ReleaseCapture,用于释放窗口取得窗口外鼠标消息的函数.
BOOL ReleaseCapture(VOID)//释放获取窗口外的函数
二、设定鼠标光标的位置,
在游戏设计中,有时需要设定鼠标光标的位置。如射击游戏中,玩家所操纵的飞机便追踪鼠标来进行
移动。程序一开始时必须将鼠标光标设定在要让飞机出现的位置上,不然若鼠标光标开始在任意位置上,飞机也就会出现在任意的位置上,那么就不是希望出现的结果了。
BOOL SetCursorPos(int x轴坐标,int y轴坐标)//但是这个坐标要是屏幕坐标。
将窗口坐标转为屏幕坐标用下列的函数
BOOL ClientToScreen(HWND hWND,LPPOINT 窗口坐标) //窗口坐标转换为屏幕坐标
下面的程序演示如何利用ClientToScreen()函数与SetCursorPos()函数将鼠标
光标设定在窗口坐标(0,0)的位置
POINT pt;
pt.x=0;pt.y=0;
ClientToScreen(hWnd,&pt);
SetCursorPos(p.x,p.y)
转换到窗口坐标:
BOOL ScreenToClient(HWND hWnd ,LLPPOINT 屏幕坐标)//屏幕坐标转换为窗口坐标
三、显示与隐藏鼠标光标
int ShowCursor(BOOL true或flase)
四、限制鼠标光标移动区域
BOOL ClipCursor(CONST RECT 移动区域矩形 );        //限制鼠标光标移动区域,移动区域的坐标是                      相 对于屏幕的坐标
BOOL ClipCursor(NULL);                                              //解除限制
GetWindowRect(HWND hWND,LPRECT 矩形结构)//取得窗口外部区域矩形,所得的矩形区域左上及右
//下的坐标点属于屏幕坐标
GetClientRect(HWND hWnd,LPRECT 矩形结构)//返回的是窗口内部矩形区域,不过是窗口坐标
下面以程序代码来说明以鼠标光标限制在窗口内部区域移动的过程
RECT rect;
Point lt,rb;
//获得窗口内部矩形
GetrClientRect(hWnd,&rect);
lt.x=rect.left ;
lt.p;
rb.x=rect.right;
rb.y=rect.bottom
//将窗口坐标转换为屏幕坐标
ClientToScreen(hWnd,<);
ClientToScreen(hWnd,&rb)
/
/屏幕坐标得新设定矩形区域
rect.left=lt.x;
rect.right=rb.x;
rect.left=rb.y;
//将鼠标光标移动区域
ClipCursor(&rect)
Visual C++6.0 API函数操作技巧集(光标与鼠标)
我们在编制应用软件的过程中,常常需要对光标和鼠标操作,本人在文中介绍了Windows系统中有关实现对鼠标和光标进行操作的API函数,并给出了在Visual C6.0++中利用所介绍的API函数实现对鼠标和光标的操作的代码。
一、隐藏和显示光标
函数: int ShowCursor ( BOOL bShow );
参数 bshow,为布尔型,bShow的值为False时隐藏光标,为True时显示光标;该函数的返回值为整型,为鼠标隐藏或显示的指数器;返回值大于等于0时显示光标,否则隐藏鼠标;如果安装了鼠标初值为0。
实例:
在基于对话框的应用程序中放置两个Button,名称分别为HideCursor和ShowCursor;再放置一个CStatic控件,名称为Label1,用于显示光标计数器。
源程序为:
// 使光标计数器的值减一,如果小于零,隐藏光标
void CMyTestDlg::OnHideCursor()
{
int i;
i=ShowCursor(FALSE);
Cstring string;
string.Format(_T("%d" ),i);
Label1.SetWindowText(&string);
}
// 使光标计数器的值加一,如果大于等于零,显示光标
void CMyTestDlg::OnShowCursor()
{
int j;
j=ShowCursor(TRUE);
Cstring string;
string.Format(_T("%d" ),j);
Label1.SetWindowText(&string);
}
运行程序,连续单击ShowCursor按钮,你会见到计数器从1(光标显示时初值为0)
开始不断加1;再连续单击HideCursor按钮,又会见到计数器不断减1,当计数器为-1时开始隐藏光标。
二、交换鼠标左右键和恢复
函数:
BOOL SwapMouseButton ( BOOL fSwap );
参数 fSwap,为布尔型,TRUE表示交换鼠标左右键,FALSE表示恢复系统默认左右手习惯;返回值亦为布尔型,交换后,返回值TRUE,恢复正常值为FALSE。
实例:
在应用程序中放置两个Button,名称分别为ReverseMouse和RestoreMouse。
源程序为:
//交换鼠标左右键
void CMyTestDlg::OnReverseMouse()
{
BOOL T;
T=SwapMouseButton(True);
If(T)
MessageBox("鼠标左右键交换成功!");
}
// 恢复鼠标左右键交换
void CMyTestDlg::OnRestoreMouse()
{
BOOL T;
T=SwapMouseButton(FALSE);
If(!T)
MessageBox("鼠标左右键恢复为默认状态!");
}
运行程序,左键单击ReverseMouse按钮,此时实现鼠标左右键功能切换;再右键单击RestoreMouse按钮,此时实现鼠标左右键功能恢复。
三、得到鼠标双击时间
1、函数:
UINT GetDoubleClickTime(VOID);
该函数无参数;它的返回值为毫秒,为双击鼠标双击有效的时间间隔。
实例:
在窗口中放置一个Button,名称为GetDoubleClickTime;再放置一个名为Label1的CStatic控件,用于显示双击时间。
源程序为:
//得到并显示鼠标的双击的时间
void CMyTestDlg::OnGetDoubleClickTime()
{
int DTime;
Cstring string;
false是什么函数DTime:=GetDoubleClickTime();
string.Format(_T("%d" ),Dtime);
Label1.SetWindowText(&string);
}
运行程序,单击GetDoubleClickTime,在Label1中显示双击的时间,为毫秒级。
四、设置鼠标双击时间
函数:
BOOL SetDoubleClickTime ( UINT uInterval );
参数uInterval,表示鼠标双击时间,为毫秒级,系统默认时间为500;
返回值为布尔值。
实例:
在窗口中放置一个Button,名称为SetDoubleClickTime。
源程序为:
/
/设置鼠标的双击的时间
void CmyTestDlg::OnSetDoubleClickTime()
{
Bool T;
T=SetDoubleClickTime(500);
If(T)
MessageBox("成功的设置了鼠标双击时间!");
}
运行程序,单击BtnSetDoubleClickTime,鼠标双击时间已改变。
五、将鼠标锁定在一定范围
函数:
BOOL ClipCursor ( CONST RECT *lpRect );
参数*lpRect,指向鼠标活动矩形区域的指针;返回值为布尔型,表示锁定成功与否。
实例:
在窗口中放置两个Button,名称为LockMouse和UnLockMouse。
源程序为:
//将鼠标锁定在固定区域
void CmyTestDlg::OnLockMouse()
{
RECT Rect;
BOOL bLock;
Rect.left=10;//设置锁定区域大小;
Rect.right=200;
Rect.bottom=200;
bLock:=ClipCursor(&Rect); // 限制鼠标移动区域
if (block)
MessageBox("鼠标固定在指定区域!");
}
将鼠标锁定解锁,其实质是将鼠标锁定在

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。