Jak złapać ESC?

0

Jak sprawdzić czy został wciśnięty ESC??
Nie chodzi o Hooka, tylko zwczajnie na formie, żeby było jak najprościej.

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.

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0