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


Запросы к другим приложениям


Чтобы организовать запрос к другому приложению, необходимо указать вашей программе, о каком именно приложении идет речь. Один из способов, позволяющий это сделать, заключается в установке указателя мыши в окно другого приложения (информацию о состоянии которого требуется получить). Именно так сделано в приложении Query (рис. 13.8). Эта программа позволяет наблюдать за другими активными приложениями, используя уже известные функции GetCursorPos() и SetWindowPos(), а также нескольких новых функций, рассматриваемых в следующем параграфе.

VB6 в действии: проект Query

В окне приложения Query содержится информация о текущем активном окне и его родительском окне.

Рис. 13.8. Приложение Query

Для получения информации об остальных открытых окнах в этой программе используются следующие функции:

•           SetWindowPos()

•           GetCursorPos()

•           WindowFromPoint()

•           GetClassName()

•           GetWindowText()

•           GetParent()

SetWindowPos().



Функция используется для того, чтобы поместить окно данного приложения поверх окон других приложений. Ключевым элементом в ней является флаг HWND_TOPMOST, установка которого предписывает Windows располагать данное окно перед (либо позади, в зависимости от установки z-order) остальными окнами. Пользователь устанавливает указатель мыши в интересующее его окно и получает о нем информацию. Это достигается за счет использования функций GetCursorPos () и WindowFromPoint().

GetCursorPos(), WindowFromPoint().

Функция GetCursorPosQ возвращает коор­динаты указателя мыши (в системе координат окна). Затем эти координаты используются в функции WindowFromPointO для отыскания имени окна (видимого в точке с указанными координатами). Объявление функции WindowFromPointO имеет вид:

Declare Function WindowFromPoint Lib "user32" (ByVal xPoint As _

   Long, ByVal yPoint As Long) As Long

Параметры

xPoint и yPoint являются парой координат. Функция возвращает число типа Long Integer, которое является дескриптором окна, расположенного в данной точке.


GetClassName(), GetWindowText().

Эти функции используются для организации наблюдения за другими приложениями. Функция GetClassName() позволяет получить имя класса окна, a GetWindowText() — текст заголовка окна, если таковой имеется. Если выбранное окно является элементом управления, функция возвращает его текст.

GetParent().

Позволяет получить дескриптор родительского окна для данного окна.

Ниже приведен текст программы Query.

Программа 13.10. Приложение Query

Option Explicit

Private Declare Function SetWindowPos Lib "user32"

(ByVal hwnd As Long, ByVal hWndInsertAfter As Long,

_

ByVal X As Long, ByVal Y As Long, ByVal ex As Long, _

ByVal cy As Long, ByVal wFlags As Long) As Long

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 GetParent Lib "user32" _

(ByVal hwnd 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 Declare Function GetWindowText Lib "user32"  _

Alias "GetWindowTextA" (ByVal hwnd As Long, _

ByVal IpString As String, ByVal cch As     Long) As Long

Const HWND_TOPMOST = -1 ,

Const SWP_SHOWWINDOW = &H40

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 tmpStr As String

Dim parentWnd As Long, 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

tmpStr = String$(256, " ")

prevWindow = curWindow

retValue = GetClassName(curWindow, tmpStr, 255)

tmpStr = Left$(tmpStr, InStr(tmpStr, vbNullChar) - 1)

Text1(0).Text = curWindow

Textl(1).Text « tmpStr

retValue = GetWindowText(curWindow, tmpStr, 255)

Text1 (2).Text = tmpStr

‘ Получение дескриптора родительского окна

parentWnd = GetParent(curWindow)

retValue = GetClassName(parentWnd, tmpStr, 255)

tmpStr = Left$(tmpStr, InStr(tmpStr, vbNullChar) - 1)

Text1(3).Text = parentWnd

Text1(4).Text = tmpStr

retValue = GetWindowText(parentWnd, tmpStr, 255)

Text1(5).Text = tmpStr

  End If

  DoEvents

Loop

     ‘ Прекращение отслеживания мыши

Else

   Commandl.Caption = "Start"

   gStop = True

  End If

End Sub

Private Sub Form_QueryUnload(Cancel As     Integer, _

   UnloadMode As Integer)

gStop = True

End Sub

Private Sub Form_Load()

Dim retValue As Long

If Commandl.Caption = "Start" Then

gStop = False

‘ Commandl.Caption = "Stop"

retValue = SetWindowPos(Me.hwnd,     HWND_TOPMOST, _

   Me.CurrentX, Me.CurrentY, _

   Me.Width, Me.Height, SWP_SHOWWINDOW)

   Else

gStop = True

Commandl.caption = "Start"

  End If

End Sub


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