关于windows钩子。。

我做好了DLL动态文件库。
代码:
// KeyHookLib.cpp : 定义 DLL 应用程序的导出函数。
//
#include "stdafx.h"
#include "KeyHookLib.h"
#include <IOSTREAM>
using namespace std;
// 共享数据段
#pragma data_seg("YCIShared")
HWND g_hWndCaller = NULL;
HHOOK g_hHook = NULL;
#pragma data_seg()
LRESULT CALLBACK KeyHookProc(int nCode, WPARAM wParam, LPARAM lParam);

// 一个通过内存地址取得模块句柄的帮助函数。
HMODULE WINAPI ModuleFromAddress(PVOID pv)
{
MEMORY_BASIC_INFORMATION mbi;
if(VirtualQuery(pv,&mbi,sizeof(mbi)) != 0)
{
return (HMODULE)mbi.AllocationBase;
}else
{
return NULL;
}
}

// 安装钩子,卸载钩子的函数
BOOL WINAPI SetKeyHook(
BOOL bInstall, // 安装还是卸载已安装的钩子
DWORD dwThreadId, // 目标线程的ID
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;
}
// 键盘钩子函数
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);
}

现在我要用控制台要调用这个钩子而不是MFC。不知道怎么调出这个键码虚拟值。大神求教

WH_KEYBOARD只能获取调用GetMessage或者PeekMessage时得到的WM_KEYDOWN和WM_KEYUP消息。由于控制台没有消息循环,因此你在控制台按键时没有产生WM_KEYUP和WM_KEYDOWN消息,你的WH_KEYBOARD钩子也不会截取到键击消息。
可以试试WH_KEYBOARD_LL类型的钩子,此钩子钩取键盘的位置相对更底层,是在Win32子系统获取输入消息时获取的,因此理论上可以获取几乎所有键击信息。但是安装这个钩子需要管理员权限,相对也敏感,并且只能是全局类型的,也就是系统会话范围内所有的键击消息你必须都得处理。
另外,无论你安装的是什么类型的钩子,安装钩子的线程一旦退出,钩子就会被卸载。
温馨提示:答案为网友推荐,仅供参考