上篇文章提到Keyboard Hook,一般都會以為只能用在一些Hack程式(鍵盤側錄...),但是有很多程式是需要這個Keyboard Hook的支援,特別是那些失去Focus時候的應用程式,無法用KeyDown Event捕捉使用者的訊息,所以想要透過鍵盤的操控(快速鍵)達到"開始" ”停止" “擷取"……都可以透過這個方式達到目的.
底下是我寫的一個範例:
用途:全螢幕擷取程式,使用者可以設定圖檔存放處,擷取頻率...
當使用這按下[開始],程式最小化開始進行擷取,一直當使用者按下[Esc]就立即停止擷取,並將程式帶至桌面前景...
重要程式片段:
private void button_Start_Click(object sender, EventArgs e)
{
if (m_HookHandle == 0)
{
using (Process curProcess = Process.GetCurrentProcess())
using (ProcessModule curModule = curProcess.MainModule)
{
m_KbdHookProc = new HookProc(Form1.KeyboardHookProc);
m_HookHandle = SetWindowsHookEx(WH_KEYBOARD_LL, m_KbdHookProc, GetModuleHandle(curModule.ModuleName), 0);
}
if (m_HookHandle == 0)
{
MessageBox.Show("呼叫 SetWindowsHookEx 失敗!");
return;
}
StartProcess();
}
}
private static int KeyboardHookProc(int nCode, IntPtr wParam, IntPtr lParam)
{
// 當按鍵按下及鬆開時都會觸發此函式,這裡只處理鍵盤按下的情形。
bool isPressed = (lParam.ToInt32() & 0x80000000) == 0;
if (nCode < 0 || !isPressed)
{
return CallNextHookEx(m_HookHandle, nCode, wParam, lParam);
}
// 取得欲攔截之按鍵狀態
KeyStateInfo escKey = KeyboardInfo.GetKeyState(Keys.Escape);
if (escKey.IsPressed)
{
System.Diagnostics.Debug.WriteLine("ESC Pressed!");
bool ret = UnhookWindowsHookEx(m_HookHandle);
if (ret == false)
{
MessageBox.Show("呼叫 UnhookWindowsHookEx 失敗!");
return 0;
}
m_HookHandle = 0;
StopFlg = true;
return 0;
}
return CallNextHookEx(m_HookHandle, nCode, wParam, lParam);
}
程式 [MD5 : 3bf4c56247725d8437605e17189626ef]
Source Code [MD5 : 6301e4c7e651ffa46959259adbd21447]