WinKeyHook.cpp:
// WinKeyHook.cpp : 定义 DLL 的初始化例程。
//
#include “stdafx.h“
#include <afxdllx.h>
#include “.\winkeyhook.h“
#include <winuser.h>
#include <winable.h>
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
#pragma data_seg (“sharedata“)
HWND glhPrevTarWnd = NULL;
HWND glhDisplayWnd = NULL;
HHOOK glhHook = NULL;
HINSTANCE glhInstance = NULL;
#pragma data_seg()
static AFX_EXTENSION_MODULE WinKeyHookDLL = { NULL, NULL };
LRESULT CALLBACK KeyboardProc(int code, WPARAM wParam, LPARAM lParam);
extern “C“ int APIENTRY
DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
{
// 如果使用 lpReserved,请将此移除
UNREFERENCED_PARAMETER(lpReserved);
if (dwReason == DLL_PROCESS_ATTACH)
{
TRACE0(“WinKeyHook.DLL 正在初始化!\n“);
// 扩展 DLL 一次性初始化
if (!AfxInitExtensionModule(WinKeyHookDLL, hInstance))
return 0;
// 将此 DLL 插入到资源链中
// 注意: 如果此扩展 DLL 由
// MFC 规则 DLL(如 ActiveX 控件)隐式链接到
// 而不是由 MFC 应用程序链接到,则需要
// 将此行从 DllMain 中移除并将其放置在一个
// 从此扩展 DLL 导出的单独的函数中。使用此扩展 DLL 的
// 规则 DLL 然后应显式
// 调用该函数以初始化此扩展 DLL。否则,
// CDynLinkLibrary 对象不会附加到
// 规则 DLL 的资源链,并将导致严重的
// 问题。
new CDynLinkLibrary(WinKeyHookDLL);
glhInstance = hInstance;
}
else if (dwReason == DLL_PROCESS_DETACH)
{
TRACE0(“WinKeyHook.DLL 正在终止!\n“);
// 在调用析构函数之前终止该库
AfxTermExtensionModule(WinKeyHookDLL);
}
return 1; // 确定
}
CWinKeyHook::CWinKeyHook(void)
{
}
CWinKeyHook::~CWinKeyHook(void)
{
CloseKeyboardHook ();
}
LRESULT CALLBACK LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
{
PKBDLLHOOKSTRUCT pKb = NULL;
pKb = (PKBDLLHOOKSTRUCT)lParam;
/*INPUT iPt;
KEYBDINPUT kbInput;
kbInput.wVk = VK_NUMPAD7;
kbInput.wScan = 0;
kbInput.dwFlags = 0;
kbInput.dwExtraInfo = NULL;
kbInput.time = 0;
iPt.ki = kbInput;
iPt.type = INPUT_KEYBOARD;*/
if (nCode >= 0)
{
switch (wParam)
{
case WM_KEYUP:
{
#ifdef _DEBUG
afxDump << pKb->vkCode << “\n“;
#endif
if (pKb->vkCode == VK_LWIN)
{
return TRUE;
}
if (pKb->vkCode == 192)
{
//#ifdef _DEBUG
// if (SendInput (1, &iPt, sizeof (iPt)))
// {
// afxDump << “发送按键信息成功“ << “\n“;
// }
//#else
//keybd_event (VK_NUMPAD7, 0, 0, 0);
//#endif
return TRUE;
}
return TRUE;
}
}
}
return CallNextHookEx (glhHook, nCode, wParam, lParam);
}
BOOL CWinKeyHook::InitKeyboardHook(HWND hWnd)
{
BOOL bResult = FALSE;
if (!glhHook)
{
glhHook = SetWindowsHookEx (WH_KEYBOARD_LL, LowLevelKeyboardProc, glhInstance, 0);
}
else
{
return bResult;
}
if (glhHook != NULL)
{
bResult = TRUE;
}
glhDisplayWnd = hWnd;
return bResult;
}
BOOL CWinKeyHook::CloseKeyboardHook(void)
{
BOOL bResult = FALSE;
if (glhHook)
{
bResult = UnhookWindowsHookEx (glhHook);
}
if (bResult)
{
glhPrevTarWnd = NULL;
glhDisplayWnd = NULL;
glhHook = NULL;
}
return bResult;
}