سلام
برای گرفتن هندل class name یک شی که caption آن را نمیدانیم باید چیکار کنیم ؟
اصولا باید نام کلاس رو بدی تا هندل رو بده :
کد:
hWndMain = FindWindow("class name", vbNullString)
اما هندل زیر کلاس اونو میده واسه کروم تا زمانی که به جای vbNullString نام caption اون رو ندی درست کار نمیکنه
یه سرچی زدم دیدم میگن با FindWindowLike میشه هندل پنجره ای که نمیدونی رو پیدا کنی اما تو api در vb6 پیداش نکردم
یه سوال دیگه این که چرا نمیشه هندل address bar فایر فاکس رو گرفت؟
یعنی راه نداره ؟
FindWindowLike یک تابع api نیست سرچ کن میتونی تابع ش را پیدا کنی سورسش تو نت فراوانه
مهندس
توابع وتیپ های زیر چیزهایی هست که شما نیاز دارین
اولی مکان کرسر رو پیدا میکنه
دومی هندل پنجره ای که زیر کرسر هست
سومی هم از رو هندل کلاس اون پنجره رو میده
با این توابع شما میتونی کلاس پنجره مورد نظرتو پیدا کنی و تو برنامه اصلیت ازش استفاده کنی
کد:
Private Declare Function GetCursorPos Lib "user32" _
(lpPoint As POINTAPI) As Long
Private Declare Function WindowFromPoint Lib "user32" (ByVal _
xpoint As Long, ByVal ypoint As Long) As Long
Private Declare Function GetClassName Lib "user32" Alias _
"GetClassNameA" (ByVal hwnd As Long, ByVal lpClass _
As String, ByVal nMaxCount As Long) As Long
Private Type POINTAPI
X As Long
Y As Long
End Type
با موس رو دارم ولی اینو نمیخوام
بدون کم موس میخوام این کار رو بکنم
همون طور که گفتم نام کلاس رو بدم و هندلشو بده
(۱۴-بهمن-۱۳۹۰, ۱۲:۵۳:۳۷)crafcrab نوشته است: [ -> ]با موس رو دارم ولی اینو نمیخوام
بدون کم موس میخوام این کار رو بکنم
همون طور که گفتم نام کلاس رو بدم و هندلشو بده
مهندس پستمو یه بار دیگه بخون
اول باید با اون توابع یه برنامه بنویسی که بتونی اسم کلاس اون فورم رو بدست بیاری بعد که کلاس رو با اون برنامه بدست اوردی اونوقت برو تو برنامه اصلیت با تابع findwindow اسم کلاسشو بده و هندلشو بگیر
این تابع فکر کنم کار شما را راه بندازه
کد:
Option Explicit
Private Declare Function GetWindow Lib "user32" (ByVal hWnd As Long, ByVal wCmd As Long) As Long
Private Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hWnd As Long, ByVal lpString As String, ByVal cch As Long) As Long
Private Declare Function GetForegroundWindow Lib "user32.dll" () As Long
Const GW_HWNDNEXT = 2
Const GW_CHILD = 5
'********************************************
'*Give it part of the window text your looking for
'*it will give you the hWnd
'*usefull for windows that text is like "[project] - microsoft visual basic [design]"
'*usage:
'*Msgbox FindWindowLike("visual basic")
'*Returns 0 if not found
'*******************************************
Function FindWindowLike(strPartOfCaption As String) As Long
Dim hWnd As Long
Dim strCurrentWindowText As String
Dim r As Integer
hWnd = GetForegroundWindow
Do Until hWnd = 0
strCurrentWindowText = Space$(255)
r = GetWindowText(hWnd, strCurrentWindowText, 255)
strCurrentWindowText = Left$(strCurrentWindowText, r)
'hWnd = GetWindow(hWnd, GW_CHILD)
If InStr(1, LCase(strCurrentWindowText), LCase(strPartOfCaption)) <> 0 Then GoTo Found
hWnd = GetWindow(hWnd, GW_HWNDNEXT)
Loop
Exit Function
Found:
FindWindowLike = hWnd
End Function
(۱۴-بهمن-۱۳۹۰, ۱۸:۵۳:۵۴)lord_viper نوشته است: [ -> ][quote='crafcrab' pid='164553' dateline='1328257417']
با موس رو دارم ولی اینو نمیخوام
بدون کم موس میخوام این کار رو بکنم
همون طور که گفتم نام کلاس رو بدم و هندلشو بده
مهندس پستمو یه بار دیگه بخون
اول باید با اون توابع یه برنامه بنویسی که بتونی اسم کلاس اون فورم رو بدست بیاری بعد که کلاس رو با اون برنامه بدست اوردی اونوقت برو تو برنامه اصلیت با تابع findwindow اسم کلاسشو بده و هندلشو بگیر
عزیز من اسم کلاس اون فورم رو دارم نیازی به این برنامه موس نیست
با findwindow و FindWindowEx کارم رو راه انداختم قبلا
اما مشکل اینه که برای این یکی پروسس کار نمیکنه
شما کدی را که من براتون گذاشتم اجرا کردید؟
فقط کافیه قسمتی از نام پنجره را بهش بدید مثلا فایرفاکس وقتی یک صفحه را باز میکنه caption به شکل زیر تغییر میکنه
Google - Mozilla Firefox
با تابعی که من براتون گذاشتم فقط کافیه یک قسمت از اسم پنجره را بدید مثلا فقط
fire
و بعد هندل اون پنجره را بگیرید
کد:
Private Sub Command1_Click()
MsgBox FindWindowLike("fire")
End Sub
البته یه کار دیگه هم میتونی بکنی
:ی
پیاده سازیش با خودت
با استفاده از enumWindows لیست کلیه پنجره های باز سیستم رو در باید بعد با با استفاده از openprocess و Getmodulefilename میتونی ادرس فایل exe شو بگیری و چک کنی این فورم مال چه برنامه ای یا پروسه ای هست
(۱۷-بهمن-۱۳۹۰, ۱۴:۲۲:۱۷)lord_viper نوشته است: [ -> ]البته یه کار دیگه هم میتونی بکنی
:ی
پیاده سازیش با خودت
با استفاده از enumWindows لیست کلیه پنجره های باز سیستم رو در باید بعد با با استفاده از openprocess و Getmodulefilename میتونی ادرس فایل exe شو بگیری و چک کنی این فورم مال چه برنامه ای یا پروسه ای هست
آره میشه ولی فکر کنم cpu رو زیاد درگیر کنه هی دونه دونه ....