win32程序测试键盘钩子
生活随笔
收集整理的這篇文章主要介紹了
win32程序测试键盘钩子
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
// Test_Hook.cpp : 定義控制臺應(yīng)用程序的入口點。
//#include "stdafx.h"
#include <Windows.h>
#include <stdio.h>
#include <stdarg.h>
#include <ctype.h>
#include <WinError.h>// Some global variables
HINSTANCE g_Instance; // Handler of current instance
HHOOK g_Hook; // Handler of hookBOOL SetHook();
BOOL UnSetHook();// The hook function (will be called by other processes)
static LRESULT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam);//
//odprintf -- debug function
void __cdecl odprintf(const char* fmt, ...)
{char buf[4096], *p = buf;va_list args;va_start(args, fmt);p += vsnprintf_s(p, sizeof(buf), _TRUNCATE, fmt, args);va_end(args);while ( p > buf && isspace(p[-1]) )*--p = '\0';*p++ = '\r';*p++ = '\n';*p = '\0';OutputDebugStringA(buf); //output as ANSI string //OutputDebugString
}LRESULT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
{KBDLLHOOKSTRUCT* pkh = (KBDLLHOOKSTRUCT*)lParam;//HC_ACTION: wParam 和lParam參數(shù)包含了鍵盤按鍵消息if (nCode == HC_ACTION) {if (::GetAsyncKeyState('1') & 0x8000){odprintf("111111111111111111");}//判斷函數(shù)調(diào)用時指定虛擬鍵的狀態(tài)//BOOL bCtrlKey = ::GetAsyncKeyState(VK_CONTROL) & 0x8000;BOOL bCtrlKey = ::GetAsyncKeyState(VK_CONTROL)>>((sizeof(SHORT) * 8) - 1);if ((pkh->vkCode == VK_ESCAPE && bCtrlKey) || // Ctrl+Esc 開始菜單(pkh->vkCode == VK_TAB && pkh->flags & LLKHF_ALTDOWN) || // Alt+TAB 屏幕切換菜單(pkh->vkCode == VK_ESCAPE && pkh->flags & LLKHF_ALTDOWN) || // Alt+Esc 屏幕切換 (pkh->vkCode == VK_LWIN || pkh->vkCode==VK_RWIN) // 左右Windows鍵) { odprintf("ok...i'am come here!"); //這里會出現(xiàn)兩次, 因為return 1; }}// Call next hook in chainreturn ::CallNextHookEx(g_Hook, nCode, wParam, lParam);
}BOOL SetHook()
{if (g_Instance || g_Hook) // Already hooked!return TRUE;g_Instance = (HINSTANCE)::GetModuleHandle(NULL);g_Hook = ::SetWindowsHookEx(WH_KEYBOARD_LL, (HOOKPROC)KeyboardProc, g_Instance, 0);if (!g_Hook){odprintf("SetHook error, error code=%ld", ::GetLastError()); //error codereturn FALSE;}return TRUE; // Hook has been created correctly
}BOOL UnSetHook()
{if (g_Hook) { // Check if hook handler is valid::UnhookWindowsHookEx(g_Hook); // Unhook is done hereg_Hook = NULL; // Remove hook handler to avoid to use it again}return TRUE; // Hook has been removed
}int _tmain(int argc, _TCHAR* argv[])
{odprintf("Test of KeyboardProc, starting...");if (!SetHook())return -1;MSG msg;while(::GetMessage(&msg, NULL, 0, 0) > 0){TranslateMessage(&msg);DispatchMessage(&msg);}//clean:UnSetHook();return 0;
}
總結(jié)
以上是生活随笔為你收集整理的win32程序测试键盘钩子的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++ 输出调试信息 类似MFC的TRA
- 下一篇: 快手年龄怎么隐藏