7,657
社区成员
发帖
与我相关
我的任务
分享
#ifndef _WINCE_KB_HOOK_H
#define _WINCE_KB_HOOK_H
//used for passing to SetWindowsHookEx funtion to set a Low level (LL) keyboard hook
#define WH_KEYBOARD_LL 20
#define WINCEKBHOOK_API extern "C" __declspec(dllexport)
// Define the function types used by hooks
typedef LRESULT (CALLBACK* HOOKPROC)(int code, WPARAM wParam, LPARAM lParam);
typedef HHOOK (WINAPI *_SetWindowsHookExW)(int, HOOKPROC, HINSTANCE, DWORD);
typedef LRESULT (WINAPI *_CallNextHookEx)(HHOOK, int, WPARAM, LPARAM);
typedef LRESULT (WINAPI *_UnhookWindowsHookEx)(HHOOK);
// For the low level keyboard hook, your keyboards procedures is passed a pointer to KBDLLHOOKSTRUCT instance
typedef struct {
DWORD vkCode;
DWORD scanCode;
DWORD flags;
DWORD time;
ULONG_PTR dwExtraInfo;
} KBDLLHOOKSTRUCT, *PKBDLLHOOKSTRUCT;
// Win32 Hook APIs
static _SetWindowsHookExW SetWindowsHookEx;
static _UnhookWindowsHookEx UnhookWindowsHookEx;
static _CallNextHookEx CallNextHookEx;
//StartHook用来供外部调用
WINCEKBHOOK_API bool StartHook(HINSTANCE hInstance);
WINCEKBHOOK_API BOOL ActivateKBHook(HINSTANCE hInstance, HOOKPROC LLKeyboardHookCallbackFunction);
#endif
#include "stdafx.h"
#include <windows.h>
#include "winceKBhook.h"
#include "ras.h"
//globals
HINSTANCE g_hHookApiDLL = NULL; //handle to coredll.dll, where all the hook related APIs are present
HHOOK g_hInstalledLLKBDhook = NULL; //g_hInstalledLLKBDhook represents handle to the installed KB hook
//定义要屏蔽的键
int BlockKeyList[] = {VK_TBACK,VK_TTALK,VK_TEND,VK_THOME};
LRESULT CALLBACK LLKeyboardHookCallbackFunction(int nCode, WPARAM wParam, LPARAM lParam)
{
int countKeyList =4;
for(int i=0;i<countKeyList;i++)
{
//如果是屏蔽的键,则返回
if((((KBDLLHOOKSTRUCT*)lParam)->vkCode) == BlockKeyList[i])
{
return TRUE;
}
}
return CallNextHookEx(g_hInstalledLLKBDhook, nCode, wParam, lParam);
}
WINCEKBHOOK_API bool StartHook(HINSTANCE hInstance)
{
ActivateKBHook(hInstance,LLKeyboardHookCallbackFunction);
return true;
}
WINCEKBHOOK_API BOOL ActivateKBHook(HINSTANCE hInstance, HOOKPROC LLKeyboardHookCallbackFunction)
{
SetWindowsHookEx = NULL;
CallNextHookEx = NULL;
UnhookWindowsHookEx = NULL;
//now load the coredll.dll
g_hHookApiDLL = LoadLibrary(_T("coredll.dll"));
if(g_hHookApiDLL == NULL)
{
return false;
}
else
{
SetWindowsHookEx = (_SetWindowsHookExW)GetProcAddress(g_hHookApiDLL, _T("SetWindowsHookExW"));
if(SetWindowsHookEx == NULL)
{
//this means that MS has really stopped supporting this API in WinCE
return false;
}
else
{
g_hInstalledLLKBDhook = SetWindowsHookEx(WH_KEYBOARD_LL, LLKeyboardHookCallbackFunction, hInstance, 0);
if(g_hInstalledLLKBDhook == NULL)
{
return false;
}
}
CallNextHookEx = (_CallNextHookEx)GetProcAddress(g_hHookApiDLL, _T("CallNextHookEx"));
if(CallNextHookEx == NULL)
{
return false;
}
UnhookWindowsHookEx = (_UnhookWindowsHookEx)GetProcAddress(g_hHookApiDLL, _T("UnhookWindowsHookEx"));
if(UnhookWindowsHookEx == NULL)
{
return false;
}
}
//all the APIs are loaded and the application is hooked
return true;
}
HINSTANCE h=LoadLibrary(_T("HookDll.dll"));
if(h!=NULL)
{
typedef bool (*FUNCTION)(HINSTANCE hInstance);
FUNCTION p=(FUNCTION)GetProcAddress(h,_T("StartHook"));
//运行看起来没什么问题,不过没任何效果,所有键都还正常可以用
p(theApp.m_hInstance);
FreeLibrary(h);
}