Tastatur als Quelle erkennen

08/04/2009 - 11:29 von Rebecca Hensch | Report spam
Hallo zusammen,

ist es möglich in meinem Programm auszuwerten ob ein Tastendruck (z.B. ein
"A") durch eine SendKeys-Anweisung gesandt wurde, oder ob tatsàchlich die
Tastatur(eingabe) die Quelle des Inputs ist?

Grüße!
 

Lesen sie die antworten

#1 Thorsten Doerfler
09/04/2009 - 12:33 | Warnen spam
Rebecca Hensch schrieb:
ist es möglich in meinem Programm auszuwerten ob ein Tastendruck (z.B. ein
"A") durch eine SendKeys-Anweisung gesandt wurde, oder ob tatsàchlich die
Tastatur(eingabe) die Quelle des Inputs ist?



Eine 100%ige Information kann man darüber soweit ich weiß nicht
erhalten. Annàhernd aussagekràftig könnte die Auswertung der Zeit sein,
seit der letzten Eingabe. Diese Info bekommt man über die API Funktion
GetLastInputInfo. Bei der nativen Eingabe ist die Differenz zwischen
letzter Eingabe und Änderung im Control nahezu null.

' InputInfo.vb
Imports System.Runtime.InteropServices

Public Class InputInfo
<StructLayout(LayoutKind.Sequential)> _
Private Structure LASTINPUTINFO
<MarshalAs(UnmanagedType.U4)> _
Public cbSize As Integer
<MarshalAs(UnmanagedType.U4)> _
Public dwTime As Integer
End Structure

<DllImport("user32.dll")> _
Private Shared Function GetLastInputInfo( _
ByRef plii As LastInputInfo _
) As Boolean
End Function

Public Shared ReadOnly Property IsAutomated() As Boolean
Get
Return LastInputTicks > 100
End Get
End Property

Public Shared ReadOnly Property LastInputTicks() As Integer
Get
Dim lLII As New LASTINPUTINFO

lLII.cbSize = Marshal.SizeOf(lLII)
lLII.dwTime = 0

If GetLastInputInfo(lLII) Then
Return Environment.TickCount - lLII.dwTime
End If
End Get
End Property
End Class

Zum Demonstrieren:

' Form1.vb
' Enthàlt eine TextBox und einen Timer
Public Class Form1

Private Sub Form1_Load(ByVal sender As Object, _
ByVal e As System.EventArgs _
) Handles Me.Load
Timer1.Interval = 5000
Timer1.Enabled = True
End Sub

Private Sub TextBox1_TextChanged(ByVal sender As System.Object, _
ByVal e As System.EventArgs _
) Handles TextBox1.TextChanged
Debug.Print(InputInfo.IsAutomated.ToString)
End Sub

Private Sub Timer1_Tick(ByVal sender As System.Object, _
ByVal e As System.EventArgs _
) Handles Timer1.Tick
Debug.Print("SendKeys")
SendKeys.Send("Test")
End Sub
End Class

Làsst sich allerdings recht leicht "überlisten" indem man die Maus
stàndig in Bewegung hàlt, da leider keine Differnzierung zwischen
Keyboard und Maus stattfindet. Vielleicht reicht Dir das aber als Ansatz.

Thorsten Dörfler
Microsoft MVP Visual Basic

vb-hellfire visual basic faq | vb-hellfire - einfach anders
http://vb-faq.de/ | http://www.vb-hellfire.de/

Ähnliche fragen