Autor |
Beitrag |
holger
      
Beiträge: 46
W2K pro, XP pro
Delphi 6, Delphi 2007
|
Verfasst: Sa 08.05.10 22:55
Guten Abend,
ich bin auf der Suche nach einer einfachen Funktion, welche erkennt wenn keine Taste gedrückt ist.
Problem:
Ein im Hintergrund laufendes Programm soll z.B. auf CTRL + U reagieren ( geht mit RegisterHotKey). Daraufhin wird u.A. ein Text in der Zwischenablage deformatiert (geht auch). Nun wird der Inhalt der Zwischenablage in das aktuell aktive Fenster eingefügt.
Delphi-Quelltext 1: 2: 3: 4:
| keybd_event(86,0,KEYEVENTF_EXTENDEDKEY,MOD_CONTROL); keybd_event(86,0,KEYEVENTF_KEYUP,MOD_CONTROL); |
Soweit klappt alles.
Will ich aber auf z.B ALT + U (Tastenkombination soll frei deffinierbar sein) reagieren funktioniert das STRG + V nicht mehr.
In diesem Fall kommt eine Mischung aus der real (noch) betätigten ALT-Taste und der virtuell gesendeten STRG-Taste an.
Desshalb will ich vor dem
Delphi-Quelltext 1: 2:
| keybd_event(86,0,KEYEVENTF_EXTENDEDKEY,MOD_CONTROL); |
darauf warten, daß keine Taste mehr gedrückt ist.
Ich könnte jetzt das 256Byte große Array von GetKeyboardState auswerten.
Aber das gestaltet sich etwas schwierig.
Wahrscheinlich gibts auch was ganz Einfaches.
Kennt jemand eine Lösung wie z.B. keypressed in alten Dos-Zeiten.
Vielen Dank im Voraus
Holger
|
|
ConditionZero
      
Beiträge: 190
Win XP
Delphi 7 PE, C++ (Dev-C++), HTML+PHP (Dreamweaver MX), JavaScript(MS FrontPage)
|
Verfasst: So 09.05.10 04:52
Moin,
holger hat folgendes geschrieben : |
Delphi-Quelltext 1: 2: 3: 4:
| keybd_event(86,0,KEYEVENTF_EXTENDEDKEY,MOD_CONTROL); keybd_event(86,0,KEYEVENTF_KEYUP,MOD_CONTROL); |
|
Du willst doch auf das KeyPressed-Ereignis eingehen, richtg? Wozu simulierst du dann Tastendrücke?
Der Benutzer soll doch dann später Hotkeys benutzen können, und auf die möchtest du gerade eingehen oder habe ich da jetzt was falsch verstanden?
holger hat folgendes geschrieben : |
Kennt jemand eine Lösung wie z.B. keypressed in alten Dos-Zeiten.
|
Du meinst dann die Keyboard-Events. Da gibt es einmal Form1.OnKeyDown, dann noch Form1.OnKeyUp und zu guter letzt Form1.OnKeyPressed. Der Name spricht ja für sich  .
In allen drei Events gibts eine Variable Key vom Typ Char (außer im OnKeyPressed, da vom Typ Word). Durch eine simple if-Abfrage lässt sich da auf einzelne Tastendrücke und/oder Tastenkombinationen eingehen. Für Tasten wie Strg brauchst du die jeweiligen VIRTUELLEN TASTENCODES.
Wenn ich mich recht erinnere liefert Delphi sogar ein Objekt THotkey mit, das könntest dir auch mal anschauen. Delphi-Hilfe kann da sicher helfen.
Grüße
ConditionZero
|
|
jaenicke
      
Beiträge: 19314
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: So 09.05.10 08:37
Das hast du falsch verstanden: Es geht nicht darum, dass innerhalb eines Fensters eines Delphiprogramms darauf reagiert wird sondern global, wenn die Tastenkombination gedrückt wird. Und dann soll das Delphiprogramm etwas machen und danach Strg + V simulieren um den Text in das aktuelle Programm einzufügen.
Und er möchte jetzt vorher warten bis die Tasten, die den mit RegisterHotkey eingetragenen Hotkey ausgelöst haben, wieder losgelassen sind. Dafür sollten GetKeyState bzw. GetAsyncKeyState die richtigen Funktionen sein.
|
|
ConditionZero
      
