Hallo,
ich schreibe gerade ein Programm, welches seine Eingaben per Barcode-Scanner erhält. Da die Benutzer des Rechners aber (teilweise unbeabsichtigt) die CAPS-Lock Taste bedienen, habe ich mir folgendes Verhalten ausgedacht:
1. Wenn die Applikation aktiviert wird, merkt sie sich den Status der CAPS-Taste und deaktiviert sie. Wenn die Applikation deaktiviert wird, stellt sie den Status der Taste wieder her.
2. Während die Applikation aktiviert ist, wird die CAPS-Taste abgefangen und beleibt wirkungslos.
Verhalten 1 habe ich mit folgendem Code realisiert:
Delphi-Quellcode:
...
private
{ Private-Deklarationen }
CapsState: Boolean;
procedure AppActivate(Sender: TObject);
procedure AppDeActivate(Sender: TObject);
...
procedure SetCapsLock(Active: Boolean);
var Scan: UINT;
State: SHORT;
begin
Scan := MapVirtualKey(VK_CAPITAL, 0);
State := GetKeyState(VK_CAPITAL);
if Active xor (State and $0001 = $0001) then begin
keybd_event(VK_CAPITAL, Scan, 0, 0);
keybd_event(VK_CAPITAL, Scan, KEYEVENTF_KEYUP, 0);
end;
end;
procedure TForm1.AppActivate(Sender: TObject);
begin
CapsState := (GetKeyState(VK_CAPITAL) and $0001 = $0001);
SetCapsLock(false);
end;
procedure TForm1.AppDeActivate(Sender: TObject);
begin
SetCapsLock(CapsState);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Application.OnActivate := AppActivate;
Application.OnDeActivate := AppDeActivate;
end;
Mein Problem ist Verhalten 2. Ich habe schon etwas mit dem KeyPreview des Formulars experimentiert. Aber das brachte mich nicht zum Erfolg.
Für Vorschläge wäre ich dankbar.
Gruß,
Stephan