PrintScreenキーを無効にしてスクリーンショットを無効化する

セキュリティ的に絶対的な効果はないけど、アプリケーションの実行中にPrintScreenキーを無効にしてスクリーンショットを撮れなくするのはそれなりの抑止力があるはず。キーストロークWindowsに登録するホットキーはフックよりも実装が楽。元ネタは、ここ

1.アプリケーションの開始時(メインフォームのOnCreateイベント)にホットキーを登録。終了時にホットキーの登録を削除。

const int TfrmMain::HotkeyID1 = 0x0001;
const int TfrmMain::HotkeyID2 = 0x0002;

//---------------------------------------------------------------------------
void __fastcall TfrmMain::FormCreate(TObject *Sender)
{
  RegisterHotKey(Application->Handle, HotkeyID1, 0,VK_SNAPSHOT);
  RegisterHotKey(Application->Handle, HotkeyID2, MOD_ALT,VK_SNAPSHOT);
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::FormClose(TObject *Sender, TCloseAction &Action)
{
  UnregisterHotKey(Application->Handle,HotkeyID1);
  UnregisterHotKey(Application->Handle,HotkeyID2);
}
//---------------------------------------------------------------------------

2.フォームにTApplicationEventsを貼り、OnMessegeイベントでウィンドウメッセージを受け付ける

//---------------------------------------------------------------------------
void __fastcall TfrmMain::ApplicationEvents1Message(tagMSG &Msg, bool &Handled)
{
  if ((Msg.message == WM_HOTKEY) && (HIWORD(Msg.lParam) == VK_SNAPSHOT)) {
    if ((Msg.wParam == HotkeyID1) || (Msg.wParam == HotkeyID2)) {
      // PrintScreenキーが押された場合の処理
      return;
    }
  }
}
//---------------------------------------------------------------------------

キャプチャ関係は、Antinnyをはじめとする暴露ウイルスはもちろんのこと、Snipping ToolとかWinShotといったキャプチャソフトが入っていたらアウトなので、この辺は運用ポリシーで補う以外無い。

クリップボードの監視を行うのであれば、JVCLのTJvClipboardMonitorを使うのが楽。フォームに貼るだけでクリップボードの監視が出来る。

//---------------------------------------------------------------------------
void __fastcall TfrmMain::JvClipboardMonitor1Change(TObject *Sender)
{
  if (!Clipboard()->HasFormat(CF_TEXT)) {
    // テキスト以外は強制的にクリア
    Clipboard()->Clear();
  }
}
//---------------------------------------------------------------------------