Autor |
Beitrag |
Robert Smith
Hält's aus hier
Beiträge: 6
|
Verfasst: Fr 10.12.04 18:21
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.
Zuletzt bearbeitet von Robert Smith am Fr 10.12.04 22:41, insgesamt 1-mal bearbeitet
|
|
Ja-Pa
      
Beiträge: 458
Win XP, Suse 9.3
D1, D3, D5 Std, D7 Pro, D2005 Pers, Kylix 3
|
Verfasst: 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.
_________________ Der Autor dieses Textes haftet nicht für Schäden an Soft- oder Hardware
oder Vermögensschäden, die durch das Benutzen des Textes entstehen.
|
|
Robert Smith 
Hält's aus hier
Beiträge: 6
|
Verfasst: 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
      
Beiträge: 458
Win XP, Suse 9.3
D1, D3, D5 Std, D7 Pro, D2005 Pers, Kylix 3
|
Verfasst: Fr 10.12.04 19:46
Stöpsel doch einfach deine Tastatur aus und nimm sie mit
Ne im Ernst: Unbeaufsichtigt würde ich den PC sowieso nicht stehen lassen.
_________________ Der Autor dieses Textes haftet nicht für Schäden an Soft- oder Hardware
oder Vermögensschäden, die durch das Benutzen des Textes entstehen.
|
|
Ja-Pa
      
Beiträge: 458
Win XP, Suse 9.3
D1, D3, D5 Std, D7 Pro, D2005 Pers, Kylix 3
|
Verfasst: 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.
_________________ Der Autor dieses Textes haftet nicht für Schäden an Soft- oder Hardware
oder Vermögensschäden, die durch das Benutzen des Textes entstehen.
|
|
Robert Smith 
Hält's aus hier
Beiträge: 6
|
Verfasst: 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
      
Beiträge: 458
Win XP, Suse 9.3
D1, D3, D5 Std, D7 Pro, D2005 Pers, Kylix 3
|
Verfasst: 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.
Naja, dann machs eben im Objektinspektor
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.
_________________ Der Autor dieses Textes haftet nicht für Schäden an Soft- oder Hardware
oder Vermögensschäden, die durch das Benutzen des Textes entstehen.
|
|
Robert Smith 
Hält's aus hier
Beiträge: 6
|
Verfasst: 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 
Hält's aus hier
Beiträge: 6
|
Verfasst: 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
      
Beiträge: 2088
|
Verfasst: 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.
|
|
Elite
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Fr 10.12.04 21:09
einfach mal das hier lesen: www.delphi-source.de/tipps/?id=635
Damit solltest du zumindest mit Hotkeys keine Probleme mehr haben und einfach ist es zu dem auch noch!
|
|
The-FoX
      
Beiträge: 203
Win XP
D6 Pers
|
Verfasst: Fr 10.12.04 22:15
Der von Delphi-Source, hat einige überflüssige Sachen drin, die alles unnötig kompliziert machen.
z.B.:
Delphi-Quelltext
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???
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 
|
|
Robert Smith 
Hält's aus hier
Beiträge: 6
|
Verfasst: 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: home.arcor.de/robert-smith/sperre.zip
(erst war die Datei nicht komplett hochgeladen, jetzt geht der Link)
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. |
|
|
|