簡單阻擋PrintScreen的方法

 Tue, 02 Dec 2008 14:33:39 +0800

好多年沒開發使用win32api的東西了,因為有需要,前幾天稍微測試了一下。

簡單的原理是用SetWindowsHookEx函數安裝一個WH_KEYBOARD hook來攔截,但是發現在事件處理的函數中即使不呼叫CallNextHookEx而直接return,還是無法擋住Print Screen的動作......

找了一下MSDN,最後用了Clipboard相關的函數來解決,方法是攔截到PrintScreen鍵時,立刻取得clipboard(用到GetClipboardOwner跟OpenClipboard兩個函數),然後呼叫EmptyClipboard函數來清除剪貼簿。目前看起來這樣應該可以簡單地防止PrintScreen把螢幕或應用程式的畫面拷貝到剪貼簿,當然也就無法貼到小畫家等程式存檔了。

不過這樣的方法只能防君子不能防小人,一些snapshot軟體可以透過拷貝DeviceContext的方式取得其他應用程式畫面,這樣就無法用這個方法阻止了。

(其他心得:在網路上找了一支用Memory Map File來共享資料的類別,可以用他來共享hook handle,這樣就可以用Dev-C++來做,不必非靠VisualC不可了。另外,VC9 runtime dll配置的方法跟以前的vc runtime差真多阿?我以為只要copy到同一個目錄就能用了啦。果然太久沒碰了......)