PDA

View Full Version : مبتدی: کلاس هر پنجره در وی بی



mr-adler
چهارشنبه 11 آبان 1390, 02:02 صبح
سلام
چطوری باید کلاس هر پنجره در وی بی بدست بیارم؟
مثلا کلاس پنجره ی TaskManager ویندوز از نوع 32770# می باشد. کلاس بقیه پنجره ها رو چطور باید بفهمم؟

ممنون میشم راهنماییم کنید:قلب:

محسن واژدی
چهارشنبه 11 آبان 1390, 06:40 صبح
سلام علیکم
همانطور که میدانیم هر شی ای که امکان دسترسی داشته باشد هندلی دارد که در وی بی توسط hWnd بدست می آید
در مورد هندل سایر کانتینرهای موجود در ویندوز هم توابع متعددی قادر به انجام این موضوع هستند، به عنوان مثال چند تابع زیر:
GetActiveWindow
GetForegroundWindow
Putfocus
FindWindow
و...
که هرکدام در جای خود کاربرد دارند

برای دریافت کلاس یک شی هم توابع مختلفی وجود دارد، در اینجا ما با تابع GetClassName کلاس هندل را بدست می آوریم
ابتدا تابع زیر را در برنامه کپی کنید:

Private Declare Function GetClassName Lib "user32" Alias "GetClassNameA" (ByVal hwnd As Long, ByVal lpClassName As String, ByVal nMaxCount As Long) As Long
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long

Function RetrieveClassName(lHandle&) As String

Dim sCName$, lCLength&

sCName$ = String(255, Chr(0))

lCLength& = GetClassName(Command1.hwnd, sCName$, 255)

RetrieveClassName = Left(sCName$, lCLength&)

End Function


نمونه 1:
ابتدا یک نمونه برنامه Notepad اجرا کنید سپس کد زیر را اجرا کنید
در نمونه زیر هندل یک کانتینر را توسط FindWindow بدست آورده سپس با جایگزینی در تابع GetClassName کلاس هندل را بدست می آوریم


Private Sub Command1_Click()
Dim lhwnd&

lhwnd& = FindWindow(vbNullString, "Untitled - Notepad")

MsgBox "Window handle: " & lhwnd& & _
vbNewLine & _
"Class name: " & RetrieveClassName(lhwnd&), _
vbInformation
End Sub

نمونه 2:
نمونه زیر نام کلاس فرم برنامه را بدست می آورد

Private Sub Command1_Click()

MsgBox "Window handle: " & lhwnd& & _
vbNewLine & _
"Class name: " & RetrieveClassName(Me.hwnd), _
vbInformation
End Sub


نمونه 3:
نمونه زیر نام کلاس CommandButton فعلی را بدست می آورد

Private Sub Command1_Click()

MsgBox "Window handle: " & Command1.hwnd & _
vbNewLine & _
"Class name: " & RetrieveClassName(Command1.hwnd), _
vbInformation
End Sub



موفق باشید

mr-adler
جمعه 13 آبان 1390, 01:40 صبح
سلام و عرض خسته نباشد خدمت همگی
البته کد های بالا رو زیاد تمرین نکردم و خیلی اشنایی ندارم چون برای من هنوز مبحث سخت و سنگینیه .
فقط یه سوال داشتم و اونم اینه که:
(هندل & کلاس & نام پنجره)
اقای واژدی از روی هندل کلاس رو بدست اوردند . در واقع من قصدم این بود که بر فرض هندل رو میخوام بدست بیاریم حالا از کجا کلاس پنجره مورد نظر رو تشخیص بدیم تا بتونیم هندل اون رو از روی کلاس بدست بیاریم؟
مثلا فرض کنیم یه پنجره نت پد داریم که نامش توسط کاربر عوض شده و نوع کلاس رو هم نداریم . ایا میشه در این حالت هندل رو بدست اورد؟
در ضمن ایا شما کلاس پنجره ها رو حفظ میکنید؟

با نهایت تشکر ....:قلب:

