۲۸-مرداد-۱۳۹۱, ۱۰:۱۳:۲۷
مشکلی که در
Qwidget دارم :
من هندل اشیاء رو از برنامه ی دیگر می گیرم و کنترل آن ها رو در دست می گیرم .
در برنامه ی مورد نظر وقتی آبجکت رو می گیرم احساس می کنم که اشیاء داخلی تری وجود داره که نمی تونم به اونها دسترسی داشته باشم مثلا متنی هست که داخل یک ریچ تکست باکس هست ولی من نمی تونم متن اون رو با برنامم بخونم . ولی وقتی تست می کنم مثل این که پرنت اون رو مییتونم بگیرم اما به فرزندان داخل اون دسترسی ندارم
اینم بگم که با برنامه های معمولی خیلی راحت کار کردم ولی به این کلاس که رسیدم به مشکل خوردم
ممنون می شم دوستانی که در این زمینه اطلاعات دارند راهنمایی کنن .
جهت اطلاع از روش استفاده شده کد های زیر رو مشاهده کنید :
نمونه توابع استفاده شده به زبان وی بی :
Private Declare Function SendMessageA Lib "user32" (ByVal hwnd As IntPtr, _
ByVal wMsg As Integer, _
ByVal wParam As IntPtr, _
ByVal ByVallParam As IntPtr) _
As Integer
Private Declare Auto Function FindWindow Lib "user32" (ByVal lpClassName As String, _
ByVal lpWindowName As String) _
As IntPtr
Private Declare Function EnumChildWindows Lib "user32" (ByVal hWndParent As IntPtr, _
ByVal lpEnumFunc As EnumChildWindowsCallBack, _
ByVal lParam As Integer) _
As Boolean
Private Callback As New EnumChildWindowsCallBack(AddressOf EnumChildWindowsProc)
Delegate Function EnumChildWindowsCallBack(ByVal Child_hWnd As IntPtr, ByVal lParamCalled As IntPtr) As Boolean
نمونه کد من
Dim Window_hWnd As IntPtr = FindWindow(Nothing, "Maintenance Console") '<=Replace "Test Application"
'STEP 2)
'Using a callback function and "EnumChildWindows",
'get the handle of all the children and grand children of the window
If Window_hWnd <> 0 Then
Dim NotUsed As Boolean = EnumChildWindows(Window_hWnd, Callback, Nothing)
End If
'STEP 3)
'get the text
'You will have to find the right index to use for ListOfChild in the "SendMessage"
'The only way will be using the "Trial and error" method
'Unless some controls get added and removed dynamicly in that 3rd party application, the
'index should always remain the same
'MaxTextLength has 201 bytes : 200 char max + terminating null character.
Dim MaxTextLength As Integer = 200
Dim Pointer As IntPtr = System.Runtime.InteropServices.Marshal.AllocHGloba l(MaxTextLength) '
Dim TextLength As Integer = SendMessageA(ListOfChild(0), WM_GETTEXT, CType(MaxTextLength, IntPtr), Pointer)
اینم یک مثال دیگه که متن داخل یک WordPadرو می خونم باهاش
Dim hwnd As Integer = FindWindow(Nothing, "Document - WordPad")
Dim hwndchild As Integer = FindWindowEx(hwnd, 0, "RICHEDIT50W", vbNullString)
Dim TextLen As Integer = SendMessage(hwndchild, WM_GETTEXTLENGTH, 0, 0)
Dim Buffer As String = New String(" "c, TextLen)
SendMessageByString(hwndchild, WM_GETTEXT, TextLen, Buffer)
Qwidget دارم :
من هندل اشیاء رو از برنامه ی دیگر می گیرم و کنترل آن ها رو در دست می گیرم .
در برنامه ی مورد نظر وقتی آبجکت رو می گیرم احساس می کنم که اشیاء داخلی تری وجود داره که نمی تونم به اونها دسترسی داشته باشم مثلا متنی هست که داخل یک ریچ تکست باکس هست ولی من نمی تونم متن اون رو با برنامم بخونم . ولی وقتی تست می کنم مثل این که پرنت اون رو مییتونم بگیرم اما به فرزندان داخل اون دسترسی ندارم
اینم بگم که با برنامه های معمولی خیلی راحت کار کردم ولی به این کلاس که رسیدم به مشکل خوردم
ممنون می شم دوستانی که در این زمینه اطلاعات دارند راهنمایی کنن .
جهت اطلاع از روش استفاده شده کد های زیر رو مشاهده کنید :
نمونه توابع استفاده شده به زبان وی بی :
Private Declare Function SendMessageA Lib "user32" (ByVal hwnd As IntPtr, _
ByVal wMsg As Integer, _
ByVal wParam As IntPtr, _
ByVal ByVallParam As IntPtr) _
As Integer
Private Declare Auto Function FindWindow Lib "user32" (ByVal lpClassName As String, _
ByVal lpWindowName As String) _
As IntPtr
Private Declare Function EnumChildWindows Lib "user32" (ByVal hWndParent As IntPtr, _
ByVal lpEnumFunc As EnumChildWindowsCallBack, _
ByVal lParam As Integer) _
As Boolean
Private Callback As New EnumChildWindowsCallBack(AddressOf EnumChildWindowsProc)
Delegate Function EnumChildWindowsCallBack(ByVal Child_hWnd As IntPtr, ByVal lParamCalled As IntPtr) As Boolean
نمونه کد من
Dim Window_hWnd As IntPtr = FindWindow(Nothing, "Maintenance Console") '<=Replace "Test Application"
'STEP 2)
'Using a callback function and "EnumChildWindows",
'get the handle of all the children and grand children of the window
If Window_hWnd <> 0 Then
Dim NotUsed As Boolean = EnumChildWindows(Window_hWnd, Callback, Nothing)
End If
'STEP 3)
'get the text
'You will have to find the right index to use for ListOfChild in the "SendMessage"
'The only way will be using the "Trial and error" method
'Unless some controls get added and removed dynamicly in that 3rd party application, the
'index should always remain the same
'MaxTextLength has 201 bytes : 200 char max + terminating null character.
Dim MaxTextLength As Integer = 200
Dim Pointer As IntPtr = System.Runtime.InteropServices.Marshal.AllocHGloba l(MaxTextLength) '
Dim TextLength As Integer = SendMessageA(ListOfChild(0), WM_GETTEXT, CType(MaxTextLength, IntPtr), Pointer)
اینم یک مثال دیگه که متن داخل یک WordPadرو می خونم باهاش
Dim hwnd As Integer = FindWindow(Nothing, "Document - WordPad")
Dim hwndchild As Integer = FindWindowEx(hwnd, 0, "RICHEDIT50W", vbNullString)
Dim TextLen As Integer = SendMessage(hwndchild, WM_GETTEXTLENGTH, 0, 0)
Dim Buffer As String = New String(" "c, TextLen)
SendMessageByString(hwndchild, WM_GETTEXT, TextLen, Buffer)