AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Wie kann ich Tastaturaktionen über meine Anwendung loggen?

Wie kann ich Tastaturaktionen über meine Anwendung loggen?

Ein Thema von cckLoud · begonnen am 20. Sep 2021 · letzter Beitrag vom 22. Sep 2021
Antwort Antwort
cckLoud

Registriert seit: 19. Nov 2020
Ort: Worms
33 Beiträge
 
Delphi 10.3 Rio
 
#1

Wie kann ich Tastaturaktionen über meine Anwendung loggen?

  Alt 20. Sep 2021, 13:43
Hallo,

ich möchte für meine Anwendung eine Zeit"uberwachung" bauen. Da da ein heikles Thema ist, hier eine kurze Erklärung:

Mit meinem Programm werden Gutachten erstellt. Und manchmal rechnet der Gutachter nach Aufwand ab. Dsher wäre es nützlich für ihn, die Zeit, die er dazu am Rechner verbracht hat, nachzuweisen. Das könnte man einfach machen, indem man die Zeit aufzeichnet, in der das Gutachten "aktiv" ist - also einfach beim "Laden" Zeit merken und wen er das Programm beendet oder ein anderes Gutachten aufruft die Endezeit merken. Das ist aber nicht sehr hilfreich, da Pausen, oder wenn der Rechner nachts anbleibt usw. hier nicht berücksichtigt werden. Da könnte es dienlich sein, einfach zu schauen, wenn er was über die Tastatur eingibt und die Zeiterfassung darauf zu basieren.

