Programowanie w języku Delphi » FAQ

Jak zablokować klawisz Print Screen

Opisana metoda tutaj zapewnia zablokowanie samego klawisza Print Screen, w taki sposób aby nie był dokonany zrzut ekranu.
Aby uniemożliwić całkowicie możliwość robienia zrzutów ekranu za pomocą tego klawisza, należy przejrzeć wszystkie możliwości modyfikatorów (Shift, Ctrl, Alt).

Możliwości blokowania klawiatury jest kilka:
 - za pomocą haków na komunikaty (przy czym najprostsze metody w tym przypadku zawodzą)
 - za pomocą haków na win API (teoretycznie metoda najlepsza, ale też i najtrudniejsza)
 - metoda rejestracji ciepłych klawiszy (hootkey'ów) i podszywania się pod inne aplikacje (najsłabsza z wymienionych, ale wygląda na to, że tu pasuje)

Windows wykonuje zrzuty ekranu przechwytując komunikaty WM_HOOTKEY, zarejestrowane jako

  IDHOT_SNAPDESKTOP  =  -2;
  IDHOT_SNAPWINDOW   =  -1; 


teraz wystarczy tylko samemu zarejestrować dwa z tych komunikatów (z różnymi modyfikatorami - do testów), aby uniemożliwić robienie zrzutu ekranu.
(Poniższy kod to prezentuje, należy utworzyć formularz Form1, komponenty Button1: TButton;  Memo1: TMemo;    Button2: TButton;  oraz odpowiednie zdarzenia do nich).

unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
 
type
  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
     FNext: HWND;
     procedure WMHotKey(var Msg: TWMHotKey); message WM_HOTKEY;
     procedure WMChangeCBChain(var Msg : TWMChangeCBChain); message WM_CHANGECBCHAIN;
     procedure WMDrawClipboard(var Msg : TWMDrawClipboard); message WM_DRAWCLIPBOARD;
  public
    { Public declarations }
 
  end;
 
var
  Form1: TForm1;
 
//cieple guziki dla print screen
const
  IDHOT_SNAPDESKTOP  =  -2;
  IDHOT_SNAPWINDOW   =  -1;
  VK_PRINTSCREEN     =  44;
implementation
 
{$R *.dfm}
procedure TForm1.WMHotKey(var Msg: TWMHotKey);
begin
 case Msg.HotKey of
   IDHOT_SNAPDESKTOP: Memo1.Lines.Add('Caly pulpit');
   IDHOT_SNAPWINDOW: Memo1.Lines.Add('Okno');
  end;
end;
 
 
procedure TForm1.WMChangeCBChain(var Msg : TWMChangeCBChain);
begin
  inherited;
  Msg.Result := 0;//OK
  if Msg.Remove = FNext then
    Fnext := Msg.Next//info o skasowanym z lancucha okinku
  else
    SendMessage(FNext, WM_CHANGECBCHAIN, Msg.Remove, Msg.Next);//info slemy dalej w swiat
end;
 
 
procedure TForm1.WMDrawClipboard(var Msg : TWMDrawClipboard);
begin
  inherited;
  Memo1.Lines.Add('Zawartosc schowka sie zmienila');
  //slemy info o zmianach do nastepnego okienka
  SendMessage(FNext, WM_DRAWCLIPBOARD, 0, 0);
end;
 
procedure TForm1.Button1Click(Sender: TObject);
begin
 
 //rejestrujemy cieple guziki odpowiedzialne za migawke calosci
 RegisterHotKey(handle,IDHOT_SNAPDESKTOP,0,VK_PRINTSCREEN);
 //oraz okna
 RegisterHotKey(handle,IDHOT_SNAPWINDOW,MOD_ALT,VK_PRINTSCREEN);
 //i powinno sie jeszcze zablokowac inne .... chodzi nam na razie o samo print screen
end;
 
procedure TForm1.FormCreate(Sender: TObject);
begin
 //Rejestrujemy nasze okno do lancucha podgladaczy schowka
  if FNext = 0 then FNext := SetClipboardViewer(Handle);
  FNext := 0;  //dobry zwyczaj ...
end;
 
procedure TForm1.FormDestroy(Sender: TObject);
begin
  if FNext <> 0 then ChangeClipboardChain(Handle, FNext);//powinnismy odrejestrowac
  FNext := 0;
  //oraz nasze cieple guziki
  UnregisterHotKey(Handle,IDHOT_SNAPDESKTOP);
  UnregisterHotKey(Handle,IDHOT_SNAPWINDOW);
end;
 
 
 
procedure TForm1.Button2Click(Sender: TObject);
begin
  UnregisterHotKey(Handle,IDHOT_SNAPDESKTOP);
  UnregisterHotKey(Handle,IDHOT_SNAPWINDOW);
end;
 
end.



Zobacz też:

4 komentarze

Coldpeer 2007-08-30 09:19

3 pierwsze komentarze były dodane do zupełnie innego tekstu! [który został swoją drogą skasowany] (w dodatku porównajcie datę arta z datą komentarzy)

reichel 2007-08-30 00:10

Ciekawe czemu jest tak -> moja klikalnosc ograniczala sie do:

 - popatrzylem na inne arty jak zrobic Zoabzc tez (bez jakichkolwiek akceptacji)
 - 2x podglad
 - Dodaj ...

a pod tym faq widze komunikaty z .... 27,28

Coldpeer 2007-08-28 10:56

Porobił się bałagan. Spójrzcie na poprzednie arty.

nss: załączniki wrzuca się w zakładce "Załączniki" przy edycji. Zapoznaj się z zasadami redagowania artykułów w dziale Pomoc.

Póki co, trzeba posprzątać, bo kilka dublów i niepotrzebnych artów powstało...