PDA

View Full Version : گرفتن هندل یک شی با نام کلاس متغیر



Veteran
دوشنبه 09 مرداد 1391, 19:15 عصر
سلام دوستان خوبین.
یک مشکلی دارم با هندل یک شی
میخوایم ی شی داخل یک پنجره رو پیدا کنم که اسم کلاس اون در هربار اجرا تغییر میکنه :متفکر:
حالا چطوری هندل رو به دست میاریم
البته قسمتی از اسم کلاس ثابت هست مثلا
ClassNameXXXX
ثابت : ClassName
متغیر : XXXX
قسمت XXXX در هر بار اجرا تغییر میکنه !
مثلا
SysListView32 = FindWindow("Notepad", vbNullString)
SysListView32 = FindWindowEx(SysListView32, 0&, "Edit", vbNullString)
این تکست باکس نوتپد رو پیدا میکنه اگر 1000 بار هم ببندی باز کنی مشکلی نیست پیدا میکنه
چون اسم کلاس تکست باکس (Edit) تغییر نمیکنه !
اما حالا قضیه بر عکس شده !
اسم کلاس اون شی که میخواد هندلش رو بگیره تغییر میکنه !
مثلا اگه اولش
Edit0X034
هست ببندی باز کنی میشه مثلا
Edit0043X3
تغییر میکنه !!!!!!!!!!!! :اشتباه:

محسن واژدی
دوشنبه 09 مرداد 1391, 21:20 عصر
سلام علیکم
اگر چه کلاس شی تغییر میکند اما مکان آن در ردیف کلاس ها فرم ثابت است به عنوان مثال اگر این کلاس سومین هندلی هست که پیدا میشود به عبارت دیگر اگر FindWindowEx را در یک حلقه با سه بار تکرار اجرا کنیم به این کلاس میرسیم در این هنگام کلاس شی را گرفته و آنرا بررسی کنیم

Veteran
دوشنبه 09 مرداد 1391, 21:46 عصر
متوجه نشدم !!!

میشه ی مثال بزنید ؟
:متفکر:

Veteran
دوشنبه 09 مرداد 1391, 22:44 عصر
خودم با توجه به گفته های شما ی کد نوشتم
اما پیدا نمیشه ! توی هندل هایی که پیدا میکنه هندل شی مورد نظرم نیستش

MianHwnd = FindWindow("Classname", vbNullString)
ChildHwnd = FindWindowEx(MianHwnd, ChildHwnd, vbNullString, vbNullString)
For i = 1 To 10000
DoEvents
ChildHwnd = FindWindowEx(MianHwnd, ChildHwnd, vbNullString, vbNullString)
List1.AddItem ChildHwnd
Next

just4froum
دوشنبه 09 مرداد 1391, 22:49 عصر
با سلام :

ببین این بدردت می خوره ؟

Option Explicit

Private Declare Function GetClassName Lib "user32" Alias "GetClassNameA" (ByVal hWnd As Long, ByVal lpClassName As String, ByVal nMaxCount As Long) As Long
Private Const GW_CHILD As Long = 5
Private Const GW_HWNDNEXT As Long = 2
Private Declare Function GetWindow Lib "user32" (ByVal hWnd As Long, ByVal wCmd As Long) As Long

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


Private Sub Command1_Click()
Dim ChWnd As Long, MhWnd As Long
Dim s As String

List1.Clear
MhWnd = FindWindow(vbNullString, "Computer")
ChWnd = GetWindow(MhWnd, GW_CHILD)


Do While ChWnd <> 0
s = CStr(ChWnd) & " - "
s = s & FindClassName(ChWnd)

List1.AddItem s
ChWnd = GetWindow(ChWnd, GW_HWNDNEXT)
Loop
End Sub

Private Function FindClassName(hWnd As Long) As String
Dim buf As String, lbuf As Long
buf = String(255, Chr(0))
lbuf = GetClassName(hWnd, buf, 255)
FindClassName = Left(buf, lbuf)
End Function

Veteran
دوشنبه 09 مرداد 1391, 23:32 عصر
ممنون دوستان.مشکل حل شد.
دومین هندلی که پیدا میشد رو اوردم اسم کلاس اونو دراوردم قسمت متغیر اسم کلاس رو جدا کردم.
خوشبختانه قسمتی که تغییر میکرد در همه شی ها یک مقدار بود
منم اومدم جداش کردم
قسمت ثابت هم که تغییر نمیکرد
به همدیگه اتصالشون دادم اسم کلاس درست شد.و هندل رو پیدا کردم
ممنون از اقا محسن و جناب
just4forum