Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Passwort-Routine soll nur einmal aufgerufen werden


D. Annies - Fr 13.03.09 19:00
Titel: Passwort-Routine soll nur einmal aufgerufen werden
Hi, Delpher,

nach ca. 10 Minuten des Nichtstuns mit der Tastatur oder mit der Maus läuft der Code ab. Er soll allerdings eigentlich nur einmal ausgeführt werden, das reicht ja.

Ich habe jetzt den Rechner übers Wochenende durchlaufen lassen und durfte mich fast totklicken, bis ich den Dialog hinter mir hatte.

Wer weiß, was ich da ändern muss?

Code:


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:
procedure TForm1.Timer1Timer(Sender: TObject);
var TempForm : TForm;
    Image    : TImage;
begin
  Timer1.Enabled := false;
  TempForm := TForm.Create(self);
  try
    TempForm.WindowState := wsmaximized;
    Image := TImage.Create(TempForm);
    Image.Parent := TempForm;
    Image.Picture.LoadFromFile(label30.Caption + 'Schluessel.jpg');
    Image.SetBounds(10,10,980,680); Image.Stretch := true;
    TempForm.Show;
    messagedlgpos('Zeitüberschreitung!', mtInformation, [mbOk], 0,450,530);
  finally
    TempForm.Release; //nicht free!
  end;
  form1.passwd(self);
end;

procedure tform1.passwd(sender:tobject);
begin
  form1.groupbox9.align := alclient;
  form1.groupbox9.visible := true; form1.groupbox9.bringtofront;
  form1.edit14.text := '';
  timer1.Enabled := true;
end;

function KeyboardProc(nCode:integer; wParam:longint; lParam:longint):longint; stdcall;
begin
  result := CallNextHookEx(KeyboardHook, ncode, wparam, lparam);
  form1.Timer1.enabled := false;  form1.Timer1.enabled := true;
end;
function MouseProc(nCode:integer; wparam: longint; var MouseHookStruct: TMouseHookStruct):longint; stdcall;
begin
  result := CallNextHookEx(MouseHook, nCode, wparam, longint(@MouseHookStruct));
  form1.timer1.enabled := false; form1.Timer1.enabled := true;
end;

procedure TForm1.FormCreate(Sender: TObject);        // Initialisierungen
begin
  windowstate := wsmaximized;
  KeyboardHook := SetWindowsHookEx(WH_KEYBOARD, @KeyboardProc, 0, GetCurrentThreadID);
  MouseHook    := SetWindowsHookEx(WH_MOUSE, @MouseProc, 0, GetCurrentThreadID);
  timer1.enabled := false; timer1.interval := 10*60000{10 min} timer1.enabled := true;
  // usw. ...
end;


Vielen Dank für Ideen/AbHilfe,
Detlef


elundril - Fr 13.03.09 19:02


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:
procedure TForm1.Timer1Timer(Sender: TObject);
var TempForm : TForm;
    Image    : TImage;
begin
  Timer1.Enabled := false;
  TempForm := TForm.Create(self);
  try
    TempForm.WindowState := wsmaximized;
    Image := TImage.Create(TempForm);
    Image.Parent := TempForm;
    Image.Picture.LoadFromFile(label30.Caption + 'Schluessel.jpg');
    Image.SetBounds(10,10,980,680); Image.Stretch := true;
    TempForm.Show;
    messagedlgpos('Zeitüberschreitung!', mtInformation, [mbOk], 0,450,530);
  finally
    TempForm.Release; //nicht free!
  end;
  form1.passwd(self);
end;

procedure tform1.passwd(sender:tobject);
begin
  form1.groupbox9.align := alclient;
  form1.groupbox9.visible := true; form1.groupbox9.bringtofront;
  form1.edit14.text := '';
  timer1.Enabled := true;
end;

function KeyboardProc(nCode:integer; wParam:longint; lParam:longint):longint; stdcall;
begin
  result := CallNextHookEx(KeyboardHook, ncode, wparam, lparam);
  form1.Timer1.enabled := false;  form1.Timer1.enabled := true;
