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
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).
Zobacz też:
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
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
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...
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)