Jak złapać ESC?

Riddle
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 10231
0

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

Gregory_Scot
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 91
0

Może bez rozpisywania się podam od razu przykłąd:

Kopiuj
procedure TForm1.FormKeyPress
   (Sender: TObject; var Key: Char) ;
begin
   if key = #27 then Close;
end;
MA
  • Rejestracja: dni
  • Ostatnio: dni
2
Gregory_Scot napisał(a)

Może bez rozpisywania się podam od razu przykłąd:

Kopiuj
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.

T6
  • Rejestracja: dni
  • Ostatnio: dni
0

Albo taka metoda:

Kopiuj
 
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.
 


T6
  • Rejestracja: dni
  • Ostatnio: dni
0

odbieranie klawisza "Esc" poprzez FormKeyPress ma kilka znaczących wad
tu zamieszczam skuteczniejsze rozwiązanie

Kopiuj

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.

 

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.