Jak sprawdzić czy został wciśnięty ESC??
Nie chodzi o Hooka, tylko zwczajnie na formie, żeby było jak najprościej.
0
0
Może bez rozpisywania się podam od razu przykłąd:
procedure TForm1.FormKeyPress
(Sender: TObject; var Key: Char) ;
begin
if key = #27 then Close;
end;
2
Gregory_Scot napisał(a)
Może bez rozpisywania się podam od razu przykłąd:
procedure TForm1.FormKeyPress
(Sender: TObject; var Key: Char) ;
begin
if key = #27 then Close;
end;
Nie wspomniałeś jeszcze o ustawieniu właściwości formy "KeyPreview" na true. Bez tego forma główna nie przechwyci wciśniętego klawisza Escape gdy na formie będzie co najmniej jedna kontrolka ("focus-owalna"), do której zostanie przekazany kod wciśniętego klawisza.
0
Albo taka metoda:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
type
TForm1 = class(TForm)
Label1: TLabel;
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
procedure OczekiwanieNaKlawisz(Sender: TObject; var Done: Boolean); //Wymagany format procedury dla OnIdle
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
{ TForm1 }
procedure TForm1.OczekiwanieNaKlawisz(Sender: TObject; var Done: Boolean);
begin
//Ta funkcja wykonywana jest cyklicznie przez applikacje
//Tu sprawdzamy klawisz PrintScreen! Jeśli go wcisnieto to Beeep!!!
if GetAsyncKeyState(VK_SNAPSHOT) <> 0 then
Windows.Beep(2000,50);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
//Podstawiamy procedure do cyklicznej petli obslugi stanu spoczynkowego applikacji!
Application.OnIdle:=OczekiwanieNaKlawisz;
end;
end.
0
odbieranie klawisza "Esc" poprzez FormKeyPress ma kilka znaczących wad
tu zamieszczam skuteczniejsze rozwiązanie
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;
type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
procedure Komunikaty(var Msg: TMSG; var HAndled: Boolean);
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Komunikaty(var Msg: TMSG; var HAndled: Boolean);
begin
Handled := False;
case Msg.Message of
//Komunikat otrzymywany tylko gdy nasze okno jest aktywne!!!
WM_KEYDOWN: begin
if Msg.wParam = VK_ESCAPE then //Klawisz ESC
begin
Windows.Beep(300,300);
Application.Minimize;
end;
end;
//Sprawdzamy czy komunikat dotyczy klawiszy Alt+F4
WM_SYSKEYDOWN: begin
if Msg.wParam = VK_F4 then
begin
Handled := True; // brak reakcji na klawisze ALT-F4
end;
end;
//Sprawdzamy np. czy komunikat dotyczy kółka myszki.
WM_MOUSEWHEEL: begin
Handled := True; //Komunikat nie jest przekazywany dalej
end;
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
//Przypisujemy procedure odbierającą komunikaty
Application.OnMessage:=Komunikaty;
end;
end.