Visual Basic 6. Руководство разработчика

       

Отслеживание перемещения мыши


В практике программирования на 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, который находится в соответ­ствующей папке на компакт-диске.


Содержание раздела