end;
function MouseProc(nCode:integer; wparam: longint; var MouseHookStruct: TMouseHookStruct):longint; stdcall;
begin
  result := CallNextHookEx(MouseHook, nCode, wparam, longint(@MouseHookStruct));
  form1.timer1.enabled := false; form1.Timer1.enabled := true;
end;

procedure TForm1.FormCreate(Sender: TObject);        // Initialisierungen
begin
  windowstate := wsmaximized;
  KeyboardHook := SetWindowsHookEx(WH_KEYBOARD, @KeyboardProc, 0, GetCurrentThreadID);
  MouseHook    := SetWindowsHookEx(WH_MOUSE, @MouseProc, 0, GetCurrentThreadID);
  timer1.enabled := false; timer1.interval := 10*60000{10 min} timer1.enabled := true;
  // usw. ...
end;


überleg dir mal die sinnhaftigkeit der markierten zeilen!

lg elundril


FinnO - Fr 13.03.09 19:18

Zurücksetzen des Timers?!


elundril - Fr 13.03.09 19:29

wozu den timer zurücksetzen?


FinnO - Fr 13.03.09 19:32

damit er nochmal den Interval läuft?


elundril - Fr 13.03.09 19:37

hmmm, k stimmt.


Xentar - Fr 13.03.09 21:04

Nach dem ersten Aufruf den Timer deaktivieren, und nicht in passwd wieder neu aktivieren?


D. Annies - Fr 13.03.09 21:52

Hi, ihr aktiven,

den Vorschlag von Xentar habe ich eben ausprobiert, (natürlich mit Timer.intervall = 1 min), aber gleiches Bild, gleicher Ton.

Trotzdem erstmal danke,
Detlef


D. Annies - So 15.03.09 19:59

Hi, Delpher,

noch nie konnte mir hier nicht geholfen werden (= immer konnte mir hier geholfen werden)

bloß diesmal (noch) nicht?
Soll ich den Timer verwerfen, oder gibt es noch andere Ideen? Ich bin mit meinem Latein am Ende (siehe Sinnspruch).

Danke für eine Idee,
Detlef


Xentar - So 15.03.09 20:12

Dann musst du uns vielleicht auch auf dem Laufenden halten, was du schon alles probiert hast, und wie du dies umgesetzt hast..?!

Was soll denn das ganze werden? Vielleicht reicht es, dein Programm als Bildschirmschoner einzurichten, dann kümmert sich Windows um den Aufruf?


D. Annies - Mo 16.03.09 12:22

Hi, Xentar,

tja, ich habe halt die ganze Zeit mit Timer1.enabled und .disabled herumprobiert - ohne Erfolg, da ohne Strategie.

Der Sinn ist es, dass nach 10-minütigem Nichtstun mit der Tastatur/Maus das Programm erst weiterläuft, wenn das passwort erneut eingegeben wird.

Bis dann, Detlef


hazard999 - Mo 16.03.09 12:40

Merk dir doch im Hook Now() und lass den Timer durchlaufen.

Dort vergleichst du mit now().

Und wenn now() - LastInputDateTime > (1 / 24 / 60) * 10 ...


Xentar - Mo 16.03.09 13:17

Warum eigentlich kein ShowModal und am Ende Form.Free?


D. Annies - Mo 16.03.09 20:15

Hi, Xentar,

ich habe jetzt geändert und deine beiden Vorschläge eingebracht, leider noch ohne "Durchbruch", aber es ist so auf jeden Fall erstmal besser.

@Hazard999:
Ich habe leider keine Ahnung, wie dieser Code einzubauen ist.

Gruß, Detlef


D. Annies - Mo 16.03.09 20:50

Hallo, Michael (elundril),

so, jetzt habe ich mal die Zeilen timer1.enabled := false; timer1.enabled := true; herausgenommen, und siehe da, jetzt funktioniert es!

Etwas werde ich allerdings noch abwarten, aber dann kann ich wohl wieder aufatmen.
Gruß, Detlef


D. Annies - Di 17.03.09 19:51

So, ich habe jetzt eine globale Variable namens PrgStop (smallint) genommen und damit geht es; code kommt nach, falls gewünscht,

Grüße, Detlef