Програмування - це просто - C# Очі хакера
І так, спочатку розглянемо кілька функцій, WinAPI, за допомогою яких можна маніпулювати вікнами. Почнемо з функції FindWindow – знайти вікно. Але, для початку нам треба створити якусь обгортку, за допомогою якої ми викликатимемо ці функції, WinAPI знаходиться у нас в user32.dll. Щоб отримати ці функції, бібліотеку необхідно імпортувати за допомогою команди DllImport, яка знаходиться в просторі імен, використовуючи System.Runtime.InteropServices. А ось і наша обгортка, в якій ми передбачили лише виклик однієї функції FindWindow:
/// Клас обгортка для WinAPI
public static class WinAPI
[ DllImport ( "user32.dll" , SetLastError = true )]
public static extern IntPtr FindWindow( string lp >string lpWindowName);
Найпростіший приклад виклику:
private void btnStart_Click( object sender, EventArgs e)
IntPtr ptr = WinAPI .FindWindow( null , "Документ1 - Microsoft Word");
Якщо ми запустимо цю програму і у нас відкрито вікно із заголовком "Документ1 - Microsoft Word", то програма видасть ще дескриптор, інакше 0:

Що можна зробити із цим дескриптором? Можна, наприклад, отримати дескриптор його дочірнього об'єкта:
private void btnStart_Click( object sender, EventArgs e)
IntPtr ptr = WinAPI .FindWindow( null , " Документ 1 - Microsoft Word " );
//Якщо вікно знайдено, то відбиваємося до його дочірніх об'єктів
if (ptr.ToInt32() != 0)
IntPtr child = WinAPI .GetWindow(ptr, WinAPI . GetWindow_Cmd .GW_CHILD);
Звичайно, треба попередньо включити функцію GetWindow в нашу обгортку WinAPI:
/// Клас обгортка для WinAPI
public static class WinAPI
Ім'я класу вікна
[DllImport ( "user32.dll", SetLastError = true)]
public static extern IntPtr FindWindow( string lp >string lpWindowName);
[ DllImport ( "user32.dll" , SetLastError = true )]
public static extern IntPtr GetWindow(IntPtr HWnd, GetWindow_Cmd cmd);
[ DllImport ( "user32.dll" , CharSet = CharSet .Auto)]
public static extern int SendMessage( IntPtr hwnd, int wMsg, IntPtr wParam, [ Out ] StringBuilder lParam);
public enum GetWindow_Cmd : uint
Ми отримали дескриптор, і що далі? А далі, наприклад, можна отримати текст вікна:
private void btnStart_Click( object sender, EventArgs e)
IntPtr ptr = WinAPI .FindWindow( null , " Документ 1 - Microsoft Word " );
//Якщо вікно знайдено, то звертаємось до його дочірніх об'єктів
if (ptr.ToInt32() != 0)
IntPtr child = WinAPI .GetWindow(ptr, WinAPI . GetWindow_Cmd .GW_CHILD);
StringBuilder title=new StringBuilder();
WinAPI .SendMessage(child, Convert .ToInt32( WinAPI . GetWindow_Cmd .WM_GETTEXT), ( IntPtr )20, title);

Правда, цей текст нам ні про що не говорить, так що давайте спробуємо інший приклад:
private void btnStart2_Click( object sender, EventArgs e)
IntPtr ptr = WinAPI. FindWindow (null, "Form1");
//Якщо вікно знайдено, то звертаємось до його дочірніх об'єктів
if (ptr.ToInt32() != 0)
IntPtr[] child = new IntPtr[15];
child[0] = WinAPI .GetWindow(ptr, WinAPI . GetWindow_Cmd .GW_CHILD);
StringBuilder title=new StringBuilder();
for (int i = 1; i
child[i] = WinAPI .GetWindow(ptr, WinAPI . GetWindow_Cmd .GW_HWNDNEXT);
WinAPI .SendMessage(child[i-1], Convert .ToInt32( WinAPI . GetWindow_Cmd .WM_GETTEXT), ( IntPtr )20,title);
Цей приклад повинен звернутися до свого вікна:

Або спробуємо такий текст:
private void btnStart3_Click( object sender, EventArgs e)
IntPtr ptr = WinAPI. FindWindow (null, "Form1");
//Якщо вікно знайдено, то відбиваємося до його дочірніх об'єктів
if (ptr.ToInt32() != 0)
IntPtr[] child = new IntPtr[15];
child[0] = WinAPI .GetWindow(ptr, WinAPI . GetWindow_Cmd .GW_CHILD);
StringBuilder title=new StringBuilder();
for (int i = 1; i
child[i] = WinAPI .GetWindow(child[i - 1], WinAPI . GetWindow_Cmd .GW_HWNDNEXT);
WinAPI .SendMessage(child[i - 1], Convert .ToInt32( WinAPI . GetWindow_Cmd .WM_GETTEXT), ( IntPtr )20, title);
Тоді ми побачимо такий результат:

Таким чином, можна знайти вікно по заголовку, звернутися до його дочірніх елементів і навіть надсилати їм повідомлення Windows. Крім повідомлення GW_HWNDNEXT (отримати текст) можна посилати і будь-які інші повідомлення віндоуз, наприклад, клацання мишкою, переміщення курсору, натискання на клавішу клавіатури і так далі. Але про це ми говоритимемо у майбутніх уроках.