PDA

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



svb411
چهارشنبه 02 مرداد 1392, 19:48 عصر
سلام دوستان
من می خوام روی پنجره یک برنامه فوکوس بشه (پنجره برنامه فعال بشه) و یا مینیمایز بشه ولی این برنامه عنوان نداره
یعنی با چند تا برنامه خواستم عنوانشو پیدا کنم ولی نداشت در تسکبار هم موسو نگه میدارم تا عنوانش نمایش داده بشه ولی نمیشه
راه حلی وجود داره یا باید بیخیال شم ؟

mehran901
چهارشنبه 02 مرداد 1392, 20:12 عصر
سلام دوستان
من می خوام روی پنجره یک برنامه فوکوس بشه (پنجره برنامه فعال بشه) و یا مینیمایز بشه ولی این برنامه عنوان نداره
یعنی با چند تا برنامه خواستم عنوانشو پیدا کنم ولی نداشت در تسکبار هم موسو نگه میدارم تا عنوانش نمایش داده بشه ولی نمیشه
راه حلی وجود داره یا باید بیخیال شم ؟
شما میتونین از نام کلاس اون پنجره استفاده کنین بجای عنوانش ، و با استفاده از تابع getclassname و findwindow هندل رو به دست بیارین و با استفاده از setforgrandwindow
روش فوکوس کنین

svb411
چهارشنبه 02 مرداد 1392, 20:29 عصر
ممنون ولی من مبتدی هستم و تازه شروع کردم vb یاد بگیرم
با جستجو یک برنامه ای پیدا کردم که دوستان نوشته بودن و هندل برنامه رو شناسایی می کنه الان هندل برنامه رو میدونم ولی نمی دونم چطوری روش فوکوس کنم هندلش 8981084
اگه زحمتی نیست لطفا کد کامل قرار بدین ممنونم

mehran901
چهارشنبه 02 مرداد 1392, 21:15 عصر
ممنون ولی من مبتدی هستم و تازه شروع کردم vb یاد بگیرم
با جستجو یک برنامه ای پیدا کردم که دوستان نوشته بودن و هندل برنامه رو شناسایی می کنه الان هندل برنامه رو میدونم ولی نمی دونم چطوری روش فوکوس کنم هندلش 8981084
اگه زحمتی نیست لطفا کد کامل قرار بدین ممنونم
هندل ی عدد 32بیتی متغییر هست که در هربار بارگزاری پنجره از طرف ویندوز به پنجره نسبت داده میشه ....

Private Declare Function SetForegroundWindow Lib "user32" Alias "SetForegroundWindow" (ByVal hwnd As Long) As Long
'example :
SetForegroundWindow me.hwnd

بجای me.hwnd میتونین هندل اون برنامه رو قرار بدین تا فوکوس بگیره

svb411
چهارشنبه 02 مرداد 1392, 22:02 عصر
یعنی هر بار باید کد هندل این برنامه رو پیدا کنم بعد فوکوس
راه حل نداره که راحت باشه چون فقط می خوام فوکوس بشه ولی عنوان نداره این کار سخت کرده

mehran901
چهارشنبه 02 مرداد 1392, 22:16 عصر
یعنی هر بار باید کد هندل این برنامه رو پیدا کنم بعد فوکوس
راه حل نداره که راحت باشه چون فقط می خوام فوکوس بشه ولی عنوان نداره این کار سخت کرده
گفتم که ، عنوان نداره ولی اون پنجره Parent شما ی ClassName داره که تغییر نمیکنه ، شما اسم کلاسشو پیدا کن هر سری که برنامت لود شد تو حافظه ، چک کن ببین اون کلاس موجوده یا نه اگر هست هندلش رو بهت میده و باش کار میکنی سرچ کنی سورس زیاده

svb411
پنج شنبه 03 مرداد 1392, 16:06 عصر
دوستان لطفا راهنمایی کنید
من کلاس برنامه رو هم پیدا کردم ولی نمی دونم چطوری فوکوس کنم روی این برنامه
اگه سورسی در این مورد می شناسید لطفا معرفی کنید
و یک سوال هم داشتم
می خوام وقتی در پنجره اینترنت اکسپلورر مثلا عدد 1234 پیدا شد یک پیامی نشان داده شود و اگر پیدا نشد دوباره تست کند
ایا این برنامه رو میشه با vb6 نوشت ؟

svb411
جمعه 04 مرداد 1392, 12:52 عصر
لطفا جواب بدین

mehran901
جمعه 04 مرداد 1392, 14:04 عصر
بیا دوست عزیز ،
ی تایمر بذار رو فرمت فقط




