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

مراقبة وكشف ضغطات الماوس

بدأه الشرق الاوسط في 23 يوليو 2011 · 18 رد · 2,511 مشاهدة · في Microsoft Visual Basic.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

اخواني الاعزاء

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

جميعنا يعرف برامج Screen Saver التي تحفظ وتحمي الشاشه

سؤالي هو كيف يمكنني عن طريق الفيجوال بيسك مراقبة وكشف ضغطات الماوس على مستوى الفورم بجميع ما فيه من دوال وكنترولز كما يعمل حافظ الشاشه على مستوت سطح المكتب

؟؟؟

لو استخدمت خاصية MOUSE Down على الفورم فانها سوف تعلمني بما يجري على سطح الفورم فقط ولكن لو ان لدينا صندوق صوره وعملت عليه ماوس كليك فان الفورم لن يعلم بها واذا كان لدينا العديد من صناديق الصور والنصوص فهل من المعقول ان اعمل mouse down لكل كنترول على حده ؟

انا متأكد بان لديكم حل جميل ومختصر فهل تتكرمون علي بالمساعده ولكم جزيل التقدير والامتنان

لايأس مع الحياة ولاحياة مع اليأس

#2

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

اخي ببساطه اجعل اجراء الحدث للكل وذلك باضافة الاحداث للـ Handles جرب الكود التالي

	Private Sub Form1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseDown, PictureBox1.MouseDown, PictureBox2.MouseDown
'Your code 'll be here for all Form,Picture1 and Picture2
	End Sub

.:: Wish to become better and better ::.

#3

اخي الكريم

رائع هذا الحل ولكن ما ازال بحاجة الى ان اضيف جميع الدوال الى حدث mouse down هل هناك طريقه لكشف ضغطة الفأره ولو كانت خارج الفورم ؟

كما هو الحال في برامج حافظ الشاشه

لايأس مع الحياة ولاحياة مع اليأس

#4

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

اخي ممكن توضح سؤالك بالتفصيل؟ لأن شاشة التوقف يكون الفورم ملأ الشاشة!!

.:: Wish to become better and better ::.

#5
VB Helper كتب:

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

اخي ممكن توضح سؤالك بالتفصيل؟ لأن شاشة التوقف يكون الفورم ملأ الشاشة!!

اخي الكريم

المقصود لو قمنا بالضغط على ايقونه موجوده على سطح المكتب وهي بالتأكيد خارج فورم التطبيق فهل يمكن للتطبيق المعمول بالفيجوال بيسك اكتشافها

لايأس مع الحياة ولاحياة مع اليأس

#6

اخيرا وجدت الحل وللفائده اليكم ما وجدت

هذا الكود يكشف اي ضغطة Click للفأره سواء داخل الفورم او خارجها ولا يرتبط بالدوال

Public Class Form1
    Private Declare Function GetAsyncKeyState Lib "user32" (ByVal vkey As Long) As Integer
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Timer1.Enabled = True
        Timer1.Interval = 100
    End Sub
    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        Dim RB As Boolean
        Dim LB As Boolean
        RB = GetAsyncKeyState(Keys.RButton)
        LB = GetAsyncKeyState(Keys.LButton)
        If RB = True Then
            MsgBox("يمين")
        End If
        If LB = True Then
            MsgBox("يسار")
        End If
    End Sub
End Class

وشكرا لكل من ساهم براي ومساعده

لايأس مع الحياة ولاحياة مع اليأس

#7

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

اخي كان سؤالك مش واضح كثير وسألتك سابقا ان شاشة التوقف تكون ملىء الشاشة؟!! المهم انك حصلت الحل .. بالتوفيق ..

.:: Wish to become better and better ::.

#8
الشرق الاوسط كتب:

اخيرا وجدت الحل وللفائده اليكم ما وجدت

هذا الكود يكشف اي ضغطة Click للفأره سواء داخل الفورم او خارجها ولا يرتبط بالدوال

Public Class Form1
    Private Declare Function GetAsyncKeyState Lib "user32" (ByVal vkey As Long) As Integer
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Timer1.Enabled = True
        Timer1.Interval = 100
    End Sub
    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        Dim RB As Boolean
        Dim LB As Boolean
        RB = GetAsyncKeyState(Keys.RButton)
        LB = GetAsyncKeyState(Keys.LButton)
        If RB = True Then
            MsgBox("يمين")
        End If
        If LB = True Then
            MsgBox("يسار")
        End If
    End Sub
End Class

وشكرا لكل من ساهم براي ومساعده

اخي الكريم مشكله هذه الطريقه هو انك تتحقق من حاله ازرار الفاره في لحظه معينه حيث تعتمد على timer لذلك ، من مشاكل هذه الطريقه.

1- تستهلك وقت معالجه من دون فأئده ، اي انك تتحقق ف دقيقه واحده مثلاً 600 مره اذا تم او لم يتم الضغط على زر الفأره.

2- قد يتم الضغط والافلات على ازرار الماوس خلال وقت لم يتم التحقق منه اي انه اقصر من فتره ال timer interval .

