// dllHookkb.cpp : Defines the entry point for the DLL application.
//
#include "stdafx.h"
#include "dllHookkb.h"
#ifdef _MANAGED
#pragma managed(push, off)
#endif
#pragma data_seg("YCIShared2010")
HWND g_hWndCaller = NULL;
HHOOK g_hHook = NULL;
#pragma data_seg()
BOOL APIENTRY DllMain( HMODULE hModule,
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
}
#ifdef _MANAGED
#pragma managed(pop)
#endif
// This is an example of an exported variable
DLLHOOKKB_API int ndllHookkb=0;
// This is an example of an exported function.
DLLHOOKKB_API int fndllHookkb(void)
{
return 42;
}
// This is the constructor of a class that has been exported.
// see dllHookkb.h for the class definition
CdllHookkb::CdllHookkb()
{
return;
}
//通过内存地址取得模块句柄的函数
HMODULE WINAPI ModuleFromAddress(PVOID pv)
{
MEMORY_BASIC_INFORMATION mbi;
if (::VirtualQuery(pv, &mbi, sizeof(mbi)) != 0)
{
return (HMODULE)mbi.AllocationBase;
}
else
{
return NULL;
}
}
//键盘钩子函数
LRESULT CALLBACK KeyHookProc(int nCode, WPARAM wParam, LPARAM lParam)
{
if (nCode < 0 || nCode == HC_NOREMOVE)
{
return ::CallNextHookEx(g_hHook, nCode, wParam, lParam);
}
if (lParam & 0x40000000)//重复的消息交给下一个hook链
{
return ::CallNextHookEx(g_hHook, nCode, wParam, lParam);
}
//通知主窗口,wParam参数为虚拟键码,lParam参数包含了此键的信息
::PostMessage(g_hWndCaller, HM_KEY, wParam, lParam);
return ::CallNextHookEx(g_hHook, nCode, wParam, lParam);
}
//安装,卸载钩子的函数
DLLHOOKKB_API BOOL WINAPI SetKeyHook(BOOL bInstall, DWORD dwThreadId, HWND hWndCaller)
{
BOOL bOk;
g_hWndCaller = hWndCaller;
if (bInstall)
{
g_hHook = ::SetWindowsHookEx(WH_KEYBOARD, KeyHookProc, ModuleFromAddress(KeyHookProc), dwThreadId);
bOk = (g_hHook != NULL);
}
else
{
bOk = ::UnhookWindowsHookEx(g_hHook);
g_hHook = NULL;
}
return bOk;
}