Практика
Получение информации о запущенных приложениях

:: Меню ::
:: На главную ::
:: FAQ ::
:: Заметки ::
:: Практика ::
:: Win API ::
:: Проекты ::
:: Скачать ::
:: Секреты ::
:: Ссылки ::

:: Сервис ::
:: Написать ::

:: MVP ::

:: RSS ::

Яндекс.Метрика


Рано или поздно каждому программисту приходится работать с посторонними окнами. Для этого нужно знать как минимум Handle окна, над которым необходимо произвести какие-либо действия. Чтобы узнать Handle, можно воспользоваться одной из программ, которая может показывать информацию об окнах (некоторые из них можно скачать в разделе Download). Но мы ведь программисты, следовательно сами можем получить интересующую нас информацию. А начнем с того, что рассмотрим некоторые процедуры, позволяющие работать с чужими окнами, некоторыми из этих процедур мы воспользуемся при написании программы.

FindWindow
function FindWindow( IpClassName, IpWindowName: PChar ): HWND;
Функция возвращает описатель окна, удовлетворяющий запросу
(0 - если такого окна не найдено).

IpClassName
   Имя класса, по которому призводится поиск среди ВСЕХ окон системы. 
IpWindowName
   Заголовок окна.

Один из параметров может быть равен nil, 
тогда поиск ведется по другому параметру.

FindWindowEx
function FindWindowEx( Parent, Child: HWND; ClassName, WindowName: PChar ): HWND;
Функция возвращает описатель дочернего окна, удовлетворяющий запросу 
(0 - если такого окна не найдено).

Parent
   Handle родительского окна.
Child
   Handle дочернего окна.
ClassName
   Класс дочернего окна.
WindowName
   Заголовок дочернего окна.

Handle родительского окна нужно указать обязательно, handle дочернего окна
скорее всего 0, так как именно его и возврашает эта функция.
Один из двух последних параметров может быть равен nil, 
тогда поиск ведется по другому параметру.

GetWindow
function GetWindow( hWnd: HWND; uCmd: Cardinal ): HWND;
Функция возвращает описатель дочернего окна, удовлетворяющий запросу 
(0 - если такого окна не найдено).

hWnd
   Handle родительского окна.
uCmd
   Определяет отношения между указанным окном и окном, чей дескриптор должен быть найден.

GetParent
function GetParent( hWnd: HWND ): HWND;
Функция возвращает описатель родительского окна для окна hWnd. 
(0 - если такого окна не найдено).

hWnd
   Handle окна.

WindowFromPoint
function WindowFromPoint( Point: TPoint ): HWND;
Функция возвращает описатель окна, которое находится в указанных координатах.

Point
   Координаты пикселя.

IsWindow
function IsWindow( hWnd: HWND ): Bool;
Возвращает True, если окно с заданным описателем существует и False в противном случае.

hWnd
   Дескриптор окна.

IsWindowVisible
function IsWindowVisible( hWnd: HWND ): Bool;
Возвращает True если данное окно видимо и False в противном случае.

hWnd
   Дескриптор окна.

IsWindowEnabled
function IsWindowEnabled( hWnd: HWND ): Bool;
Возвращает True если данное окно доступно и False в противном случае.

hWnd
   Дескриптор окна.

ShowWindow
function ShowWindow( hWnd: HWND; nCmdShow: integer ): Bool;
Функция показывает или прячет окно.
Возвращает True в случае успешного выполнения и False в противном случае.

hWnd
   Дескриптор окна.
nCmdShow
   Константа, определяющая, что будет сделано с окном:
   SW_HIDE
   SW_SHOWNORMAL (SW_NORMAL)
   SW_SHOWMINIMIZED
   SW_SHOWMAXIMIZED
   SW_MAXIMIZE
   SW_SHOWNOACTIVATE
   SW_SHOW
   SW_MINIMIZE
   SW_SHOWMINNOACTIVE
   SW_SHOWNA
   SW_RESTORE
   SW_SHOWDEFAULT
   SW_MAX

EnableWindow
function EnableWindow( hWnd: HWND; bEnable: LongBool ): Bool;
Функция активизирует или дизактивизирует окно.
Возвращает True в случае успешного выполнения и False в противном случае.

hWnd
   Дескриптор окна.
bEnable
   True если окно нужно сделать активным и False в противном случае.

CloseWindow
function CloseWindow( hWnd: HWND ): Bool;
Функция закрывает окно.
Возвращает True в случае успешного выполнения и False в противном случае.

hWnd
   Дескриптор окна.

GetDesktopWindow
function GetDesktopWindow( hWnd: HWND ): Bool;
Функция возвращает описатель окна Рабочего Стола (Desktop).
Без параметров.

SetWindowPos
function SetWindowPos( hWnd, hWndInsertAfter: HWND; X, Y, cx, cy: Integer;
                       uFlags: Cardinal ): Bool;
Устанавливает окно в новую позицию.
Возвращает True в случае успешного выполнения и False в противном случае.

hWnd
   Дескриптор окна.
hWndInsertAfter
   Описатель окна, перед которым в списке Z-Order будет вставлено окно hWnd, 
   или одна из следующих констант:
   HWND_BOTTOM
      Поместить окно на дно списка Z-Order.
   HWND_TOP
      Поместить окно на верх списка Z-Order.
