Hallo liebe DPler,
ich schreibe gerade eine kleine Anwendung für einen Freund in Lazarus (0.9.30.4). Im Prinzip werden nur ein paar Werte in eine Liste gepackt (per Button) und abhängig von den bisherigen Werten verschiedene Möglichkeiten in Betracht gezogen. Das tut auch nichts zur Sache.
Wichtig bei dieser Anwendung wäre allerdings, dass es sich nach dem "Deaktivieren" durch Klick auf ein anderes Fenster wieder in den Vordergrund bringt und auch wieder per Tastatur steuerbar ist.
Folgende Tastatureingaben werden über das KeyDown-Event des Hauptformulars abgefangen und rufen die OnClick-Prozeduren von 4 Buttons auf.
Delphi-Quellcode:
procedure Tfrm_main.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
case Key of
37: // Aktion für VK_LEFT;
40: // Aktion für VK_DOWN;
39: // Aktion für VK_RIGHT;
38: // Aktion für VK_UP;
end;
end;
Das Formular ist momentan aus BorderStyle bsDialog und FormStyle fsNormal eingestellt und wird wie folgt im OnShow-Event geTOPMOSTet:
Delphi-Quellcode:
procedure Tfrm_main.FormShow(Sender: TObject);
begin
SetWindowPos(
Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOACTIVATE
or SWP_NOMOVE
or SWP_NOSIZE);
end;
Da das aber allein nicht funktioniert hat, habe bringe ich das Fenster mit Hilfe eines Timers immer wieder in den Vordergrund. Das ist die Stelle die mir ganz und garnicht gefällt und sicher nicht zum guten Stil gehört.
Im OnTimer-Event wird also immer wieder BringToFront ausgelöst.
Delphi-Quellcode:
procedure Tfrm_main.Timer1Timer(Sender: TObject);
begin
if GetForeGroundWindow <>
Handle then
begin
frm_main.BringToFront;
end;
end;
Nochmal das Ziel: Dieses kleine Formular soll auch nach Aktion in einem anderen Fenster (ist soweit ich weiß kein Spiel und auch nicht maximiert/Vollbild, ...) wieder durch die Pfeiltasten navigierbar sein.
Soweit ich weiß, lassen sich Anwendungen nicht mehr den Focus stehlen. Damit dürfte es dann nicht gehen.