DOBON.NET DOBON.NETプログラミング掲示板過去ログ

PrintScreenキーを無効にするには?

環境/言語:[Win2000,VB.NET]
分類:[.NET]

教えてください。

PrintScreenを押した時に、ハードコピーを取るのを防ぐために
PrintScreenキーを無効にしたいのですがどうすればよいでしょうか。

PrintScreenキーが押されたときにKeyDownイベントが発生しているか確かめるために
下記のコードを書いて実行してみましたが、イベントが発生していないのかメッセージボックスも出てくれません。

Private Sub Form1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles MyBase.KeyDown

If e.KeyCode = Keys.PrintScreen Then
MessageBox.Show("PrintScreen_KeyDown")
End If

End Sub


現在のところ、どうすればよいのかさっぱりわからないのですが主に
下記の2点がわからない状態です。

1.どのイベントでPrintScreenキーを押下したということを取得するのか?
2.PrintScreenで取得されるハードコピーを取れないようにするには
どうすればよいか?

よろしくお願いします。
こんにちは。
PrintScreen キーはお察しの通り KeyDown イベントを生成しません。
代わりに KeyUp イベントで捕まえてあげてください。

その中で
Clipboard.SetDataObject("PrintScreenは無効です", True)
とでもしてクリップボードに適当なデータを入れてあげれば、
ハードコピーをとられることも防げます。
llamaさん、回答ありがとうございます。

> PrintScreen キーはお察しの通り KeyDown イベントを生成しません。
> 代わりに KeyUp イベントで捕まえてあげてください。
>
> その中で
> Clipboard.SetDataObject("PrintScreenは無効です", True)
> とでもしてクリップボードに適当なデータを入れてあげれば、
> ハードコピーをとられることも防げます。

ご指摘のとおり、KeyUpイベントでClipboardに適当なデータをいれることで、
フォーム(exe)がアクティブのときに実現できました。
しかし、私の考えが足らなかったのですが、他のexe(WordやExcelなど)が
アクティブのときに、PrintScreenで画面全体の画像をとることで、
フォームの画像が取得できてしまいました。

そこで、他のexeがアクティブなときにもPrintScreenを禁止する処理を
行いたいのですが、どうすれば他のexeがアクティブなときにもPrintScreenの
キーが押されたということを取得すればよいでしょうか?
こんにちは。
システム全体で PrintScreen キーを制御したいということでしたら、Win32API の世界ではシステムメッセージをフックして行います。
が、これはかなり低レベルな操作なので残念ながら C# 単体(というか .NET Framework)ではできません。

参照:[HOWTO] Visual C# .NET で Windows フックを設定する方法
    http://support.microsoft.com/?kbid=318804


どうしてもしたければ

C++ で
 ・フックのコールバックを書く
 ・フックの登録/解除関数を export した DLL を作成

C# で
 ・DllImport で↑のDLLを読み込み後、 export された関数を呼び出す

という方法になります。


ちなみに RegisterHotKey, SetWinddowsHookEx を使ったシステムフックの例は下記にあります。
http://www.microsoft.com/japan/msdn/windows/windowsxp/xpvisualstyles.asp


↑のドキュメントにもリンクが貼られていますが、フックそのものに関するドキュメントです。
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/WinUI/WindowsUserInterface/Windowing/Hooks/AboutHooks.asp
ちょっと誤解を招く表現をしていたので訂正します。

> が、これはかなり低レベルな操作なので残念ながら C# 単体
>(というか .NET Framework)ではできません。

C#単体あるいはVB.NET単体でも「できます」が、unmanaged code を使うので
.NET Framework 上では「できません」。

また VB.NET で SetWindowsHookEx を実装している例を見つけたので
参考にしてください。
http://www.codeguru.com/vb_system/PK041803.html

その記事を読むとわかるのですが、前のレスで私は「自前でDLLを書く」必要があるように書いていましたが、それは誤りで Windows の DLL を呼べばいいだけの話でした。
混乱させてしまったら申し訳ありません。
llamaさん、回答ありがとうございます。

VB単体では処理ができないのですね。

> また VB.NET で SetWindowsHookEx を実装している例を見つけたので
> 参考にしてください。
> http://www.codeguru.com/vb_system/PK041803.html

このホームページを参考にがんばってみます。

ありがとうございました。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板