第九章 keyhookdll windows程序设计王艳平版
// KeyHookLib.h文件
// 定義函數(shù)修飾宏,方便引用本DLL工程的導(dǎo)出函數(shù)
#ifdef KEYHOOKLIB_EXPORTS
#define KEYHOOKLIB_API __declspec(dllexport)
#else
#define KEYHOOKLIB_API __declspec(dllimport)
#endif
// 自定義與主程序通信的消息
#define HM_KEY WM_USER + 101
// 聲明要導(dǎo)出的函數(shù)
BOOL KEYHOOKLIB_API WINAPI SetKeyHook(BOOL bInstall,?
? ? ?DWORD dwThreadId = 0, HWND hWndCaller = NULL);
EXPORTS
? ?SetKeyHook
SECTIONS
YCIShared ? Read Write Shared
// KeyHookLib.cpp文件
#include <windows.h>
#define KEYHOOKLIB_EXPORTS
#include "KeyHookLib.h"
// 共享數(shù)據(jù)段
#pragma data_seg("YCIShared")
HWND g_hWndCaller = NULL; // 保存主窗口句柄
HHOOK g_hHook = NULL; // 保存鉤子句柄
#pragma data_seg()
// 一個通過內(nèi)存地址取得模塊句柄的幫助函數(shù)
HMODULE WINAPI ModuleFromAddress(PVOID pv)?
{
MEMORY_BASIC_INFORMATION mbi;
if(::VirtualQuery(pv, &mbi, sizeof(mbi)) != 0)
{
return (HMODULE)mbi.AllocationBase;
}
else
{
return NULL;
}
}
// 鍵盤鉤子函數(shù)
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) // 消息重復(fù)就交給下一個hook鏈
{
return ::CallNextHookEx(g_hHook, nCode, wParam, lParam);
}
// 通知主窗口。wParam參數(shù)為虛擬鍵碼, lParam參數(shù)包含了此鍵的信息
? ? ? ? ::PostMessage(g_hWndCaller, HM_KEY, wParam, lParam);
? ? ? ? return ::CallNextHookEx(g_hHook, nCode, wParam, lParam);
}
// 安裝、卸載鉤子的函數(shù)
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;
}
總結(jié)
以上是生活随笔為你收集整理的第九章 keyhookdll windows程序设计王艳平版的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: HTML布局之左右布局
- 下一篇: LeetCode 738 单调递增的数字