#If Win16 Then
Private Declare Sub GetCursorPos Lib "User" (lpPoint As Long)
Private Declare Function WindowFromPoint Lib "User" (ByVal ptScreen _
As Any) As Integer
Private Declare Function GetModuleFileName Lib "Kernel" (ByVal _
hModule As Integer, ByVal lpFileName As String, ByVal nSize As _
Integer) As Integer
Private Declare Function GetWindowWord Lib "User" (ByVal hwnd As _
Integer, ByVal nIndex As Integer) As Integer
Private Declare Function GetWindowLong Lib "User" (ByVal hwnd As _
Integer, ByVal nIndex As Integer) As Long
Private Declare Function GetParent Lib "User" (ByVal hwnd As _
Integer) As Integer
Private Declare Function GetClassName Lib "User" (ByVal hwnd As _
Integer, ByVal lpClassName As String, ByVal nMaxCount As _
Integer) As Integer
Private Declare Function GetWindowText Lib "User" (ByVal hwnd As _
Integer, ByVal lpString As String, ByVal aint As Integer) As _
Integer

#ElseIf Win32 Then
Private Type POINTAPI
x As Long
y As Long
End Type
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function SetForegroundWindow Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Function GetCursorPos Lib "user32" (lpPoint As _
POINTAPI) As Long
Private Declare Function WindowFromPointXY Lib "user32" Alias _
"WindowFromPoint" (ByVal xPoint As Long, ByVal yPoint As Long) _
As Long
Private Declare Function GetModuleFileName Lib "kernel32" Alias _
"GetModuleFileNameA" (ByVal hModule As Long, ByVal lpFileName As _
String, ByVal nSize As Long) As Long
Private Declare Function GetWindowWord Lib "user32" (ByVal hwnd As _
Long, ByVal nIndex As Long) As Integer
Private Declare Function GetWindowLong Lib "user32" Alias _
"GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As _
Long
Private Declare Function GetParent Lib "user32" (ByVal hwnd As _
Long) As Long
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 GetWindowText Lib "user32" Alias _
"GetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String, _
ByVal cch As Long) As Long
#End If
Const GWW_HINSTANCE = (-6)
Const GWW_ID = (-12)
Const GWL_STYLE = (-16)

Private Sub Form_Load()
Timer1.Interval = 300
End Sub

Sub Timer1_Timer()
#If Win16 Then
Dim ptCursor As Long
Dim sWindowText As String * 100
Dim sClassName As String * 100
Dim hWndOver As Integer
Dim hWndParent As Integer
Dim sParentClassName As String * 100
Dim wID As Integer
Dim lWindowStyle As Long
Dim hInstance As Integer
Dim sParentWindowText As String * 100
Dim sModuleFileName As String * 100
Static hWndLast As Integer

Call GetCursorPos(ptCursor)
hWndOver = WindowFromPoint(ptCursor)
If hWndOver <> hWndLast Then
hWndLast = hWndOver
Cls
Print "Window Handle: &H"; Hex(hWndOver)

r = GetWindowText(hWndOver, sWindowText, 100)
Print "Window Text: " & Left(sWindowText, r)

r = GetClassName(hWndOver, sClassName, 100)
Print "Window Class Name: "; Left(sClassName, r)

lWindowStyle = GetWindowLong(hWndOver, GWL_STYLE)
Print "Window Style: &H"; Hex(lWindowStyle)


hWndParent = GetParent(hWndOver)


If hWndParent <> 0 Then

wID = GetWindowWord(hWndOver, GWW_ID)
Print "Window ID Number: &H"; Hex(wID)
Print "Parent Window Handle: &H"; Hex(hWndParent)


r = GetWindowText(hWndParent, sParentWindowText, 100)
Print "Parent Window Text: " & Left(sParentWindowText, r)


r = GetClassName(hWndParent, sParentClassName, 100)
Print "Parent Window Class Name: "; Left(sParentClassName, r)
Else

Print "Window ID Number: N/A"
Print "Parent Window Handle: N/A"
Print "Parent Window Text : N/A"
Print "Parent Window Class Name: N/A"
End If


hInstance = GetWindowLong(hWndOver, GWW_HINSTANCE)


r = GetModuleFileName(hInstance, sModuleFileName, 100)
If r = 0 Then
Print "Module: N/A"
Else
Print "Module: "; Left(sModuleFileName, r)
End If
End If

#ElseIf Win32 Then
Dim pt32 As POINTAPI
Dim ptx As Long
Dim pty As Long
Dim sWindowText As String * 100
Dim sClassName As String * 100
Dim hWndOver As Long
Dim hWndParent As Long
Dim sParentClassName As String * 100
Dim wID As Long
Dim lWindowStyle As Long
Dim hInstance As Long
Dim sParentWindowText As String * 100
Dim sModuleFileName As String * 100
Static hWndLast As Long

