السلام عليكم
بداية اود تقديم شرح بسيط
يوجد برنامج واجهته كما في المرفقات :
من داخل الكود نجد انها مكونة من 9 عناصر (controls ) عدد اثنين منها مربعات نص بالاضافة الى واحد من نوع زر
الذي احاوله هو التالي :
يوجد برنامج اخر سيرسل send message ليضع set focus على النص الاول و يمرر قيمة ثم يكرر نفس العملية على المربع الثاني و يمرر قيمة
و لكن الذي يحصل معي انه في كلتا الحالتين يمرر النص لنفس المربع و احيانا لا يمرر لاي مربع نص مع العلم انه ينفذ التعليمات بدون اخطاء
و اليكم الاكواد
Public Class NativeWin32
<DllImport("user32.dll", CharSet:=CharSet.Auto)> _
Public Shared Function FindWindow(ByVal lpClassName As StringBuilder, ByVal lpWindowName As String) As Integer
End Function
<DllImport("User32.dll")> _
Private Shared Function EnumChildWindows _
(ByVal WindowHandle As IntPtr, ByVal Callback As EnumWindowProcess, _
ByVal lParam As IntPtr) As Boolean
End Function
'
'--- user defined datatype
Public Delegate Function EnumWindowProcess(ByVal Handle As IntPtr, ByVal Parameter As IntPtr) As Boolean
Public Shared Function GetChildWindows(ByVal ParentHandle As IntPtr) As IntPtr()
Dim ChildrenList As New List(Of IntPtr)
Dim ListHandle As GCHandle = GCHandle.Alloc(ChildrenList)
Try
EnumChildWindows(ParentHandle, AddressOf EnumWindow, GCHandle.ToIntPtr(ListHandle))
Finally
If ListHandle.IsAllocated Then ListHandle.Free()
End Try
Return ChildrenList.ToArray
End Function
<DllImport("user32", CharSet:=CharSet.Auto, SetLastError:=True)> _
Public Shared Function GetDlgCtrlID(ByVal hWnd As IntPtr) As Integer
End Function
Public Const WM_SETTEXT = &HC
Public Const WM_SETFOCUS = &H7
Public Shared Function SendMessage(ByVal hWnd As IntPtr, ByVal Msg As UInteger, ByVal wParam As IntPtr, ByVal lParam As IntPtr) As IntPtr
End Function
end classو الان لدينا دالتان الاولى هي T() تطلب من المستخدم ادخل اسم الشاشة المطلوبة و من ثم يقوم باستدعاء دالة اخرى وكودها كالتالي :
Sub T()
'
Dim WinWnd As Long, Ret As String, RetVal As Long, lpClassName As New StringBuilder()
'Ask for a Window title
Ret = InputBox("Enter the exact window title:" + Chr(13) + Chr(10) + "Note: must be an exact match")
'Search the window
WinWnd = NativeWin32.FindWindow(Nothing, Ret)
If WinWnd = 0 Then MsgBox("Couldn't find the window ...") : Exit Sub
'
Me.tt(WinWnd)
End Subالدالة الثانية اسمها TT() وهي تقوم بمهمة ايجاد controls التي يحويها الفورم و من ثم يبدا بالمرور عندما يجد مربعات النص الخاصة بنا يمرر نص كما هو في الكود التالي
Sub tt(ByVal winwnd As Long) Dim tWnd As Long Dim strValue As String ' Dim i() As IntPtr ReDim i(UBound(NativeWin32.GetChildWindows(WinWnd))) 'MsgBox(i.Length) Dim sbTitle1 As StringBuilder = New StringBuilder(1024) '' For ii As Integer = 0 To UBound(NativeWin32.GetChildWindows(winwnd)) '--- CONTROL CLASS NAME NativeWin32.GetClassName(NativeWin32.GetChildWindows(winwnd).GetValue(ii), sbTitle1, sbTitle1.Capacity) 'MsgBox(sbTitle1.ToString) ' Dim Id As Int32 = NativeWin32.GetDlgCtrlID(NativeWin32.GetChildWindows(winwnd).GetValue(ii)) If ii = 0 Or ii = 1 Then ' 'tWnd = NativeWin32.SetForegroundWindow(winwnd) 'bring the whole form to the front (optional) tWnd = NativeWin32.SendMessage(Id, NativeWin32.WM_SETFOCUS, 0&, 0&) 'Focus to Text1 strValue = "hello" 'value of textbox 'Dim gh As GCHandle = GCHandle.Alloc(strValue, GCHandleType.Pinned) SendKeys.SendWait(strValue) 'tWnd = NativeWin32.SendMessage(Id, NativeWin32.WM_SETTEXT, 0&, gh.AddrOfPinnedObject) 'store the value ' End If ' Next End Sub
كما اسلفت سابقا المشكلة لدي في داخل جملة اتخاذ القرار if الاوامر غير دقيقة و لا ينفذ المطلوب على اكمل وجه
بانتظار تعليقات الاعضاء الاعزاء لحل المشكلة و من لديه فكرة افضل نرحب بسردها للنقاش و كي تعم الفائدة
تقبلو تحياتي