现在的位置: 首页 > 综合 > 正文

win32程序测试键盘钩子

2012年09月28日 ⁄ 综合 ⁄ 共 2223字 ⁄ 字号 评论关闭
// Test_Hook.cpp : 定义控制台应用程序的入口点。
//


#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 hook




BOOL 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参数包含了键盘按键消息
	if (nCode == HC_ACTION) 
	{
		if (::GetAsyncKeyState('1') & 0x8000)
		{
			odprintf("111111111111111111");
		}
		//判断函数调用时指定虚拟键的状态
		//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!");		//这里会出现两次, 因为
			return 1; 
		}


	}


	// Call next hook in chain
	return ::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 code
		return 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 here
		g_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;
}

抱歉!评论已关闭.