انا لا اعتقد ان هذه الطريقه فعاله لعمل ذلك.

#9

يمكنك استخدام ال function التالي:

SetWindowsHookEx

في الحقيقه لم استخدم هذه ال function خارجه بيئه ال API ، لل NET. وجدت الكثير من التحويلات موجوده على www.pinvoke.net

عملت برنامج بسيط سوف يقراء جميع تحركات الماوس سواء الموقع او حاله الازرار . (البعض يستخدم مثل هذه الطرق لاغراض السرقه مثلاً قرائه جميع ضغطات الكيبورد لسرقه الحسابات المصرفيه مثلاً -هذه فقط معلومه )

المثال:

Imports System.Runtime.InteropServices

Public Class Form1
   Dim bmp As Bitmap

   Enum HookType As Integer
      WH_JOURNALRECORD = 0
      WH_JOURNALPLAYBACK = 1
      WH_KEYBOARD = 2
      WH_GETMESSAGE = 3
      WH_CALLWNDPROC = 4
      WH_CBT = 5
      WH_SYSMSGFILTER = 6
      WH_MOUSE = 7
      WH_HARDWARE = 8
      WH_DEBUG = 9
      WH_SHELL = 10
      WH_FOREGROUNDIDLE = 11
      WH_CALLWNDPROCRET = 12
      WH_KEYBOARD_LL = 13
      WH_MOUSE_LL = 14
   End Enum

   Private myCallbackDelegate As HookProc = Nothing

   Private Delegate Function HookProc(ByVal code As Integer, ByVal wParam As IntPtr, ByVal lParam As IntPtr) As Integer

   <DllImport("user32.dll", SetLastError:=True)> _
