این تابع API كه امروز می خواهم معرفی كنم می تونه از یك پنجره عكس بگیره و اون رو در یك كنترل گرافیكی مثل PictureBox یا حتی خود فرم چاپ كنه.
برای این كار:
ابتدا باید هندل پنجره ی مورد نظر رو به دست آوریم كه این كار با استفاده از تابع FindWindow امكان پذیر است. پس تابع API زیر رو در قسمت جنرال فرمتون كپی كنید:
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
حالا باید با استفاده از این تابع هندل پنجره ی مورد نظر رو در یك متغییر قرار دهیم:
Hendle = FindWindow(vbNullString, "My Computer")
من برای این تابع پنجره ی My Computer رو در نظر گرفتم و شما هم می توانید در كد بالا عنوان پنجره ی مورد نظر رو به جای My Computer بنویسید.
سؤال: كلمه ی vbNullString دیگر چیست؟ اگر به تابع API نگاه كنید می بینید كه این تابع از دو متغییر به نام های lpClassName و lpWindowName تشكیل شده است. متغییر دوم كه معلومه همون كه ما مقدار دهی كردیم و در اون عنوان پنجره رو نوشتیم اما متغییر اول برای این است كه اگر شما نام كلاس پنجره ی مورد نظر رو داشتید در اون متغییر قرار می دادید (این كار با استفاده از تابع GetClassNameA امكان پذیر است) و به جای عنوان پنجره كلمه ی vbNullString رو می آوردید.
خب حالا یك متغییر حاوی هندل پنجره ی مورد نظر داریم. حالا باید از تابع PrintWindow برای عكس گرفتن استفاده كنیم. تابع زیر رو هم در قسمت جنرال فرمتون كپی كنید:
Private Declare Function PrintWindow Lib "user32.dll" (ByVal hWnd As Long, ByVal hdcBlt As Long, ByVal nFlags As Long) As Long
Private Const WP_REDRAW = 0
Private Const WP_NOREDRAW = 1
اون دو ثابت مربوط به متغییر nFlags در تابع هستند كه اولیش باعث میشه كه تصویر بعد از رسم Redraw بشه و دومیش باعث میشه كه تصویر بعد از رسم Redraw نشه.
نكته: من این تصویر رو روی فرم چاپ می كنم و شما می توانید اون رو روی PictureBox نیز رسم كنید.
حالا از این تابع به صورت زیر استفاده می كنیم:
PrintWindow Hendle, Me.hDC, WP_REDRAW
متغییر hdcBlt در تابع PrintWindow به معنای هندل كنترل گرافیكی مورد نظر است كه تصویر می خواهد روی آن رسم شود.
نكته: در زمان اجرا حتماً باید پنجره ی مورد نظر باز باشد.
كد زیر تمام چیزی است كه شما باید توی قسمت جنرال فرمتون كپی كنید:
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function PrintWindow Lib "user32.dll" (ByVal hWnd As Long, ByVal hdcBlt As Long, ByVal nFlags As Long) As Long
Private Const WP_REDRAW = 0
Private Const WP_NOREDRAW = 1
Private Sub Form_Load()
Hendle = FindWindow(vbNullString, "My Computer")
PrintWindow Hendle, Me.hDC, WP_REDRAW
End Sub
این هم یك سورس بسیار كوچك است كه عنوان پنجره رو از ورودی دریافت می كنه و تصویر اونو برروی فرم رسم می كنه.