Call GetCursorPos(pt32)
ptx = pt32.x
pty = pt32.y
hWndOver = WindowFromPointXY(ptx, pty)
If hWndOver <> hWndLast Then
hWndLast = hWndOver
Cls
Print "Window Handle: &H"; Hex(hWndOver)

r = GetWindowText(hWndOver, sWindowText, 100)
Print "Window Text: " & Left(sWindowText, r)

r = GetClassName(hWndOver, sClassName, 100)
Print "Window Class Name: "; Left(sClassName, r)

lWindowStyle = GetWindowLong(hWndOver, GWL_STYLE)
Print "Window Style: &H"; Hex(lWindowStyle)


hWndParent = GetParent(hWndOver)


If hWndParent <> 0 Then

wID = GetWindowWord(hWndOver, GWW_ID)
Print "Window ID Number: &H"; Hex(wID)
Print "Parent Window Handle: &H"; Hex(hWndParent)


r = GetWindowText(hWndParent, sParentWindowText, 100)
Print "Parent Window Text: " & Left(sParentWindowText, r)


r = GetClassName(hWndParent, sParentClassName, 100)
Print "Parent Window Class Name: "; Left(sParentClassName, r)
Else

Print "Window ID Number: N/A"
Print "Parent Window Handle: N/A"
Print "Parent Window Text : N/A"
Print "Parent Window Class Name: N/A"
End If


hInstance = GetWindowWord(hWndOver, GWW_HINSTANCE)


r = GetModuleFileName(hInstance, sModuleFileName, 100)
Print "Module: "; Left(sModuleFileName, r)
End If
#End If


Dim k@
Me.Caption = "the class of the window which has been pointed that is prepred successfully"
k = FindWindow(Left(sClassName, r), vbNullString)

SetForegroundWindow k
'else
'Me.Caption = "the Class of the window which has been pointed that is not valid "
' End If

End Sub






البته تو سیستم 16 بیتی !!! اجرا بشهشاید درست کار نکنه !
موس رو روی هر پنجره ای ببری ، هندل و کلاسش و ... رو میگیری بعد با کلاسش من فوکوس کردم روش

svb411
جمعه 04 مرداد 1392, 14:51 عصر
دستتون درد نکنه ممنون
کار کرد
یک سوالی هم داشتم از خدمتتون
میشه مثلا یک برنامه ای نوشت که روی دکمه back در اینترنت اکسپلورر کلیک کنه ؟
اگه یه مثال عملی کار با هندل دارید ممنون میشم لینکشو بزارید (مثلا کلیک روی start ویندوز)

این کدرو پیدا کردم ولی کار نمی کنه
http://mohsen-pc.blogfa.com/page/handle.aspx

mehran901
جمعه 04 مرداد 1392, 17:02 عصر
دستتون درد نکنه ممنون
کار کرد
یک سوالی هم داشتم از خدمتتون
میشه مثلا یک برنامه ای نوشت که روی دکمه back در اینترنت اکسپلورر کلیک کنه ؟
اگه یه مثال عملی کار با هندل دارید ممنون میشم لینکشو بزارید (مثلا کلیک روی start ویندوز)


این کدرو پیدا کردم ولی کار نمی کنه
http://mohsen-pc.blogfa.com/page/handle.aspx

اره میشه ساده ترین کار که سند کی هست ولی با استفاده از هندل و api چند راه داری 1- کنترل موس رو در برنامه خودت ایجاد کنی و با موس کارای مورد نظر رو شبیه سازی کنی ( به نظرم روش خوبیه ... از این جهت که با سرعت بالا که انجام میشه اصولا کاربر اذیت نمیشه ) 2- یا اینکه از روش های پست کردن پیغام مورد نظرتون استفاده کنین مثلا پیغام wm_close واسه بسته شدن ی پنجره از طرف ویندوز ارسال میشه شما میتونین با تابع postmessage Sendmessage و البته چند مورد دیگه از توابع ( بنا به مورد نیازتون ) پیغام ها رو ارسال کنین

mehran901
جمعه 04 مرداد 1392, 17:15 عصر
درمورد مثال هم از بخش constance برنامه api viewer ثابت مثلا wm_settext ؤو سرچ بزنین مقدارش رو بردارین حالا میخواین تایتل ی برنامه رو به ست تکست تغییر بدین اینجوری پیغامو پست میکنین به اون هندل :

Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long


Private Sub Form_Load()
SendMessage Me.hwnd, &HC, 0, "test"

' ya

SendMessage Me.hwnd, &H10, 0, 0
End Sub



مثلا پیغام wm_close برابر &H10 هست .... هندل برنامه ای که در کد دومی قرار بگیره با ارسال این پیغام به اون هندل بسته میشه ، در اینجا برنامه خودتون پیشفرضه ، برنامه رو اجرا میکنین ولی بسته میشه