wince hook键盘按下捕捉不了

sb3day 2011-01-13 03:37:35
hook的dll代码:
#include "stdafx.h"
#include "KeyDetProc.h"

#define DEBUG_CODE 1
#define WH_KEYBOARD_LL 20
typedef LRESULT (WINAPI *_CallNextHookEx)(HHOOK, int, WPARAM, LPARAM);
typedef LRESULT (WINAPI *_UnhookWindowsHookEx)(HHOOK);
typedef LRESULT (CALLBACK* HOOKPROC)(int code, WPARAM wParam, LPARAM lParam);
typedef HHOOK (WINAPI *_SetWindowsHookExW)(int, HOOKPROC, HINSTANCE, DWORD);

static _CallNextHookEx CallNextHookEx;
static _SetWindowsHookExW SetWindowsHookEx;
static _UnhookWindowsHookEx UnhookWindowsHookEx;
typedef struct {
DWORD vkCode;
DWORD scanCode;
DWORD flags;
DWORD time;
ULONG_PTR dwExtraInfo;
} KBDLLHOOKSTRUCT, *PKBDLLHOOKSTRUCT;

//LRESULT __declspec(dllexport)__stdcall CALLBACK KeyboardProc(int nCode,WPARAM wParam,LPARAM lParam)
extern "C" LRESULT CALLBACK KeyboardProc(int nCode,WPARAM wParam,LPARAM lParam)
{
RETAILMSG(DEBUG_CODE,(L"hook KeyboardProc\r\n"));
KBDLLHOOKSTRUCT *pkbhs = (KBDLLHOOKSTRUCT *) lParam;
if(wParam == WM_KEYUP)
{
RETAILMSG(DEBUG_CODE,(L"hook key up\r\n"));
}
if(wParam == WM_KEYDOWN)
{
RETAILMSG(DEBUG_CODE,(L"hook key down\r\n"));
}
RETAILMSG(1,(L"Get a Key\r\n"));
return CallNextHookEx(NULL,nCode,wParam,lParam);
}

HINSTANCE g_hHookApiDLL = NULL;
HINSTANCE hins;
HHOOK g_hInstalledLLKBDhook = NULL;
//BOOL ActivateKBHook(HINSTANCE hInstance, HOOKPROC LLKeyboardHookCallbackFunction)
BOOL KeyDetProc_InsHook(void)
{
RETAILMSG(DEBUG_CODE,(L"DLL:KeyDetProc_InsHook \r\n"));
//RETAILMSG(DEBUG_CODE,(L"进入ActivateKBHook\r\n"));
//we need to manually load these standard Win32 API calls
//MSDN states that these aren't supported in WinCE
SetWindowsHookEx = NULL;
CallNextHookEx = NULL;
UnhookWindowsHookEx = NULL;

//now load the coredll.dll
g_hHookApiDLL = LoadLibrary(_T("coredll.dll"));
if(g_hHookApiDLL == NULL)
{
//something is awfully wrong
//the dll has to be present
RETAILMSG(DEBUG_CODE,(L"load coredll.dll fail\r\n"));
return false;
}
else
{
RETAILMSG(DEBUG_CODE,(L"LoadLibrary coredll.dll ok \r\n"));
//load the SetWindowsHookEx API call
//the SetWindowsHookEx function installs an application-defined hook procedure into a hook chain.
//You would install a hook procedure to monitor the system for certain types of events.
//here we use use the hook to monitor kyeboard events
SetWindowsHookEx = (_SetWindowsHookExW)GetProcAddress(g_hHookApiDLL, _T("SetWindowsHookExW"));
if(SetWindowsHookEx == NULL)
{
//this means that MS has really stopped supporting this API in WinCE
RETAILMSG(DEBUG_CODE,(L"获取SetWindowsHookExW地址失败\r\n"));
return false;
}
else
{
//install the KB hook
//the hande needs to be saved for default processing of the events and to uninstall the hook, once we are done with it
hins = AfxGetInstanceHandle();
g_hInstalledLLKBDhook = SetWindowsHookEx(WH_KEYBOARD_LL, KeyboardProc, hins, 0);
if(g_hInstalledLLKBDhook == NULL)
{
int re;
re=GetLastError();
RETAILMSG(DEBUG_CODE,(L"SetWindowsHookEx失败 %d \r\n",re));
return false;
}
}

//load CallNextHookEx() API call
//the CallNextHookEx function passes the hook information to the next hook procedure in the current hook chain.
//we use this call for default processing of events.
CallNextHookEx = (_CallNextHookEx)GetProcAddress(g_hHookApiDLL, _T("CallNextHookEx"));
if(CallNextHookEx == NULL)
{
RETAILMSG(DEBUG_CODE,(L"获取_CallNextHookEx地址失败\r\n"));
return false;
}

//load UnhookWindowsHookEx() API
//the UnhookWindowsHookEx function removes a hook procedure installed in a hook chain by the SetWindowsHookEx function.
//we use this call to unistall the hook.
UnhookWindowsHookEx = (_UnhookWindowsHookEx)GetProcAddress(g_hHookApiDLL, _T("UnhookWindowsHookEx"));
if(UnhookWindowsHookEx == NULL)
{
RETAILMSG(DEBUG_CODE,(L"获取_UnhookWindowsHookEx地址失败\r\n"));
return false;
}
}

//all the APIs are loaded and the application is hooked
return true;
}