Tastendrücke für ein Form abzufangen ist einfach (KeyPreview), das nutze ich mehrfach im Projekt. Wie aber sieht das aus, wenn mehrere Forms involviert sind (im Projekt um die 300) und Eingaben von jedem Form möglich sind? Muss ich da über Hooks gehen (die (möglicherweise) alle Tastaturereignisse auf dem Rechner reagiert?
Klaus Kaiser
  Mit Zitat antworten Zitat
freimatz

Registriert seit: 20. Mai 2010
1.032 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#2

AW: Wie kann ich Tastaturaktionen über meine Anwendung loggen?

  Alt 20. Sep 2021, 14:07
Idee:
https://docwiki.embarcadero.com/Libr...tion.OnMessage
Und da Keybaord-Ereignisse filtern.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
38.723 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: Wie kann ich Tastaturaktionen über meine Anwendung loggen?

  Alt 20. Sep 2021, 14:27
Delphi-Referenz durchsuchenTApplicationEvents

MSDN-Library durchsuchenWM_KEYDOWN
WM_KEYUP
usw.



bzw. siehe LastUserInput
MSDN-Library durchsuchenGetLastInputInfo
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014

Geändert von himitsu (20. Sep 2021 um 14:31 Uhr)
  Mit Zitat antworten Zitat
cckLoud

Registriert seit: 19. Nov 2020
Ort: Worms
33 Beiträge
 
Delphi 10.3 Rio
 
#4

AW: Wie kann ich Tastaturaktionen über meine Anwendung loggen?

  Alt 20. Sep 2021, 14:59
Danke, auf TApplicationEvents bin ich nicht gestossen! Das könnte der Weg sein...
Klaus Kaiser
  Mit Zitat antworten Zitat
cckLoud

Registriert seit: 19. Nov 2020
Ort: Worms
33 Beiträge
 
Delphi 10.3 Rio
 
#5

AW: Wie kann ich Tastaturaktionen über meine Anwendung loggen?

  Alt 21. Sep 2021, 05:18
Ja, das hat funktioniert. Ich habe das ganze in ein Objekt ausgelagert, das ich im Create des Main-Forms anlege (mit glbKeyLog := TKeyLog.Create. Aktiviert wird das ganze mit "glbKeyLog.Active := true;".

Hier die Unit (das mit dem Timer ist, damit die Messagebearbeitung nicht durch die Bearbeitungslogik unterbrochen wird):

Code:
unit KeyLog;

interface
uses Vcl.Forms, Vcl.ExtCtrls, windows, messages, SysUtils;
type
   TKeyLog = class(TObject)
   private
      fActive: boolean;
      Timer: TTimer;
      Key: word;

      procedure OnTimer(Sender: TObject);
      procedure Process;
      procedure AppMessage(var Msg: TMsg; var Handled: Boolean);
   public
      constructor Create;
      property Active: boolean read fActive write fActive;
end;
var glbKeyLog: TKeyLog;
implementation

{ TFrameGebDatenGebaeude }

procedure TKeyLog.AppMessage(var Msg: TMsg; var Handled: Boolean);
begin
   if not fActive then
      exit;
// Geht beides, WM_KeyDown und WM_KEYUP
//   if Msg.message = WM_KeyDown then begin
   if Msg.message = WM_KEYUP then begin
      Key:=Msg.wParam;
      Timer.Enabled := true;
   end;
end;

constructor TKeyLog.Create;
begin
   fActive := false;
   Timer := TTimer.Create(Application);
   Timer.Interval := 1;
   Timer.OnTimer := OnTimer;
   Timer.Enabled := false;
   Application.OnMessage := AppMessage;
end;

procedure TKeyLog.OnTimer(Sender: TObject);
begin
   Timer.Enabled := false;
   Process;
end;

procedure TKeyLog.Process;
begin
   Application.MessageBox(pwidechar('Keystroke ' + chr(Key)), '');
end;

end.
Klaus Kaiser
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
1.916 Beiträge
 
Delphi 7 Professional
 
#6

AW: Wie kann ich Tastaturaktionen über meine Anwendung loggen?

  Alt 21. Sep 2021, 10:16
Für den Fall, dass in Application.OnMessage schon was drinne stehen sollte, geht Dir das bei Deiner Implementierung verloren.

Damit Du unabhängiger wirst, speichere Dir doch den Inhalt von Application.OnMessage doch im Create in 'ner Variabel (fAppMessage oder so) und rufe die Routine dann in TKeyLog.AppMessage auf. Ungetestet sowas in der Art:
Delphi-Quellcode:
procedure TKeyLog.AppMessage(var Msg: TMsg; var Handled: Boolean);
begin
   if not fActive then begin
     if Assigned(fAppMessage) then fAppMessage(Msg, Handled);
     exit;
   end;
// Geht beides, WM_KeyDown und WM_KEYUP
// if Msg.message = WM_KeyDown then begin
   if Msg.message = WM_KEYUP then begin
      Key := Msg.wParam;
      Timer.Enabled := true;
   end;
   if Assigned(fAppMessage) then fAppMessage(Msg, Handled);
end;
  Mit Zitat antworten Zitat
cckLoud

Registriert seit: 19. Nov 2020
Ort: Worms
33 Beiträge
 
Delphi 10.3 Rio
 
#7

AW: Wie kann ich Tastaturaktionen über meine Anwendung loggen?

  Alt 21. Sep 2021, 15:38
Warum sollte da was verloren gehen, was meinst du damit? "Handled" ist auf false, also geht die Message weiter (erfolgreich bestätigt). Und ich brauche bei meinem Problem eigentlich nur die Zeit, zu der die Taste gedückt wurde. Und da kommt es auf ein paar Milisekunden auch nicht an, die der Timer-Event braucht, um durch die Message.Schleife zu kommen...
Klaus Kaiser
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
1.916 Beiträge
 
Delphi 7 Professional
 
#8

AW: Wie kann ich Tastaturaktionen über meine Anwendung loggen?

  Alt 21. Sep 2021, 16:03
Wenn irgendwo im Programm eine Zuweisung der Art Application.OnMessage := EineOnMessageRoutine; erfolgte und Du machst später in Deinem constructor TKeyLog.Create; dann diese Zuweisung Application.OnMessage := AppMessage; , so wird die Routine EineOnMessageRoutine niemals beim Ereignis OnMessage aufgerufen werden und geht Dir damit verloren.

Es mag sein, dass das im konkreten Fall irrelevant ist, aber halt einfach zu prüfen, ob schon was zugewiesen wurde und das dann auch aufzurufen, ist nicht der große Aufwand, eventuell durch den Nichtaufruf auftretende Seiteneffekte zu erkennen und zu beheben, dürfte deutlich aufwändiger sein.
  Mit Zitat antworten Zitat
cckLoud

Registriert seit: 19. Nov 2020
Ort: Worms
33 Beiträge
 
Delphi 10.3 Rio
 
#9

AW: Wie kann ich Tastaturaktionen über meine Anwendung loggen?

  Alt 21. Sep 2021, 18:53
Ja, ok, das ist aber klar. Wenn du eine Ereignisroutine überschreibst, dann kommt halt nur die letzte dran. Aber sowas ist halt normales Programmiergeschäft. Und da man sich hier abspricht, bzw., wie bei mir, allein programmiert und dabei (hoffentlich! ) den Überblick behält, das tägliches Projekthandling.

Bei mir ist es als Entertainer tatsächlich einfacher, da ich WEISS, das der Event nirgends sonst benutzt wird!
Klaus Kaiser
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
38.723 Beiträge
 
Delphi 10.4 Sydney
 
#10

AW: Wie kann ich Tastaturaktionen über meine Anwendung loggen?

  Alt 22. Sep 2021, 12:12
Wie gesagt, nicht Application.OnMessage sondern TApplicationEvents.OnMessage verwenden.

Denn wenn du deinen TKeyLog mehrmahls erstellst oder jemand Anderes (z.B. Fremdkomponente oder eine andere Stelle, die du schonwieder vergessen hast),
dann blockiert/überschreibt man sich selber.


An Application.OnMessage kann sich nur Einer gleichzeitig dranhängen.
TApplicationEvents kann aber mehrmals verwendet werden.
z.B. auf eine/mehrere Forms eine/mehrere TApplicationEvents drauf oder eben Mehrere davon mit Create selbst erstellen.


da ich WEISS, das der Event nirgends sonst benutzt wird!
Und dann nutzt du von jemand Anderem eine Komponente oder Codestück
und jener Entwickler dachte genau das Gleiche.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014

Geändert von himitsu (22. Sep 2021 um 12:27 Uhr)
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:05 Uhr.
Powered by vBulletin® Copyright ©2000 - 2021, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf