الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

SetWindowLong لا يعمل مع نوافذ خارج التطيبق

مغلق
بدأه n-o-u-r في 2 مارس 2007 · 2 رد · 473 مشاهدة · في Microsoft Visual Basic.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم ورحمة الله وبركاته

احاول الحصول على تابع نافذة باستخدام SetWindowLong وكانت هذه الشيفرة على أيام VB6 تعمل بشكل جيد أما الان

فلا تعمل الا على نافذة ضمن التطبيق أو برنامج مصنوع بالدت نت

هل من أحد يعلم شي عن الموضوع علما اني بحثت كثيرا في المنتدى ولم أعثر على شي

Imports System.Runtime.InteropServices
PublicClass Main
'---------------------------------------------------------------------------------
PrivateDeclareFunction SetWindowLong Lib"user32.dll"Alias _
"SetWindowLongA" (ByVal hwnd AsInteger, ByVal nIndex AsInteger, ByVal dwNewinteger AsInteger) AsInteger
'---------------------------------------------------------------------------------
PrivateDeclareFunction FindWindow Lib"user32.dll"Alias _
"FindWindowA" (ByVal lpClassName AsString, ByVal lpWindowName AsString) AsInteger
'---------------------------------------------------------------------------------
PrivateDeclareFunction CallWindowProc Lib"user32.dll"Alias _
"CallWindowProcA" (ByVal lpPrevWndFunc AsInteger, ByVal hwnd AsInteger, ByVal msg AsInteger, ByVal wParam AsInteger, ByVal lParam AsInteger) AsInteger
'---------------------------------------------------------------------------------
PrivateConst GWL_WNDPROC AsInteger = -4
'---------------------------------------------------------------------------------
PublicDelegateFunction Proc _
(ByVal hwnd As IntPtr, ByVal msg AsInteger, _
ByVal wparam AsInteger, ByVal lparam AsInteger) AsInteger
'---------------------------------------------------------------------------------
PrivateSub Form1_FormClosing(ByVal sender AsObject, _
ByVal e As System.Windows.Forms.FormClosingEventArgs) HandlesMe.FormClosing
SetWindowLong(hwnd, GWL_WNDPROC, PrevProc)
EndSub
'---------------------------------------------------------------------------------
Dim hwnd As IntPtr
PrivateSub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) _
HandlesMyBase.Load
Dim ProcDel AsNew Proc(AddressOf WindProc)
' Now try to change the next line to
'hwnd = me.handle
'or make another application with .NET with any Form it will works
'hwnd = FindWindow(vbNullString, "Form1")
hwnd = FindWindow(vbNullString, "Calculator")
PrevProc = SetWindowLong(hwnd, GWL_WNDPROC, _
Marshal.GetFunctionPointerForDelegate(ProcDel))
EndSub
'---------------------------------------------------------------------------------
Dim PrevProc AsInteger
'---------------------------------------------------------------------------------
PublicFunction WindProc(ByVal hwnd As IntPtr, _
ByVal msg AsInteger, ByVal wparam AsInteger, ByVal lparam AsInteger) AsInteger
Debug.Print(msg.ToString)
Return CallWindowProc(PrevProc, hwnd, msg, wparam, lparam)
EndFunction
EndClass
#2

الكود الموجود هنا فيه العديد من الأخطاء وخاصة في موضوع التحويل من VB6 إلى الدوت نيت حاول مراجعة المواضيع المتعلقة بتحويل الأكواد إلى الدوت نيت

وإن واجهت مشكلة قم بإرفاق مشروع يعمل جيدا بـ VB6 كي نحاول تحويله بشكل صحيح إلى الدوت نيت

عن عائشة رضي الله عنها أن النبي صلى الله عليه وسلم قال: إن الله يحب إذا عمل أحدكم عملا أن يتقنه

نعيب زماننا والعيب فينا ... وما لزماننا عيب سوانا

ونهجو ذا الزمان بغير ذنب ... ولو نطق الزمان لنا هجانا

محمد سامر أبو سلو

#3

شكرا لك اخ سامر

ولكن هذا الكود هو كل ما أريد فعله مع العلم انني نسخته من مشروع دوت نت ولم الحظ اي خطأ

او قد يكون هذا خطا في النسخ.

على كل حال لقد بحثت في منتدى أجنبي واخبرني احدهم ان هذا التابع يتطلب الوصول الى عملية اخرى في النظام Proccess

وهذا غير مسموح في الدوت نت او يتطلب توابع اخرى

وانني اذا اردت القيام بعملية السوب كلاسينك SubClassing لنوافذ ضمن المشروع فان كل ما علي هو

الهيمنة على التابع WndProc لكل نافذة

Protected Overrides WndProc(.....) .....الخ

لكنني اعلم هذه الطريقة واريد طريقة الحصول على رسائل اي نافذة في النظام وتعديلها على غرار برنامج Spy++

الذي يأتي مع مجموعة الدوت نت.

هذا الموضوع مغلق.

مواضيع مشابهة