Re: Mausbewegung und Tastendruck des Benutzers aufzeichnen.
- From: Thomas Wendt <no_spam_thomaswendt@xxxxxx>
- Date: Mon, 11 Jul 2005 21:23:21 +0200
Peter Götz schrieb:
Hallo Thomas,
Ich möchte, das in meinem Programm die Mausbewegungen und Tastendrücke aufgezeichnet werden.
Mir geht es nicht darum, Mausbewegungen und Tastenanschläge vom Betriebssystem oder anderen Programmen aufzuzeichnen. Denn eine Antwort hätte ich dafür ja eh nicht bekommen. :-)
Hintergrund der ganzen Sache ist: Sporadisch entstehen Fehler auf dem Kunden-Rechner, die ich auf meinem Rechner nicht nachvollziehen kann. Und wenn der Fehlerbericht dann per Email gesendet wird, wird nir dazu geschrieben wie der Fehler aufgetreten ist. Zum Beispiel einen Kunden gelöscht. Einen bestehenden Kunde geändert.
Usw...
Daher kam mir der Gedanke, Mausbewegungen und Tastenanschläge im Programm aufzuzeichnen.
"einen Kunden gelöscht", "einen bestehenden Kunden geändert" usw. lässt mich an Datenbankzugriffe denken. Liege ich da richtig?
Wenn ja, stellt sich die Frage, was hat das mit Mausbewegungen und/oder Tastendrücken zu tun?
Diese Aufzeichnung will ich dann automatisch nachvollziehen lassen. So als ob der Benutzer diese Eingaben macht.
Unter der Voraussetzung dass Du Fehlermeldungen haben willst, die Dir sagen an welcher Stelle, bzw. in welchem Modul und welcher Prozedur welche Art von Fehler aufgetreten ist, bist Du mit mit dem Nachvollziehen von Mausbewegungen und Tastendrücken wohl ziemlich auf dem Holzweg.
Aber nur wie? Die Ereignisse MouseDown, MouseMove, MouseUp, KeyDown, KeyPress und KeyUp kommen dafür in Frage.
Wir groß wird dann die Datei wenn ich alle Mausbewegungen aufzeichne.
Für jede Mausbewegung, also jedes MouseMove-Ereignis fallen jeweils 2 Werte vom Typ Single für die jeweilige Maus-Position (X und Y) an. Je nachdem wie oft und wie lange der Benutzer seine Maus bewegt, kann da schon einiges an Daten anfallen.
Alle Tastenanschläge aufzeichne.
Auch das ist sehr relativ. Kommt halt auch darauf an, was der Benutzer den lieben langen Tag so mit Deinem Programm macht.
Gut. Ich kann ja die Logdatei bei jedem neuen Programmstart löschen.
Und wenn das Programm am 1. Januar gestartet wird und ohne Unterbrechung z.B. bis Ende Dezember läuft, was dann?
Aber wie kann ich die Zeitverzögerung, die zum Beispiel beim Tippen auftritt protokollieren?
Oder die Zeitverzögerung beim Mausschieben bis zum nächstem Klick?
Und was ist evtl. noch alles zu beachten?
s.oben, ich denke Du bist da völlig auf dem Holzweg, wenn es darum geht, für jeden erdenklichen und vor allem auch die "nicht erdenklichen" Fehler eine saubere Fehlermeldung zu bekommen, welche Dir sagt, in welchem Modul und welcher Prozedur, welche Art von Fehler aufgetreten ist.
Ein lückenlose Fehlerüberwachung erreichst Du mit folgendem Prinzip:
Subs/Functions in Modulen, Klassenmodulen oder Formmodulen, die selbst von anderen Prozeduren aufgerufen werden, erkennen einen Fehler und geben den Fehler, ergänzt um Modulname und Prozedurname an die aufrufende Prozedur weiter:
Private Const mModName as String = "MeinModulName"
Private Sub AnySub(ParX as Integer ) Const Prozname as String = "AnySub" On Error goto Fehler ... blablabla zu überwachender Code ... blablabla zu überwachender Code ... blablabla zu überwachender Code Exit Sub Fehler: With Err .Source & "; " & mModName & "." & Prozname & _ "(" & cStr(ParX) & ")"
.Raise .Number, .Source, .Description, _ .HelpFile, .HelpContext End With End Sub
Ist die aufrufende Prozedur wieder eine, welche von einer anderen aufgerufen wurde, verfährt sie genauso und gibt den Fehler weiter an den Aufrufer. Das kann über mehrere Prozeduren so gehen. Jede dieser Prozeduren erkennt den Fehler, hängt an Err.Source den eigenen Modul- und Prozedurnamen (evtl. erweitert um die Werte von Parametern) und reicht den Fehler per Err.Raise weiter an den Aufrufer.
Prozeduren der obersten Ebene, wie z.B. eine Command_Click-Prozedur, erkennen ebenfalls den Fehler und geben in ihrer Fehlerroutine eine Fehlermeldung aus und/oder schreiben in eine Logdatei bzw. rufen einen zentralen Errorhandler, der Meldungen ausgibt, Einträge in eine Logdatei schreibt, E-Mails mit Fehlerinformationen aufbereitet usw.
Private Sub Command1_Click() dim strMsg as String
On Error goto Fehler ... blablabla zu überwachender Code ... blablabla zu überwachender Code ... blablabla zu überwachender Code Ausgang: ...evtl Aufräumcode Exit Sub Fehler: With Err strMsg = "Fehler: " & cstr(.Number) & vbCrLf & _ "Source: " & .Source & vbcrlf & _ .Description End With msgBox strMsg, vbExclamation Resume Ausgang End Sub
Statt eine MsgBox aufzurufen, wird man in echten Programmen einen zentralen Errorhandler aufrufen, der dann Meldungen für den Benutzer ausgibt, Einträge in eine Logdatei macht, eine E-Mail mit Fehlerinformationen aufbereitet usw. In err.Source kann so der gesamte Weg, den das Programm vom Auslöser (hier Command1_Click) bis zu der Prozedur in welcher der eigentliche Fehler ausgelöst worden ist, nachverfolgt werden. Mit dieser Information und den evtl. noch zusätzlich zu den Prozedurnamen gelieferten Werten der übergebenen Parameter ist es in aller Regel dann nur noch eine Sache von wenigen Minuten, die wirkliche Fehlerursache zu erkennen und zu beheben.
Die praktische Anwendung dieses Prinzips kannst Du Dir in dem Beispielprogramm
www.gssg.de -> Visual Basic -> VBclassic -> Datenbank -> ADODemoMU2002
ansehen.
Hallo Peter
Ja, es handelt sich um eine Datenbankanwendung (ADO).
In dieser Anwendung gibt es ein Modul mit folgendem Aufbau: (Fehlerbehandlung habe ich hier im Posting weggelassen!)
Public Sub OpenRecordset(rst As ADODB.Recordset, strSQL As String)
Set rst = New ADODB.Recordset
Set rst.ActiveConnection = connDatabase
With rst
.Source = strSQL
.CursorLocation = adUseClient
.CursorType = adOpenStatic
.LockType = adLockOptimistic
.Open
End With
End SubJetzt muss ich selber lachen. Nein, nicht über mich. Ich habe das Programm zur Wartung und Erweiterung bekomen.
Ich habe den Header der Sub folgendermaßen abgeändert: Public Sub OpenRecordset(ByRef rst As ADODB.Recordset, strSQL As String)
Die Zeile Set rst = New ADODB.Recordset habe ich rausgeschmissen.
Denn der vor dem Aufruf der Prozedur OpenRecordset steht immer: strSQL = "SELECT * FROM Tabelle" Set rstKunden = New ADODB.Recordset OpenRecordset rstKunden, strSQL Wobei rstKunden auch abweichen kann.
Bei einer neuen Kompilierung und einer Ausführung des Programmes kam diese Fehlermeldung:
Laufzeitfehler '3704': Der Vorgang ist für ein geschlossenes Objekt nicht zugelassen.
Nun war mirt einiges klar, das dass Programm durch Zufall funktioniert hat.
denn in einem Formular gab es den Eintrag:
Dim rst as ADODB.Recordset.
Und in diesem Formular gab es auch ab und zu, nicht immer, eine Fehlermeldung.
Ergo. Jetzt werde ich, soweit ich die Zeit habe, mal den ganzen Quellcode durchsehen.
Aber ich glaube ich werde eher weitere auftretende Fehler beseitigen.
Nach dem Motto: Try and Error. :-(
Gruß Thomas Wendt .
- Follow-Ups:
- Re: Mausbewegung und Tastendruck des Benutzers aufzeichnen.
- From: Peter Götz
- Re: Mausbewegung und Tastendruck des Benutzers aufzeichnen.
- From: Peter Fleischer
- Re: Mausbewegung und Tastendruck des Benutzers aufzeichnen.
- References:
- Mausbewegung und Tastendruck des Benutzers aufzeichnen.
- From: Thomas Wendt
- Re: Mausbewegung und Tastendruck des Benutzers aufzeichnen.
- From: Peter Götz
- Mausbewegung und Tastendruck des Benutzers aufzeichnen.
- Prev by Date: Re: Programmunterbrechung
- Next by Date: Re: Mausbewegung und Tastendruck des Benutzers aufzeichnen.
- Previous by thread: Re: Mausbewegung und Tastendruck des Benutzers aufzeichnen.
- Next by thread: Re: Mausbewegung und Tastendruck des Benutzers aufzeichnen.
- Index(es):
Relevant Pages
|