Запросы к другим приложениям
Чтобы организовать запрос к другому приложению, необходимо указать вашей программе, о каком именно приложении идет речь. Один из способов, позволяющий это сделать, заключается в установке указателя мыши в окно другого приложения (информацию о состоянии которого требуется получить). Именно так сделано в приложении 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