Disable PrintScreen Key

Posted: 三月 22, 2008 in 技術相關
標籤:,

2008/3/22 總統大選 … 電視到處都在開票 @_@ 藍綠激情 ….

不過對政治 沒啥狂熱的我 就懶得看開票了 :p 所以來研究一下小東西好了

之前文章 “KeyBoard MSG Parsing“有提到說 可以利用

PreTranslateMessage(MSG* pMsg)

的方式 在系統處理訊息前 攔截接收 User Keyin 的訊息並處理之…

這種方法可以解決 大多數 鍵盤輸入的偵測處理 …

但是如果碰到 一些 SysKey (PrtSc/ NumLK/ Pause…)

則就沒有用這種辦法來達成了 …

然後之前剛好在想說 要怎樣可以攔截 PrtSc 鍵 避免使用者抓取螢幕畫面 …

使用了 PreTranslateMessage 但是在 WM_KEYDOWN 下攔截不到

PrintScreen 的 VK_SNAPSHOT 鍵 … 但卻可以在 WM_KEYUP 時攔截到

但這樣沒有用啊 @_@ 螢幕的 snapshot 還是已經存入系統 buffer 中了 …

在網路上查了許多資訊 但討論的很少 … 然後總算在 CodeProject 上找到類似的解法

而他所使用的方式 就是在系統中註冊一個 HOOK 去監聽/偵測系統訊息 …

HOOK 的方式算是一種全域偵測的方式 與 PreTranslateMessage 不同

PreTranslateMessage 只能在自己程式的 domain 下偵測 …

所以我們的作法一樣是 攔截 & return …

註冊安裝 HOOK 和 反安裝的部分如下所示

  • 註冊/ 安裝

 TheKeyHook = SetWindowsHookEx(WH_KEYBOARD_LL, LowLevelKeyboardProc, ppI,0);

  •  反安裝

UnhookWindowsHookEx(TheKeyHook);

Disable PrintScreen 的主要程式碼 (CALLBACK FUNCTION) 則如下所示


LRESULT CALLBACK LowLevelKeyboardProc(INT nCode, WPARAM wParam, LPARAM lParam)
{
    try
    {
        // By returning a non-zero value from the hook procedure, the
        // message does not get passed to the target window
        KBDLLHOOKSTRUCT *pkbhs = (KBDLLHOOKSTRUCT *) lParam;
        int error=GetLastError();   
        switch (nCode)
        {
            case HC_ACTION:
            {
                //    Detect "PrtSc" Key ...
                if(pkbhs->vkCode == VK_SNAPSHOT)
                {
                    return 1;
                }
                break;
            } 
            default:
                break;
        }
        CallNextHookEx (TheKeyHook, nCode, wParam, lParam);
    }
    catch(...)
    {
    }
    return 0;
}

透過註冊 HOOK 方式  監控系統 處理虛擬按鍵 (VK_XXX)

則可以做到類似 “鍵盤側錄軟體" 的功能…  這也是一般鍵盤側錄軟體的實作原理 ..

一樣小程式分享於下

Complier 平台一樣是 Visual C++ 6.0

有興趣的可以下載回去 試試看 :>

迴響
  1. Bruce Jwo 說道:

    謝謝,受益良多

  2. Monkey 說道:

    Nice article, Thank you🙂

  3. Cloudland 說道:

    請問snapshot是在程式中何處被disable的?
    謝謝~

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 變更 )

Twitter picture

You are commenting using your Twitter account. Log Out / 變更 )

Facebook照片

You are commenting using your Facebook account. Log Out / 變更 )

Google+ photo

You are commenting using your Google+ account. Log Out / 變更 )

連結到 %s