Private Shared Function SetWindowsHookEx(ByVal hookType As HookType, ByVal lpfn As HookProc, ByVal hMod As IntPtr, ByVal dwThreadId As UInteger) As IntPtr
   End Function
   <DllImport("user32.dll")> _
   Friend Shared Function CallNextHookEx(ByVal hhk As IntPtr, ByVal nCode As Integer, ByVal wParam As IntPtr, ByVal lParam As IntPtr) As Integer
   End Function
   <DllImport("user32.dll")> _
     Public Shared Function GetAsyncKeyState(ByVal vKey As System.Windows.Forms.Keys) As Short
   End Function


   Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
      Me.myCallbackDelegate = New HookProc(AddressOf Me.MyCallbackFunction)
      SetWindowsHookEx(HookType.WH_MOUSE_LL, Me.myCallbackDelegate, IntPtr.Zero, IntPtr.Zero)
   End Sub

   Private Function MyCallbackFunction(ByVal code As Integer, ByVal wParam As IntPtr, ByVal lParam As IntPtr) As Integer
      If (code < 0) Then      
         Return CallNextHookEx(IntPtr.Zero, code, wParam, lParam)
      End If
      If (wParam = 513) Then
         Me.Text = "Left"
      ElseIf (wParam = 516) Then
         Me.Text = "Right"
      End If

      Return CallNextHookEx(IntPtr.Zero, code, wParam, lParam)
   End Function

   Private Sub Form1_Paint(ByVal sender As System.Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint

   End Sub
End Class

حيث انني اقوم بعمل الربط hook في ال Form_load ومن ثمه سوف يتغير عنوان ال form الى left / right بحسب ضغطك على الماوس.

1
#10

أخي الكريم Ali Al-Zyoud

اشكرك من كل قلبي على المساعده جاري تطبيق المثال الرائع

سلمت يداك

لايأس مع الحياة ولاحياة مع اليأس

#11

الحل المطلوب فعلا كما ذكر الأخ على باستخدام الـHooks

النوع WH_MOUSE_LL

هذا موضوع آخر حول الـHooks ربما يفيدك

مراقبة وتعطيل أزرار لوحة المفاتيح

إن قلت قال الله قال رسولـه همزوك همز المنكر المتعالي
أو قلت قد قال الصحابة والألـى تبعاً لهم بالقول والأعمال
أو قلت قـال الشافعي وأحمد و أبو حنيفة والإمام الغالي
صدوا عن وحي الإله ودينـه واحتالوا على حرام الله بالإحلال
يا أمةً لعبت بدين نبيها كتلاعب الصبيان في الأوحال
حاشا رسول الله يحكم بالهوى تلك إذاً حكومة الضلال

feed.1.gif

#12

Ali Al-Zyoud شكرا على الكي لوغر و لكن هل يمكن ان تضيف كود ينسخ ضربات المفاتيح بتاعت الكي بورد الى TextBox

و شكرا

#13
adam master كتب:

Ali Al-Zyoud شكرا على الكي لوغر و لكن هل يمكن ان تضيف كود ينسخ ضربات المفاتيح بتاعت الكي بورد الى TextBox

و شكرا

مثال :

Imports System.Runtime.InteropServices

Public Class Form1

   Private Structure KBDLLHOOKSTRUCT
      Public vkCode As Integer
      Public scanCode As Integer
      Public flags As Integer
      Public time As Integer
      Public dwExtraInfo As IntPtr
   End Structure

   Enum HookType As Integer
      WH_JOURNALRECORD = 0
      WH_JOURNALPLAYBACK = 1
      WH_KEYBOARD = 2
      WH_GETMESSAGE = 3
      WH_CALLWNDPROC = 4
      WH_CBT = 5
      WH_SYSMSGFILTER = 6
      WH_MOUSE = 7
      WH_HARDWARE = 8
      WH_DEBUG = 9
      WH_SHELL = 10
      WH_FOREGROUNDIDLE = 11
      WH_CALLWNDPROCRET = 12
      WH_KEYBOARD_LL = 13
      WH_MOUSE_LL = 14
   End Enum




   Private myCallbackDelegate As HookProc = Nothing

   Private Delegate Function HookProc(ByVal code As Integer, ByVal wParam As IntPtr, ByVal lParam As IntPtr) As Integer

   <DllImport("user32.dll", SetLastError:=True)> _
Private Shared Function SetWindowsHookEx(ByVal hookType As HookType, ByVal lpfn As HookProc, ByVal hMod As IntPtr, ByVal dwThreadId As UInteger) As IntPtr
   End Function
   <DllImport("user32.dll")> _
   Friend Shared Function CallNextHookEx(ByVal hhk As IntPtr, ByVal nCode As Integer, ByVal wParam As IntPtr, ByVal lParam As IntPtr) As Integer
   End Function
   <DllImport("user32.dll")> _
     Public Shared Function GetAsyncKeyState(ByVal vKey As System.Windows.Forms.Keys) As Short
   End Function


   Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
      Me.myCallbackDelegate = New HookProc(AddressOf Me.MyCallbackFunction)
      SetWindowsHookEx(HookType.WH_KEYBOARD_LL, Me.myCallbackDelegate, IntPtr.Zero, IntPtr.Zero)
   End Sub

   Private Function MyCallbackFunction(ByVal code As Integer, ByVal wParam As IntPtr, ByVal lParam As IntPtr) As Integer
      If (code < 0) Then
         Return CallNextHookEx(IntPtr.Zero, code, wParam, lParam)
      End If

      Dim hookStruct As KBDLLHOOKSTRUCT = DirectCast(Marshal.PtrToStructure(lParam, GetType(KBDLLHOOKSTRUCT)), KBDLLHOOKSTRUCT)
      Dim pressedKey As Keys = hookStruct.vkCode
      Me.Text = pressedKey.ToString()
      Return CallNextHookEx(IntPtr.Zero, code, wParam, lParam)
   End Function
End Class
#14

مش فاهم اخي

ممكن تعطيني هذا الكود و لكن تعدلو بحيث يضع جميع ضربات المفاتيح keystrokes في textbox

#15
adam master كتب:

مش فاهم اخي

ممكن تعطيني هذا الكود و لكن تعدلو بحيث يضع جميع ضربات المفاتيح keystrokes في textbox

تعديل المثل لنسخ على textbox بسييييييييييييييييييييييييييييييييييط جددددددددددددددددددددداً

المهم ان تفهم مالذي عملناه دون البحث عن حل مباشر فقط.

هذا الجزء الذي يحتوي على البيانات

 Me.Text = pressedKey.ToString()

فقط بدلها الى

 textbox1.Text = pressedKey.ToString()

المهم ان تفهم ما الذي عملناه

#16

وهذا برنامج لتوضيح الفكره وتسهيل العمل:

ReadKeys.rar

تم تعديل هذه المشاركة بواسطة Ali Al-Zyoud في 3 أغسطس 2011 في 15:03

#17

اخي انا حملت البرنامج و لكن لم يعمل ..

و سبق و جربت الطريقة هذي :

Me.Text = pressedKey.ToString() الى textbox1.Text = pressedKey.ToString()

و لم يعمل

#18
adam master كتب:

اخي انا حملت البرنامج و لكن لم يعمل ..

و سبق و جربت الطريقة هذي :

Me.Text = pressedKey.ToString() الى textbox1.Text = pressedKey.ToString()

و لم يعمل

"لم يعمل!!!!!"

ماذا تتوقع ان استطيع ان اساعدك اذا لم تحدد الخطاء.

ما ادراني معنى لم يعمل ، هل تقصد compile error او runtime error او لم يظهر شيء او ............

#19
Ali Al-Zyoud كتب:

"لم يعمل!!!!!"

ماذا تتوقع ان استطيع ان اساعدك اذا لم تحدد الخطاء.

ما ادراني معنى لم يعمل ، هل تقصد compile error او runtime error او لم يظهر شيء او ............

اسف اخي اذا لم احدد لك الخطا ...!!!

و لكن حقيقة لم يكن هناك اي خطا برمجي اي لم يكن هناك compile error او runtime error بل اشتغل البرنامج بنجاح و لكن البرنامج لم يسجل ضربات مفاتيح الكي بورد (keyboard strokes)

و لا اعرف السبب!!

و شكرا على مساعداتك الدائمة.

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