X
   Новая позиция окна по X.
Y
   Новая позиция окна по Y.
cx
   Новая ширина окна.
cy
   Новая высота окна.
uFlags
   Одна или несколько (разделенных OR) следующих констант: 
   SWP_NOSIZE
      Не изменять размер окна после перемещения (cx, cy игнорируются).
   SWP_NOZORDER
      Не изменять положение окна в списке Z-Order.
   SWP_SHOWWINDOW
      Сделать окно видимым после перемещения.
   SWP_HIDEWINDOW
      Спрятать окно после перемещения.
   SWP_NOACTIVATE
      Не передавать фокус окну после перемещения.
   SWP_NOMOVE
      Не перемещать окно (игнорируется X, Y).

GetWindowText
function GetWindowText( hWnd: HWND; IpString: PChar; nMaxCount: integer ): integer;
Функция возвращает текст окна.
Для формы это будет заголовок, для кнопки - надпись на кнопке.

hWnd
   Описатель того окна, текст которого нужно получить.
IpString
   Переменная, в которую будет помещен результат.
nMaxCount
   Максимальная длина текста, если текст длиннее, то он обрезается.

SetWindowText
function SetWindowText( hWnd: HWND; IpString: PChar ): Bool;
Функция устанавливает текст окна.

hWnd
   Описатель того окна, текст которого нужно установить.
IpString
   Строка, содержащая устанавливаемый текст.

GetClassName
function GetClassName( hWnd: HWND; IpClassName: PChar; nMaxCount: integer ): integer;
Функция возвращает класс окна.
Для формы это будет заголовок, для кнопки - надпись на кнопке.

hWnd
   Описатель того окна, класс которого нужно получить.
IpClassName
   Переменная, в которую будет помещен результат.
nMaxCount
   Максимальная длина текста, если текст длиннее, то он обрезается.

GetWindowRect
function GetWindowRect( hWnd: HWND; var IpRect: TRect ): Bool;
Функция вычисляет координаты окна.
Возвращает True в случае успешного выполнения и False в противном случае.

hWnd
   Описатель того окна, размеры которого нужно получить.
IpRect
   Переменная, в которую будет помещен результат.

А теперь применим описанные выше функции для того, чтобы написать программу, которая покажет нам необходимую информацию о нужном нам окне. Пример прокомментирован по минимуму, описание всех функций можно прочитать выше.

procedure TForm1.Timer1Timer(Sender: TObject);
var
  Wnd: HWND;                   // Hahdle найденного окна
  Pos: TPoint;                 // Позиция курсора
  Rect: TRect;                 // Координаты окна
  buff: array[0..255] of char; // Буфер
  WndText: string;             // Текст окна
  NameClass: string;           // Класс окна
begin
   // Получаем позицию курсора
   GetCursorPos( Pos );
   // Получаем Handle окна под курсором
   Wnd := WindowFromPoint( Pos );
   GetWindowRect( Wnd, Rect );
   GetWindowText( Wnd, buff, SizeOf( buff ) );
   WndText := StrPas( buff );
   GetClassName( Wnd, buff, SizeOf( buff ) );
   NameClass := StrPas( buff );

   // Выводим координаты курсора
   LabelPosX.Caption := 'X: ' + IntToStr( Pos.X );
   LabelPosY.Caption := 'Y: ' + IntToStr( Pos.Y );

   LabelHandle.Caption := 'Handle: ' + IntToStr( Wnd );
   LabelName.Caption := 'Name: ' + WndText;
   LabelClass.Caption := 'Class: ' + NameClass;
   LabelLeft.Caption := 'Left = ' + IntToStr( Rect.Left );
   LabelTop.Caption := 'Top = ' + IntToStr( Rect.Top );
   LabelWidth.Caption := 'Width = ' + IntToStr( Rect.Right - Rect.Left );
   LabelHeight.Caption := 'Height = ' + IntToStr( Rect.Bottom - Rect.Top );

   // Получаем Handle родительского окна
   Wnd := GetParent( Wnd );
   GetWindowRect( Wnd, Rect );
   GetWindowText( Wnd, buff, SizeOf( buff ) );
   WndText := StrPas( buff );
   GetClassName( Wnd, buff, SizeOf( buff ) );
   NameClass := StrPas( buff );

   LabelParentHandle.Caption := 'ParentHandle: ' + IntToStr( Wnd );
   LabelParentName.Caption := 'ParentName: ' + WndText;
   LabelParentClass.Caption := 'ParentClass: ' + NameClass;
   LabelParentLeft.Caption := 'ParentLeft = ' + IntToStr( Rect.Left );
   LabelParentTop.Caption := 'ParentTop = ' + IntToStr( Rect.Top );
   LabelParentWidth.Caption := 'ParentWidth = ' + IntToStr( Rect.Right - Rect.Left );
   LabelParentHeight.Caption := 'ParentHeight = ' + IntToStr( Rect.Bottom - Rect.Top );
end;

.: Пример к данной статье :.


При использовании материала - ссылка на сайт обязательна