Entwickler-Ecke
Sonstiges (Delphi) - Hintergrundprogramm soll auf Tastendruck reagieren
Robert Smith - Fr 10.12.04 18:21
Titel: Hintergrundprogramm soll auf Tastendruck reagieren
Hallo,
Ich habe vor morgen, während einer Feier, auf der die Musik über den PC läuft, die MAus und Tastatur zu sperren, damit nicht an der Playlist rumgespielt werden kann. Ich selber möchte aber noch Zugriff haben. Dazu habe ich ein Programm geschrieben, das mit 2 Timern die Sperre alle 10 Sekunden kurz unterbricht. Wenn ich in der Zeit auf das Formular klicke ist die Sperre aufgehoben, bis ich sie mit einem Doppelklick wieder aktiviere. Das funktioniert soweit wunderbar, nur möchte ich bei Winamp die Visualziation auf Vollbild laufen lassen, dadurch ist mein Formular Fenster weg. Deshalb möchte ich das Programm im Hintergrund laufen lassen, nach dem gleichen Prinzip. Der einzige Unterschied:
In der kurzen Zeit, in der die Sperre aufgehoben ist, soll man die Timer nicht durch einen Mausklick deaktivieren, sondern durch das Drücken von 2 Tasten (z.B. "H"+"T"). Also müsste das Programm im Hintergrund überprüfen, ob idese Tasten gedrückt werden. Wie kann man dies realisieren?
Über hifle würde ich mich freuen.
Ja-Pa - Fr 10.12.04 19:18
Such mal nach
KEYLOGGER hier im Forum...
So wird es aber nicht funktionieren, denn wie willst du die Tastatur sperren?
Strg+Alt+Entf wird immer noch funktionieren.
Falls du 2000/XP hast, kannst du über Win+L die Arbeitsstation sperren lassen.
Robert Smith - Fr 10.12.04 19:24
Ja-Pa hat folgendes geschrieben: |
Such mal nach KEYLOGGER hier im Forum...
So wird es aber nicht funktionieren, denn wie willst du die Tastatur sperren?
Strg+Alt+Entf wird immer noch funktionieren.
Falls du 2000/XP hast, kannst du über Win+L die Arbeitsstation sperren lassen. |
Der link war der richtige, aber ich war nciht der geeignete Leser ;) Ich hab Delphi in der Schule gehabt, kann eine Strasse zeichnen lassen, einen Taschenrechner programmieren und ein kleines Formel1 Rennen. Aber wirklich Ahnung hat man deswegen nicht von Delphi...
Die Tastatursperre lässt sich über strg+alt+entf wieder aufheben, das wär ein guter Ansatz, leider ist die Kombination jedem bekannt, ist es vielleicht möglich ein Programm zu schreiben, das Tasten umbelegt? Also zum Beispiel "Strg" mit der "Windows"-Taste tauschen. Dann wär das Ergebnis der Strg+Alt+Entf-KOmbination über unbekannte Tasten erreichbar. Und Unbefugte kennen diese nicht.
Lässt sich das realisieren?
(im moment habe ich strg+alt+entf deaktiviert)
Ja-Pa - Fr 10.12.04 19:46
Stöpsel doch einfach deine Tastatur aus und nimm sie mit :wink:
Ne im Ernst: Unbeaufsichtigt würde ich den PC sowieso nicht stehen lassen.
Ja-Pa - Fr 10.12.04 19:50
Oder wie wäre es, wenn du ein kleines Form immer im Vordergrund (Form1.FormState := fsStayOnTop;) laufen hast, nur ein paar Pixel groß, so dass man es nicht sieht.
Wenn du da draufklickst kommt ein Passwortdialog (von dir), bei dem du - logischerweise - ein Passwort eingeben kannst um den PC wieder freizugeben.
Robert Smith - Fr 10.12.04 19:57
Ja-Pa hat folgendes geschrieben: |
Oder wie wäre es, wenn du ein kleines Form immer im Vordergrund (Form1.FormState := fsStayOnTop;) laufen hast, nur ein paar Pixel groß, so dass man es nicht sieht.
Wenn du da draufklickst kommt ein Passwortdialog (von dir), bei dem du - logischerweise - ein Passwort eingeben kannst um den PC wieder freizugeben. |
die Idee ist gut, aber mit Vollbild/Auflösungswechel und all dem in Winamp funktionierts nciht sehr leicht. Am leichtesten wär halt diese tastenumbelegungsgeschichte.
(Form1.FormState := fsStayOnTop führt zur Meldung:[Fehler] Unit1.pas(60): Einer Nur-Lesen Eigenschaft kann kein Wert zugewiesen werden)
Ja-Pa - Fr 10.12.04 20:07
Robert Smith hat folgendes geschrieben: |
(Form1.FormState := fsStayOnTop führt zur Meldung:[Fehler] Unit1.pas(60): Einer Nur-Lesen Eigenschaft kann kein Wert zugewiesen werden) |
Ups. :oops:
Naja, dann machs eben im Objektinspektor :wink:
Stimmt, hab vergessen das Winamp im Vollbild läuft. Wie wäre es, wenn du auf dem Desktop eine Verknüpfung zu deinem Programm hast und über Rechtsklick -> Eigenschaften -> Tastenkombination deine Tastenkombination einträgst?
Das sollte IMHO auch im Vollbild gehen.
Ansonsten würde ich dir den OpenSource-Keylogger im gleichnamigen Forum von Luckie empfehlen. Schau dir mal den Source an, vielleicht kommst du ja soch von alleine drauf, wie man ihn erweitert. Wenn nicht fragst su eben, was du nicht verstehst.
Robert Smith - Fr 10.12.04 20:16
Das mit der Verknüfung und Hotkey hab ich probiert. Eigentlich müsste es ja wunderbar gehen, dann könnt ich auch wieder durch Klick/Doppelklick die Eingabegeräte sperren/entsperen. Abe rleider verlässt Winamp den Vollbildmodus, sobald ich mein Formular über den Hotkey starte. :(
Robert Smith - Fr 10.12.04 20:31
Ja-Pa hat folgendes geschrieben: |
Ansonsten würde ich dir den OpenSource-Keylogger im gleichnamigen Forum von Luckie empfehlen. Schau dir mal den Source an, vielleicht kommst du ja soch von alleine drauf, wie man ihn erweitert. Wenn nicht fragst su eben, was du nicht verstehst. |
Aus dem Quelltext davon werd ich leider nicht schlau...
Karlson - Fr 10.12.04 20:38
Dann nimmst du eben
REGISTERHOTKEY und deaktivierst die Timer so.
Ein hook wäre viel zu aufwendig für sowas.
The-FoX - Fr 10.12.04 22:15
Der von Delphi-Source, hat einige überflüssige Sachen drin, die alles unnötig kompliziert machen.
z.B.:
Schwachsinn! Es reicht ein ganz normaler Integerwert.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| case Msg.IdHotKey of
ID: caption:='alles klar';
ID+1: caption:='es ist immer noch alles klar';
end;
inherited; |
Wozu soll das inherited hier konkret gut sein??? :shock:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| ok:=RegisterHotKey(Form1.Handle, ID, MOD_Alt, Ord('Q'));
if not ok then ... |
Warum den Umweg über eine Longboolvariable? Eine konkrete Fehlercodeentscheidung wird ohnehin nicht gemacht.
Es würde reichen:
Delphi-Quelltext
1:
| if registerhotkey(blblabla) then showmessage('geklappt') else showmessage('nichtgeklaptt'); |
Desweiteren gibt es auch noch die Möglichkeit den Modifikator 0 zu wählen, was bedeuten würde dass nur der Ord als Hotkey registriert wird.
Kein wunder das viele Anfänger probleme mit Tutorials haben. Wenn sie sowas gelesen haben, dürfen sie erstmal noch suchen gehen was $FF, inherited und case bedeutet :roll:
Robert Smith - Fr 10.12.04 22:20
Registerhotkey war genau das, was ich gesucht habe. Ich habs jetzt fertig ... einziges Problem, es funktioniert nicht. Ich kann zwar über Hotkey id2 (Strg + Alt + A) Timer1 aktivieren, aber wenn dann für einen kurzen Moment über die Timer die Sperre aufgehoben ist (Formular wird grün, damit mans sieht) reagiert das Programm nicht auf Hotkey id1 (Strg + A), der eigentlich die Sperre aufheben und die Timer deaktiveren sollte.
Ich hänge mal mein Programm an. Ich kann mir nicht erklären, wieso die Sperre über Strg + A nicht aufgehoben wird.
(anhängen geht ja gar nicht :) ) hier ist es:
http://home.arcor.de/robert-smith/sperre.zip
(erst war die Datei nicht komplett hochgeladen, jetzt geht der Link)
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117: 118: 119: 120: 121: 122: 123: 124: 125: 126: 127: 128: 129: 130: 131: 132:
| unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls;
type TForm1 = class(TForm) Timer1: TTimer; Timer2: TTimer; procedure FormDblClick(Sender: TObject); procedure Timer1Timer(Sender: TObject); procedure FormClick(Sender: TObject); procedure Timer2Timer(Sender: TObject); procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); private id1, id2, id3, id4: Integer; procedure WMHotKey(var Msg: TWMHotKey); message WM_HOTKEY; public end;
var Form1: TForm1;
implementation
{$R *.dfm} function BlockInput(fBlock:boolean):boolean; stdcall; external 'user32.dll';
procedure TForm1.WMHotKey(var Msg: TWMHotKey); begin if Msg.HotKey = id1 then begin Timer1.enabled:=false; Timer2.enabled:=false; BlockInput(false); end; if Msg.HotKey = id2 then begin Timer1.enabled:=true; Timer2.enabled:=false; BlockInput(true); form1.Color:=RGB(0,0,0) end; end;
procedure TForm1.FormDestroy(Sender: TObject); begin UnRegisterHotKey(Handle, id1); GlobalDeleteAtom(id1); UnRegisterHotKey(Handle, id2); GlobalDeleteAtom(id2); UnRegisterHotKey(Handle, id3); GlobalDeleteAtom(id3); UnRegisterHotKey(Handle, id4); GlobalDeleteAtom(id4); end;
procedure TForm1.FormDblClick(Sender: TObject); begin Timer1.enabled:=true; Timer2.enabled:=false; BlockInput(true); form1.Color:=RGB(0,0,0) end;
procedure TForm1.Timer1Timer(Sender: TObject); begin BlockInput(false); form1.Color:=RGB(25,255,30); timer1.Enabled:=false; timer2.Enabled:=true; end;
procedure TForm1.FormClick(Sender: TObject); begin Timer1.enabled:=false; Timer2.enabled:=false; BlockInput(false); end;
procedure TForm1.Timer2Timer(Sender: TObject); begin timer1.enabled:=true; timer2.enabled:=false; BlockInput(true); form1.Color:=RGB(0,0,0) end;
procedure TForm1.FormCreate(Sender: TObject); const MOD_ALT = 1; MOD_CONTROL = 2; MOD_SHIFT = 4; MOD_WIN = 8; VK_A = $41; VK_R = $52; VK_F4 = $73; begin Form1.FormStyle := fsStayOnTop ; id1 := GlobalAddAtom('Hotkey1'); RegisterHotKey(Handle, id1, MOD_CONTROL, VK_A);
id2 := GlobalAddAtom('Hotkey2'); RegisterHotKey(Handle, id2, MOD_CONTROL + MOD_Alt, VK_A);
id3 := GlobalAddAtom('Hotkey3'); RegisterHotKey(Handle, id3, MOD_WIN, VK_F4);
id4 := GlobalAddAtom('Hotkey4'); RegisterHotKey(Handle, id4, 0, VK_SNAPSHOT); end; end. |
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!