Autor Beitrag
Robert Smith
Hält's aus hier
Beiträge: 6



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 458

Win XP, Suse 9.3
D1, D3, D5 Std, D7 Pro, D2005 Pers, Kylix 3
BeitragVerfasst: Fr 10.12.04 19:18 
Such mal nach Suche in: Delphi-Forum, Delphi-Library 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 Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Fr 10.12.04 19:24 
Ja-Pa hat folgendes geschrieben:
Such mal nach Suche in: Delphi-Forum, Delphi-Library 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
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 458

Win XP, Suse 9.3
D1, D3, D5 Std, D7 Pro, D2005 Pers, Kylix 3
BeitragVerfasst: 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.

_________________
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
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 458

Win XP, Suse 9.3
D1, D3, D5 Std, D7 Pro, D2005 Pers, Kylix 3
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 458

Win XP, Suse 9.3
D1, D3, D5 Std, D7 Pro, D2005 Pers, Kylix 3
BeitragVerfasst: 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.

_________________
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 Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 2088



BeitragVerfasst: Fr 10.12.04 20:38 
Dann nimmst du eben Suche in: Delphi-Forum, Delphi-Library REGISTERHOTKEY und deaktivierst die Timer so.
Ein hook wäre viel zu aufwendig für sowas.
Elite
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic starofftopic star
Beiträge: 203

Win XP
D6 Pers
BeitragVerfasst: Fr 10.12.04 22:15 
Der von Delphi-Source, hat einige überflüssige Sachen drin, die alles unnötig kompliziert machen.

z.B.:

ausblenden Delphi-Quelltext
1:
const ID = $FF;					


Schwachsinn! Es reicht ein ganz normaler Integerwert.

ausblenden 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';

    // Abhängig von der ID wird entschieden, was getan werden soll.

  end;

  inherited;


Wozu soll das inherited hier konkret gut sein??? :shock:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
 ok:=RegisterHotKey(Form1.Handle, ID, MOD_Alt, Ord('Q'));

  (*

    Weitere Möglichkeiten sind Mod_control und mod_shift.

  *)



  if not ok then ... // Irgendwas war wohl nicht in Ordnung.


Warum den Umweg über eine Longboolvariable? Eine konkrete Fehlercodeentscheidung wird ohnehin nicht gemacht.
Es würde reichen:
ausblenden 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 Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: 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)

ausblenden volle Höhe 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;
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}
// Eingabegerätesperre, funktion komplett ohne Änderungen kopiert.
function BlockInput(fBlock:boolean):boolean; stdcallexternal 'user32.dll';

// Kopiert von http://www.swissdelphicenter.ch/de/showcode.php?id=147
// nur den Anweisungsteil nach "if" geändert von "Taste x gedrückt"
// auf den Anweisungsblock
procedure TForm1.WMHotKey(var Msg: TWMHotKey);
begin
  if Msg.HotKey = id1 then  // id1: Ctrl + A: soll sperre deaktivieren
    begin
    Timer1.enabled:=false;  //die Timer steuern die Sperre, sind
    Timer2.enabled:=false;  //beide deaktiviert, sollte die Sperre ausgeschaltet bleiben
    BlockInput(false);      //Sperre entfernen
    end;
  if Msg.HotKey = id2 then  // id2: Ctrl + Alt + A : soll sperre aktivieren
    begin
    Timer1.enabled:=true;
    Timer2.enabled:=false;
    BlockInput(true);
    form1.Color:=RGB(0,0,0)  //schwarz heisst immer: Sperre aktiv
    end;
end;

// Ohne Änderungen kopiert: Unregister the Hotkeys
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;

// Alte Lösung, ohne Hotkeys, mit Doppelklick aktiviert und Klick deaktiviert die Sperre wieder
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);  //grün heisst Sperre ausgeschaltet
timer1.Enabled:=false;
timer2.Enabled:=true;
end;

// Sperre durch Klick aufs Formular deaktivieren
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;


// ab jetzt wieder der kopierte Teil zum Thema hotkeys
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 ;
  // Register Hotkey Ctrl + A
  id1 := GlobalAddAtom('Hotkey1');
  RegisterHotKey(Handle, id1, MOD_CONTROL, VK_A);

  // Register Hotkey Ctrl + Alt + A
  id2 := GlobalAddAtom('Hotkey2');
  RegisterHotKey(Handle, id2, MOD_CONTROL + MOD_Alt, VK_A);

//keine Verwendung:
  // Register Hotkey Win + F4
  id3 := GlobalAddAtom('Hotkey3');
  RegisterHotKey(Handle, id3, MOD_WIN, VK_F4);

  // Globally trap the Windows system key "PrintScreen"
  id4 := GlobalAddAtom('Hotkey4');
  RegisterHotKey(Handle, id4, 0, VK_SNAPSHOT);
end;
end.