Re: Mausbewegung und Tastendruck des Benutzers aufzeichnen.



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 Sub

Jetzt 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
.



Relevant Pages

  • Re: VB6 Source auf fremden Rechner.
    ... Programm starte es kommt zum Fehler. ... Ist dies eine Prozedur, die auch wieder von einer anderen Prozedur ... Private Sub AnySub(Value As Double) ...
    (microsoft.public.de.vb)
  • Re: Mausbewegung und Tastendruck des Benutzers aufzeichnen.
    ... > Mir geht es nicht darum, Mausbewegungen und Tastenanschläge vom ... > geschrieben wie der Fehler aufgetreten ist. ... > Programm aufzuzeichnen. ... welcher Prozedur, welche Art von Fehler aufgetreten ist. ...
    (microsoft.public.de.vb)
  • Re: Laufzeitfehler 3633
    ... der auslösenden Prozedur bis hin zu der Prozedur in ... Fehler per On Error GoTo Fehlermarke, ... Mit der richtigen Fehlerbehandlung ist aber auch ein solch ... Fehlerbehandlung ein Programm hat. ...
    (microsoft.public.de.vb.datenbank)
  • Re: Fehlermeldung: Microsoft Office Access-Information zur Datensatzsperrung ??
    ... Dim WS As DAO.Workspace ... Du hast doch geschrieben dass Dein Programm ein VB6-Programm ist. ... Messagebox eine Fehlermeldung mit Err.Number und Err.Description ... Fehler, erweitern Err.source um den eigenen Modul- und Prozedurnamen ...
    (microsoft.public.de.vb.datenbank)
  • Re: saubere Klassenmethode für Datenbankzugriff
    ... > ja die GUI entscheiden sollte, was sie mit nem Fehler macht. ... nicht die Prozedur in Deinem Klassenmodul sollte eine Fehlermeldung ... With Err ... End Sub ...
    (microsoft.public.de.vb.datenbank)