BOOL KeyDetProc_UnHook(void)
{
UnhookWindowsHookEx(g_hInstalledLLKBDhook);
RETAILMSG(1,(L"unhook kb ok\r\n"));
return TRUE;
}

可以成功加载dll里的函数KeyDetProc_InsHook,但是键盘按下时KeyboardProc竟然不能进入,求解决方法.
或是有一个hook键盘的例子我参考一下
...全文
223 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
sb3day 2011-01-24
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 wjc13142yiyan 的回复:]
LZ,你可以去我在CSDN的BLOG里看看,有一个例子。
[/Quote]兄弟,你没写blog啊.
没钱吃饭 2011-01-24
  • 打赏
  • 举报
回复
LZ,你可以去我在CSDN的BLOG里看看,有一个例子。
sb3day 2011-01-24
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 arabicsara 的回复:]
lz还有话要说?我帮你垫一层
[/Quote]谢谢啊.最后一个问题:怎么把hook.dll里得到的数据传给应用程序,比如通知主程序现在按下了什么键
arabicsara 2011-01-21
  • 打赏
  • 举报
回复
lz还有话要说?我帮你垫一层
sb3day 2011-01-13
  • 打赏
  • 举报
回复
LRESULT CALLBACK KeyboardProc(int nCode,WPARAM wParam,LPARAM lParam)
{
// RETAILMSG(DEBUG_CODE,(L"hook KeyboardProc\r\n"));
KBDLLHOOKSTRUCT *pkbhs = (KBDLLHOOKSTRUCT *) lParam;
if(wParam == WM_KEYUP)
{

RETAILMSG(DEBUG_CODE,(L"hook key up\r\n"));
}
if(wParam == WM_KEYDOWN)
{
RETAILMSG(DEBUG_CODE,(L"hook key down\r\n"));
}
RETAILMSG(1,(L"hook Get a Key\r\n"));
return 1L;//CallNextHookEx(NULL,nCode,wParam,lParam);
}
为什么这样子改一下就没有内存泄露了,wParam == WM_KEYUP和if(wParam == WM_KEYDOWN) 为什么都进入不了?
sb3day 2011-01-13
  • 打赏
  • 举报
回复
现在可以hook到了,我改在应用程序SetWindowsHookEx了

不过有bug:

hook KeyboardProc
hook key up
hook Get a Key
Prefetch Abort: Thread=83986170 Proc=80426ae0 'testKeydet.exe'
AKY=00000401 PC=00000000(???+0x00000000) RA=01bd1668(keydet.dll+0x00001668) BVA=00000000 FSR=00000005

sb3day 2011-01-13
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 91program 的回复:]
LZ,你可以去我在CSDN的BLOG里看看,有一个例子。
[/Quote]谢谢,你的博客有十页呢,还没找到有关hook的,csdn的搜索功能不给力啊..
91program 2011-01-13
  • 打赏
  • 举报
回复
LZ,你可以去我在CSDN的BLOG里看看,有一个例子。

19,504

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 嵌入开发(WinCE)
社区管理员
  • 嵌入开发(WinCE)社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