Програмирането става лесно - C# през очите на хакер

И така, като начало, нека да разгледаме няколко функции, WinAPI, с които можете да манипулирате прозорци. Да започнем с функцията FindWindow - намиране на прозорец. Но първо трябва да създадем някакъв вид обвивка, с която ще извикаме тези функции, WinAPI се намира в нашия user32.dll. За да получите тези функции, библиотеката трябва да бъде импортирана с помощта на командата DllImport, която се намира в пространството на имената using System.Runtime.InteropServices. И ето нашата обвивка, в която досега сме предоставили само извикване на една функция FindWindow:

/// Клас обвивка за WinAPI

публичен статичен клас

[DllImport ("user32.dll", SetLastError = true)]

public static extern IntPtr FindWindow( низ lp >низ lpWindowName);

Най-простият пример за обаждане:

private void btnStart_Click( обект подател, EventArgs e)

IntPtr ptr = WinAPI .FindWindow( null , "Document1 - Microsoft Word" );

Ако стартираме тази програма и имаме отворен прозорец със заглавие "Document1 - Microsoft Word", тогава програмата ще издаде друг дескриптор, в противен случай 0:

програмирането

Какво може да се направи с този дескриптор? Можете например да получите манипулатор на неговия дъщерен обект:

private void btnStart_Click( обект подател, EventArgs e)

IntPtr ptr = WinAPI .FindWindow( null , "Документ 1 - Microsoft Word" );

//Ако прозорецът бъде намерен, тогава се връща към дъщерните му обекти

if (ptr.ToInt32() != 0)

IntPtr дете = WinAPI .GetWindow(ptr, WinAPI .GetWindow_Cmd .GW_CHILD);

Естествено, първо трябва да включим функцията GetWindow в нашата WinAPI обвивка:

/// Клас обвивка за WinAPI

публичен статичен клас

Име на клас прозорец

[DllImport( "user32.dll" , SetLastError = true )]

public static extern IntPtr FindWindow( низ lp >низ lpWindowName);

[DllImport ("user32.dll", SetLastError = true)]

публичен статичен extern IntPtr GetWindow( IntPtr HWnd, GetWindow_Cmd cmd);

[ DllImport( "user32.dll" , CharSet = CharSet .Auto)]

публичен статичен extern int SendMessage( IntPtr hwnd, int wMsg, IntPtr wParam, [ Out ] StringBuilder lParam);

публичен enum GetWindow_Cmd : uint

Получихме дескриптора и какво следва? И тогава, например, можете да получите текста на прозореца:

private void btnStart_Click( обект подател, EventArgs e)

IntPtr ptr = WinAPI .FindWindow( null , "Документ 1 - Microsoft Word" );

//Ако прозорецът бъде намерен, тогава се обръщаме към неговите дъщерни обекти

if (ptr.ToInt32() != 0)

IntPtr дете = WinAPI .GetWindow(ptr, WinAPI .GetWindow_Cmd .GW_CHILD);

StringBuilder заглавие = нов StringBuilder();

WinAPI .SendMessage(child, Convert .ToInt32( WinAPI . GetWindow_Cmd .WM_GETTEXT), ( IntPtr )20, заглавие);

лесно

Вярно е, че този текст не ни казва нищо, така че нека опитаме друг пример:

private void btnStart2_Click( обект подател, EventArgs e)

IntPtr ptr = WinAPI .FindWindow( null , "Form1" );

//Ако прозорецът бъде намерен, тогава се обръщаме към неговите дъщерни обекти

if (ptr.ToInt32() != 0)

IntPtr[] дете = нов IntPtr[15];

дете[0] = WinAPI .GetWindow(ptr, WinAPI .GetWindow_Cmd .GW_CHILD);

StringBuilder заглавие = нов StringBuilder();

за ( int i = 1; i

дете[i] = WinAPI .GetWindow(ptr, WinAPI .GetWindow_Cmd .GW_HWNDNEXT);

WinAPI .SendMessage(child[i-1], Convert .ToInt32( WinAPI . GetWindow_Cmd .WM_GETTEXT), ( IntPtr )20,заглавие);

Този пример трябва да се отнася за собствен прозорец:

става

Или опитайте този текст:

private void btnStart3_Click( обект подател, EventArgs e)

IntPtr ptr = WinAPI .FindWindow( null , "Form1" );

//Ако прозорецът бъде намерен, тогава се връща към дъщерните му обекти

if (ptr.ToInt32() != 0)

IntPtr[] дете = нов IntPtr[15];

дете[0] = WinAPI .GetWindow(ptr, WinAPI .GetWindow_Cmd .GW_CHILD);

StringBuilder заглавие = нов StringBuilder();

за ( int i = 1; i

дете[i] = WinAPI .GetWindow(дете[i - 1], WinAPI .GetWindow_Cmd .GW_HWNDNEXT);

WinAPI .SendMessage(child[i - 1], Convert .ToInt32( WinAPI . GetWindow_Cmd .WM_GETTEXT), ( IntPtr )20, заглавие);

Тогава ще видим следния резултат:

програмирането

По този начин е възможно да намерите прозорец по неговото заглавие, да получите достъп до неговите деца и дори да изпратите Windows съобщения до тях. В допълнение към съобщението GW_HWNDNEXT (получете текст), можете да изпращате всякакви други съобщения на Windows, например щраквания на мишката, движение на курсора, натискане на клавиши на клавиатурата и т.н. Но ще говорим за това в следващите уроци.