PDA

View Full Version : حرفه ای: هندل اشیاء از کلاس Qwidget



javadi_31456
یک شنبه 15 مرداد 1391, 09:33 صبح
مشکلی که در

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)



ممنون می شم راهنماییم کنید

the king
یک شنبه 15 مرداد 1391, 15:28 عصر
[RIGHT]مشکلی که در

Qwidget دارم :

من هندل اشیاء رو از برنامه ی دیگر می گیرم و کنترل آن ها رو در دست می گیرم .
در برنامه ی مورد نظر وقتی آبجکت رو می گیرم احساس می کنم که اشیاء داخلی تری وجود داره که نمی تونم به اونها دسترسی داشته باشم مثلا متنی هست که داخل یک ریچ تکست باکس هست ولی من نمی تونم متن اون رو با برنامم بخونم . ولی وقتی تست می کنم مثل این که پرنت اون رو مییتونم بگیرم اما به فرزندان داخل اون دسترسی ندارم
اینم بگم که با برنامه های معمولی خیلی راحت کار کردم ولی به این کلاس که رسیدم به مشکل خوردم
ممنون می شم دوستانی که در این زمینه اطلاعات دارند راهنمایی کنن .
ممنون می شم راهنماییم کنید


همه اجزاء در برنامه ها پنجره ندارند، بعضی هاشون فاقد پنجره اند و طبیعتا به شیوه ارسال پیغام با SendMessage نمیشه باهاشون ارتباط بر قرار کرد،
مثلا اجزاء داخل Internet Explorer و یا Microsoft Word و ... به این کنترل ها Windowless می گویند که کار باهاشون مشکله، مگر اینکه ساختار شون
رو به خوبی بشناسید.
در ضمن شما از WM_GETTEXT استفاده می کنید، این پیغام خیلی ابتدایی است و صرفا برای کنترل های ساده مثل Form و TextBox جواب میده.
کنترل های استانداردی مثل RichTextBox پیغام های مخصوص خودشون رو دارند، پیغام های RichTextBox با EM شروع میشه، شما می بایستی
پیغام EM_GETTEXTEX رو در MSDN جستجو کنید، همان پیغامی است که برای دریافت متن داخل یک RichTextBox بهش نیاز دارید، ساختارش
هم پیچیده تر از WM_GETTEXT است.

javadi_31456
دوشنبه 16 مرداد 1391, 11:22 صبح
همه اجزاء در برنامه ها پنجره ندارند، بعضی هاشون فاقد پنجره اند و طبیعتا به شیوه ارسال پیغام با SendMessage نمیشه باهاشون ارتباط بر قرار کرد،
مثلا اجزاء داخل Internet Explorer و یا Microsoft Word و ... به این کنترل ها Windowless می گویند که کار باهاشون مشکله، مگر اینکه ساختار شون
رو به خوبی بشناسید.
در ضمن شما از WM_GETTEXT استفاده می کنید، این پیغام خیلی ابتدایی است و صرفا برای کنترل های ساده مثل Form و TextBox جواب میده.
کنترل های استانداردی مثل RichTextBox پیغام های مخصوص خودشون رو دارند، پیغام های RichTextBox با EM شروع میشه، شما می بایستی
پیغام EM_GETTEXTEX رو در MSDN جستجو کنید، همان پیغامی است که برای دریافت متن داخل یک RichTextBox بهش نیاز دارید، ساختارش
هم پیچیده تر از WM_GETTEXT است.



دوست عزیز
من با این چیزی که شما گفتی مشکلی ندارم
برای دریافت متن ریچ تکست باکس هم مشکلی ندارم
برای اطمینان از چیزی که شما گفتید به راحتی با نمونه کد زیر متن رو گرفتم

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) + 200
Dim Buffer As String = New String(" "c, TextLen)
SendMessageByString(hwndchild, WM_GETTEXT, TextLen, Buffer)


مشکل من اینجاست که نمی دونم چطور باید به فرزندان یک پدر در Qwidget یا همون کلاس Qt دسترسی داشته باشم
من حتی نتونستم به یک Button در این برنامه Sendmessage کنم و جوابی بگیرم


باز هم ممنون میشم اگر کسی اطلاعاتی در این زمینه داره راهنماییم کنه .

حامد مصافی
دوشنبه 16 مرداد 1391, 11:50 صبح
ویدجت‌های کیوت در سیستم‌عامل ویندوز به شکل یک پنجره واحد عمل می‌کنند. در واقع هندل فقط برای ویدجتی که مستقیما روی دسکتاپ نمایش داده می‌شود ساخته می‌شود (QDialog و QMainWindow و ...)‌و سایر ویدجت‌ها با استفاده از دستورات ترسیمی روی والد خود رسم می‌شوند. لذا توابع API ویندوز روی آنها کار نکرده و جواب نخواهند داد.

javadi_31456
دوشنبه 16 مرداد 1391, 12:54 عصر
ویدجت‌های کیوت در سیستم‌عامل ویندوز به شکل یک پنجره واحد عمل می‌کنند. در واقع هندل فقط برای ویدجتی که مستقیما روی دسکتاپ نمایش داده می‌شود ساخته می‌شود (QDialog و QMainWindow و ...)‌و سایر ویدجت‌ها با استفاده از دستورات ترسیمی روی والد خود رسم می‌شوند. لذا توابع API ویندوز روی آنها کار نکرده و جواب نخواهند داد.



چه راهی پیشنهاد می کنید ؟
باید چی کار کرد ؟