محسن واژدی
جمعه 13 آبان 1390, 10:20 صبح
بر فرض هندل رو میخوام بدست بیاریم حالا از کجا کلاس پنجره مورد نظر رو تشخیص بدیم تا بتونیم هندل اون رو از روی کلاس بدست بیاریم؟
مثلا فرض کنیم یه پنجره نت پد داریم که نامش توسط کاربر عوض شده و نوع کلاس رو هم نداریم . ایا میشه در این حالت هندل رو بدست اورد؟

سلام علیکم
به این صورت کار مشکل و تقریبا نشدنی است، اما موضوعی که وجود دارد کلاس یک پنجره برنامه ثابت است پس میتوانید همیشه از کلاس آن به منظور بدست آوردن هندل استفاده کنید هرچند که نام فرم را دراختیار نداشته باشید
به عنوان مثال در توابع بالا برفرض که عنوان فرم notepad را در اختیار ندارد میتوانید از کلاس آن که اطلاع داریم ("notepad") برای دریافت هندل فرم برنامه استفاده کنیم:

Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Sub Command1_Click()
Dim lhwnd&
lhwnd& = FindWindow("notepad", vbNullString)
End Sub

در دستور بالا چون نام فرم را در اختیار نداریم و تنها از کلاس استفاده کرده ایم، تابع هندل فرم یافت شده با کلاس notepad را برمیگرداند
البته این دستور همیشه هندل اولین فرم آشکار شده را برمیگرداند؛ برای برگرداندن نام همه فرم های موجود بایستی تاحدودی دستورات و توابع بکارگرفته شده را بیشتر کنید



آیا شما کلاس پنجره ها رو حفظ میکنید؟

برخی از فرم ها که زیاد با آنها سرکار دارم، اما نه همه، البته لازم هم نیست هرگاه که به کلاس فرمی نیاز داشتید هم میتوانید با GetClassName و ... و هم با برنامه هایی که در این زمینه وجود دارند. برنامه ای با نام spy++ نیز به همراه ویژوال استادیو 6 نصب میشود که یکی از عملکردهای آن نشان دادن کلاس برنامه هاست

موفق باشید

hasht.rood
جمعه 13 آبان 1390, 14:33 عصر
سلام
میخواستم بدونم چطوری هندل پنجره pm یاهو مسنجر رو بدست بیارم. و اینکه یک متن رو داخل تکس باکس پنجره pm کپی کنم ؟
منتظر راهنمایی و کمکتون هستم
مرسی

mr-adler
جمعه 13 آبان 1390, 17:43 عصر
سلام

برنامه ای با نام spy++ نیز به همراه ویژوال استادیو 6 نصب میشود که یکی از عملکردهای آن نشان دادن کلاس برنامه هاست
برنامه خیلی جالبی بود ممنونم...

سلام
میخواستم بدونم چطوری هندل پنجره pm یاهو مسنجر رو بدست بیارم. و اینکه یک متن رو داخل تکس باکس پنجره pm کپی کنم ؟
منتظر راهنمایی و کمکتون هستم
مرسی
با برنامه اشاره شده. تو کامپیوتر من هندلش رو 0004001E نشون میده. یه مسئله ای هم که هست امتحان کردم هر پنجره پی ام سندر متعلق به یک کاربر هندل متفاوت داره.
البته با روش کد نویسی هم بدست میاد...

محسن واژدی
جمعه 13 آبان 1390, 21:14 عصر
با برنامه اشاره شده. تو کامپیوتر من هندلش رو 0004001E نشون میده. یه مسئله ای هم که هست امتحان کردم هر پنجره پی ام سندر متعلق به یک کاربر هندل متفاوت داره.
البته با روش کد نویسی هم بدست میاد...
سلام علیکم
بله، هندل در هربار ایجاد شدن جدید فرم تغییر میکند اما کلاس آن ثابت خواهد بود که میتوانیم با روش های عرض شده مجددا هندل فرم را بدست آورد، البته چون در این سیستم به yahoo-messenger دسترسی ندارم نمیتوانم این موضوع را بررسی کنیم

موفق باشید