Delphi5を使用しています。アプリケーションのハードコピーを取らせたくない
ためPrintScreenキーを無効にしたいと思っています。
SetWindowsHookExを使用してdllを作成したのですが、
DeleteやBackSpaceキーの無効化は出来たのですがPrintScreenは無効に
できません。
Dll側ソース
Function keyWndProc(nCode : integer; wParam : WPARAM; lParam : LPARAM):LRESULT;stdcall;
begin
if nCode < 0 then
begin
Result := CallNextHookEx(hHookCallWndProc, nCode, wParam, lParam);
end
else
begin
Result := CallNextHookEx(hHookCallWndProc, nCode, wParam, lParam);
if nCode = HC_ACTION then
begin
Case Wparam of
//ここから下に渡したくないキーを設定する。
VK_SNAPSHOT :
begin
Result := -1;//PrintScreenキーを無効
MessageBox(0, PChar('PrintScreenが押された'), PChar('Title'), MB_YESNO);
end;
VK_DELETE : Result := -1;//DELETEキーを無効
VK_NUMLOCK : Result := -1;//NUMLOCKキーを無効
VK_BACK : Result := -1;
end;// Case Wparam of
end;// if nCode = HC_ACTION then
end; //if nCode < 0 then
end;
Function InstallCallWndProcHook:Boolean;
var
Ret:Integer;
begin
Result := False;
Ret := SetWindowsHookEx(WH_KEYBOARD,@KeyWndProc,HInstance,0);
if Ret = 0 then Exit else
hHookCallWndProc := ret;
Result := True;
end;
環境は Win98SE + Del5Ent です。
よろしくお願いします。
システムにホットキー登録をして、なにもしなければいいです。
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
AppEvnts;
type
TForm1 = class(TForm)
ApplicationEvents1: TApplicationEvents;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure ApplicationEvents1Message(var Msg: tagMSG;
var Handled: Boolean);
private
{ Private 宣言 }
public
{ Public 宣言 }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
const
HotkeyID = 1234567;
procedure TForm1.FormCreate(Sender: TObject);
begin
RegisterHotKey(Application.Handle,HotkeyID,0,VK_SNAPSHOT);
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
UnregisterHotkey(Application.Handle,HotkeyID);
end;
procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG;
var Handled: Boolean);
begin
if (Msg.message = WM_HOTKEY) and (Msg.Wparam = HotkeyID) and
(HIWORD(Msg.Lparam) = VK_SNAPSHOT) then
;//何もしない
end;
end.
このアプリが実行中は PrintScreen でクリップボードに画面をキャプチャされる
ことはありません。
すみません、Alt+PrintScreen の場合を忘れていました。以下のようにしてください。
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
AppEvnts;
type
TForm1 = class(TForm)
ApplicationEvents1: TApplicationEvents;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure ApplicationEvents1Message(var Msg: tagMSG;
var Handled: Boolean);
private
{ Private 宣言 }
public
{ Public 宣言 }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
const
HotkeyID1 = 1234567;
HotkeyID2 = 7654321;
procedure TForm1.FormCreate(Sender: TObject);
begin
RegisterHotKey(Application.Handle,HotkeyID1,0,VK_SNAPSHOT);
RegisterHotKey(Application.Handle,HotkeyID2,MOD_ALT,VK_SNAPSHOT);
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
UnregisterHotkey(Application.Handle,HotkeyID1);
UnregisterHotkey(Application.Handle,HotkeyID2);
end;
procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG;
var Handled: Boolean);
begin
if (Msg.message = WM_HOTKEY) and (HIWORD(Msg.Lparam) = VK_SNAPSHOT) then
if (Msg.Wparam = HotkeyID1) or (Msg.Wparam = HotkeyID2) then
;//何もしない
end;
end.
jokさんありがとうございました。
Alt+PrintScreenの例までつけていただいて助かりました。