Отслеживание перемещения мыши
В практике программирования на Visual Basic часто используется событие MouseMove. Это событие позволяет пользователю контролировать движение мыши. С помощью события MouseMove можно получить информацию о координатах мыши, как только ее указатель помещен на форму. В некоторых ситуациях требуется контролировать координаты определенной точки непосредственно из обработчиков событий Click или DblClick событий (обычно они не позволяют получить информацию о координатах места, в котором выполнен щелчок) или отслеживать перемещение мыши за пределами окна формы Чтобы иметь возможность в любой момент определить текущее положение мыши, следует использовать функцию GetCursorPos.
Private Declare Function GetCursorPos Lib "user32" _
(lpPoint As POINTAPI) As Long
Примечание
Параметры функции GetCursorPos() рассматривались в параграфе "Объявление 32-х разрядных функций и структур".
VB6 в действии: проект MouseMov
В приложении MouseMov (рис. 13.5) для отслеживания перемещения мыши используется бескйнечный цикл. При этом предусматривается возможность передачи управления Windows с помощью оператора DoEvents. Это позволяет Windows обрабатывать другие события (например, остановку программы) при выполнении пользователем щелчка на кнопке Stop. Если бы оператор DoEvents не использовался, то приостановить выполнение программы было бы нельзя.

Рис. 13.5. Приложение MouseMov позволяет отслеживать положение указателя мыши, даже если указатель находится за пределами окна формы приложения
Функция GetCursorPos() возвращает переменную POINTAPI, которую затем можно передать функции WindowFromPoint(), чтобы получить дескриптор окна, на котором находится указатель мыши. Как только дескриптор окна получен, можно определить имя класса окна с помощью функции Get'ClassName(), которая возвращает имя класса окна. Если полученное имя - SysListView32, то это значит, что мышь находится на Рабочем столе Windows. В противном случае мышь находится в другом окне.
Большую часть программы занимает цикл отслеживания указателя мыши. Программа определяет положение указателя мыши и использует эту информацию для получения дескриптора окна и определения имени класса. После этого имя класса выводится на экран и обновляется каждый раз, когда указатель мыши перемещается в новое окно.
Программа 13.7. Приложение MouseMov
Option Explicit
Private Declare Function GetCursorPos Lib "user32" _
(lpPoint As POINTAPI) As Long
Private Declare Function WindowFromPoint Lib "user32"
(ByVal xPoint As Long, ByVal yPoint As Long) As Long
Private Declare Function GetClassName Lib "user32" Alias _
"GetClassNameA" (ByVal hwnd As Long,_
ByVal IpClassName As String, ByVal nMaxCount As Long) As Long
Private Type POINTAPI
X As Long
Y As Long
End Type
Private gStop As Boolean
Private Sub Commandl_Click()
Dim mousePT As POINTAPI
Dim prevWindow As Long, curWindow As Long
Dim X As Long, Y As Long
Dim className As String
Dim retValue As Long
‘ Отслеживание положения курсора
If Commandl.Caption = "Start" Then
Commandl.Caption = "Stop"
gStop = False prevWindow = 0
‘ Отслеживать до тех пор, пока процесс не будет прерван
‘ пользователем
Do
‘ Остановка отслеживания
If gStop = True Then Exit Do
Call GetCursorPos(mousePT)
X = mousePT.X
Y = mousePT.Y
‘ Получение информации об окне, на котором расположен
‘ указатель мыши
curWindow = WindowFromPoint(X, Y)
If curWindow о prevWindow Then
className = String$(256, "")
prevWindow = curWindow
retValue = GetClassName(curWindow, className, 255)
className = Left$(className, InStr(className,_
vbNullChar) - 1)
If className = "SysListView32" Then
Labell.Caption = "The mouse is over the desktop."
‘(Указатель мыши находится на рабочем столе.)
Else
Labell.Caption = "The mouse is over" & className
‘(Указатель мыши находится на...)
End If
End If
DoEvents
Loop
‘ Остановка отслеживания положения указателя
Else
Command1.Caption = "Start"
gStop = True
End If
End Sub
Private Sub Form QueryUnload(Cancel As Integer,
UnloadMode As Integer)
gStop = True
End Sub
Этот проект создан на основе проекта MousePos, который находится в соответствующей папке на компакт-диске.