Beiträge: 190
Win XP
Delphi 7 PE, C++ (Dev-C++), HTML+PHP (Dreamweaver MX), JavaScript(MS FrontPage)
|
Verfasst: So 09.05.10 10:28
Ok, verstehe. Wobei mir noch immer ein Rätsel ist, warum mit den keybd_events ein Zwischenschritt eingelegt wird. Momentan ist: Strg+X wird gedrückt -> Event X wird ausgelöst, darin wird Strg+X im Programm geklickt -> Das OnKeyPressed-Event springt an. Könnte man doch auch direkt machen...)
Ansonsten gibts in der DL einen guten Thread dazu, dort wird mit ReigsterHotkey(); gearbeitet: www.delphi-library.d...rbeiten_19371,0.html
Grüße
ConditionZero
|
|
jaenicke
      
Beiträge: 19314
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: So 09.05.10 10:44
ConditionZero hat folgendes geschrieben : | warum mit den keybd_events ein Zwischenschritt eingelegt wird |
Das ist kein Zwischenschritt. Damit wird am Ende im Zielprogramm Strg + V simuliert um den Text aus der Zwischenablage dort einzufügen. Und genau das klappt nicht solange der aktuelle Hotkey noch auf der echten Tastatur gedrückt ist.
Das Delphiprogramm wird nie überhaupt sichtbar.
|
|
ConditionZero
      
Beiträge: 190
Win XP
Delphi 7 PE, C++ (Dev-C++), HTML+PHP (Dreamweaver MX), JavaScript(MS FrontPage)
|
Verfasst: So 09.05.10 14:48
jaenicke hat folgendes geschrieben : | ConditionZero hat folgendes geschrieben : | warum mit den keybd_events ein Zwischenschritt eingelegt wird | Das ist kein Zwischenschritt. Damit wird am Ende im Zielprogramm Strg + V simuliert um den Text aus der Zwischenablage dort einzufügen. Und genau das klappt nicht solange der aktuelle Hotkey noch auf der echten Tastatur gedrückt ist.
Das Delphiprogramm wird nie überhaupt sichtbar. |
Hoppla, da hät ich wohl doch erst denken sollen und dann schreiben. Vielleicht auch noch eine Portion gründlicher Lesen dazu...
Na dann ist ja doch alles rechtens
Wobei man das wiederum je nach Situation auch mit .CopyToClipBoard und .PasteToClipBoard machen könnte, dann würde auch das Problem mit den aktiv gedrückten Tasten wegfallen.
@holger: Die Funktionen GetKeyState bzw. GetAsyncKeyState (//Edit: Ach, die Befehle hat jaenicke ja schon im Post oben genannt) könnten dir da helfen, bin aber gerade am arbeiten und habe keine Zeit dir den Code zu schreiben. Wahrscheinlich ist das bis heute Abend schon geschehen, falls nicht bekommste ihn wie ich dazu komm  .
Grüße
ConditionZero
Zuletzt bearbeitet von ConditionZero am Mo 10.05.10 00:05, insgesamt 2-mal bearbeitet
|
|
holger 
      
Beiträge: 46
W2K pro, XP pro
Delphi 6, Delphi 2007
|
Verfasst: So 09.05.10 19:21
Vielen Dank für euer Interesse.
Ich hinterlasse jetzt einfach mal das komplette aktuelle Projekt "CBT-ClipBoardTool" mit Quellcode und exe hier.
Will ja nicht immer nur Fragen stellen, sondern auch mal was nützliches tun
Es ist nicht perfekt programmiert, aber trotzdem ein geniales Tool, wie ich denke.
Nach dem Start der Exe erscheint ein Icon in der Taskbar . . .
Das oben genannte Problem habe ich noch nicht beseitigt ( siehe procedure TForm1.StrgV(keyenable,autoinsert:boolean); )
Alles ander müsste funktionieren.
Eine Schöne Woche wünscht
Holger
Einloggen, um Attachments anzusehen!
|
|
|