Програмирането става лесно - 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, например щраквания на мишката, движение на курсора, натискане на клавиши на клавиатурата и т.н. Но ще говорим за това в следващите уроци.