PrintScreenを無効にしたい

解決


おのちゃん  2004-08-24 22:07:39  No: 10561  IP: [192.*.*.*]

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  です。
よろしくお願いします。

編集    削除
jok  2004-08-24 22:48:52  No: 10562  IP: [192.*.*.*]

システムにホットキー登録をして、なにもしなければいいです。

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 でクリップボードに画面をキャプチャされる
ことはありません。

編集    削除
jok  2004-08-24 23:00:08  No: 10563  IP: [192.*.*.*]

すみません、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.

編集    削除
おのちゃん  2004-08-25 20:05:16  No: 10564  IP: [192.*.*.*]

jokさんありがとうございました。

Alt+PrintScreenの例までつけていただいて助かりました。

編集    削除