Jak zablokować klawisz Print Screen
reichel
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ż:
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)
Ciekawe czemu jest tak -> moja klikalnosc ograniczala sie do:
a pod tym faq widze komunikaty z .... 27,28
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...
hę?