WINCE勾子使用方法
更新时间:2023-06-04 09:50:01 阅读量: 实用文档 文档下载
- wince模拟器使用方法推荐度:
- 相关推荐
WINCE勾子使用方法
WINCE勾子使用方法
wince下支持三种钩子:
1.#define WH_JOURNALRECORD 0使应用程序可以监视输入事件。典型地,应用程序使用该HOOK记录鼠标、键盘输入事件以供以后回放。该HOOK是全局HOOK,并且不能在指定线程中使用。
2.#define WH_JOURNALPLAYBACK 1使应用程序可以向系统消息队列中插入消息。该HOOK可以回放以前由WH_JOURNALRECORD HOOK录制的鼠标、键盘输入事件。在WH_JOURNALPLAYBACK Hook安装到系统时,鼠标、键盘输入事件将被屏蔽。该HOOK同样是一个全局HOOK,不能在指定线程中使用。
WH_JOURNALPLAYBACK Hook返回一个时间暂停值,它告诉系统,在处理当前回放的消息时,系统等待百分之几秒。这使得此HOOK可以控制在回放时的时间事件
3.#define WH_KEYBOARD_LL 20
其中最常用的是键盘钩子,其它两个偶没有用过。
1. 设置钩子
通过SetWindowsHookEx ()函数。
2. 释放钩子
UnhookWindowsHookEx()函数。
3. 钩子进程
函数HookProc。
4. 调用下一个钩子函数
CallNexHookEx()函数。
钩子的建立
1. 建立一个动态连接库的.cpp文件。
// KeyBoardHook.cpp : Defines the entry point for the DLL application.
//
#include "stdafx.h"
#include "KeyBoardHook.h"
#include <Pwinuser.h>
#include "BasalMessage.h"
//#include "FileManage.h"
//告诉编译器将变量放入它自己的数据共享节中
#pragma data_seg("KeyHookData")
WINCE勾子使用方法
HINSTANCE hInst = NULL;
#pragma data_seg()
//告诉编译器设置共享节的访问方式为:读,写,共享
#pragma comment(linker, "/SECTION:KeyHookData,RWS")
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
hInst = (HINSTANCE)hModule;
break;
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
// This is an example of an exported variable
KEYBOARDHOOK_API int nKeyBoardHook=0;
// This is an example of an exported function.
KEYBOARDHOOK_API int fnKeyBoardHook(void)
{
return 42;
}
// This is the constructor of a class that has been exported.
WINCE勾子使用方法
// see KeyBoardHook.h for the class definition
CKeyBoardHook::CKeyBoardHook()
{
return;
}
extern "C" KEYBOARDHOOK_API void InstallHook(void)
{
if (hInst)
{
hKeyHook = SetWindowsHookEx(WH_KEYBOARD_LL, KeyBoardProc, hInst, 0); }
}
extern "C" KEYBOARDHOOK_API void UnHook(void)
{
if (hKeyHook)
{
UnhookWindowsHookEx(hKeyHook);
hKeyHook = NULL;
}
hInst = NULL;
}
extern "C" KEYBOARDHOOK_API LRESULT CALLBACK KeyBoardProc(int nCode, WPARAM wParam, LPARAM lParam)
{
TCHAR t_WndClassName[50] = { 0 };
HWND hCurActiveWnd = NULL;
HWND hCurForegroundWnd = NULL;
BOOL bIsTaskBarMsg = FALSE;
BOOL bIsOEMmsg = FALSE;
PKBDLLHOOKSTRUCT pkbhs = (PKBDLLHOOKSTRUCT)lParam;
WINCE勾子使用方法
if (WM_KEYDOWN == wParam)
{
uCount++;
RETAILMSG(1, (TEXT("WM_KEYDOWN vk %d "),pkbhs->vkCode));
//响应按键声,并限制需要向上Post的vkCode
switch (pkbhs->vkCode)
{
case VK_UP:
break;
case VK_DOWN:
break;
case VK_LEFT:
break;
case VK_RIGHT:
break;
case VK_OEM_SELECT:
bIsOEMmsg = TRUE;
break;
case VK_OEM_OK:
bIsOEMmsg = TRUE;
break;
case VK_OEM_BACK:
bIsOEMmsg = TRUE;
break;
case VK_OEM_DIAL:
bIsOEMmsg = TRUE;
break;
case VK_NUMPAD1:
case 0x31:
break;
case VK_NUMPAD2:
case 0x32:
break;
case VK_NUMPAD3:
case 0x33:
WINCE勾子使用方法
break;
case VK_NUMPAD4:
case 0x34:
break;
case VK_NUMPAD5:
case 0x35:
break;
case VK_NUMPAD6:
case 0x36:
break;
case VK_NUMPAD7:
case 0x37:
break;
case VK_NUMPAD8:
case 0x38:
break;
case VK_NUMPAD9:
case 0x39:
break;
case VK_NUMPAD0:
case 0x30:
break;
case VK_OEM_ASTERISK:
bIsOEMmsg = TRUE;
break;
case VK_OEM_POUND:
bIsOEMmsg = TRUE;
break;
case VK_OEM_SIDEUP:
bIsOEMmsg = TRUE;
break;
case VK_OEM_SIDEDOWN:
bIsOEMmsg = TRUE;
break;
case VK_OEM_CAMERA:
WINCE勾子使用方法
bIsOEMmsg = TRUE;
break;
default:
uCount = 0;
return CallNextHookEx(hKeyHook, nCode, wParam, lParam); //继续传递消息 }
if (bNeedPassOnceMsg)
{
return TRUE;
}
//只发送OEM消息,其它消息并不拦截。
//拦截原消息,发送自定义消息。
//限制需要向上Post的vkCode
switch (pkbhs->vkCode)
{
return CallNextHookEx(hKeyHook, nCode, wParam, (LPARAM)pkbhs); //转换为回车消息传递(未测试)
}
case VK_OEM_OK:
case VK_OEM_BACK:
case VK_OEM_DIAL:
case VK_OEM_DISCONNECT:
bIsOEMmsg = TRUE;
break;
case VK_NUMPAD1:
case VK_NUMPAD2:
case VK_NUMPAD3:
case VK_NUMPAD4:
case VK_NUMPAD5:
case VK_NUMPAD6:
case VK_NUMPAD7:
case VK_NUMPAD8:
case VK_NUMPAD9:
case VK_NUMPAD0:
WINCE勾子使用方法
case 0x30:
case 0x31:
case 0x32:
case 0x33:
case 0x34:
case 0x35:
case 0x36:
case 0x37:
case 0x38:
case 0x39:
break;
case VK_OEM_ASTERISK:
case VK_OEM_POUND:
case VK_OEM_SIDEUP:
case VK_OEM_SIDEDOWN:
case VK_OEM_CAMERA:
bIsOEMmsg = TRUE;
break;
default:
return CallNextHookEx(hKeyHook, nCode, wParam, lParam); //继续传递消息 }
//只发送OEM消息,其它消息并不拦截。
if (bOnlySendOEMMsg)
{
if (bIsOEMmsg)
{
PostMessage(hTopWnd, WM_USER_KEYUP, (WPARAM)(pkbhs->vkCode), (LPARAM)uCount);
return TRUE; //拦截OEM消息,不再向上传递此消息。 }
else
{
return CallNextHookEx(hKeyHook, nCode, wParam, lParam); //继续传递其它消息
}
WINCE勾子使用方法
}
//拦截原消息,发送自定义消息。
if (bHoldUpMsg)
{//菜单未弹出的情况
PostMessage(hTopWnd, WM_USER_KEYUP, (WPARAM)(pkbhs->vkCode), 0L); return TRUE; //拦截消息,不再向上传递此消息。
}
}
else
{
uCount = 0;
}
return CallNextHookEx(hKeyHook, nCode, wParam, lParam); //继续传递消息
}
extern "C" KEYBOARDHOOK_API void SetAppHWND(HWND hCurAppWnd)
{
hAppWnd = hCurAppWnd;
}
extern "C" KEYBOARDHOOK_API void SetTopHWND(HWND hCurTopWnd)
{
hTopWnd = hCurTopWnd;
}
extern "C" KEYBOARDHOOK_API void SetHoldUpMsg(BOOL bHoldUp)
{
bHoldUpMsg = bHoldUp;
}
extern "C" KEYBOARDHOOK_API void SetOnlySendOEMMsg(BOOL bOnlySendOEM) {
bOnlySendOEMMsg = bOnlySendOEM;
WINCE勾子使用方法
}
extern "C" KEYBOARDHOOK_API void SetNeedPassOnceMsg(BOOL bWhetherNeed) {
bNeedPassOnceMsg = bWhetherNeed;
}
2. 建立头文件
// The following ifdef block is the standard way of creating macros which make exporting // from a DLL simpler. All files within this DLL are compiled with the
KEYBOARDHOOK_EXPORTS
// symbol defined on the command line. this symbol should not be defined on any project // that uses this DLL. This way any other project whose source files include this file see // KEYBOARDHOOK_API functions as being imported from a DLL, wheras this DLL sees symbols
// defined with this macro as being exported.
#ifdef KEYBOARDHOOK_EXPORTS
#define KEYBOARDHOOK_API __declspec(dllexport)
#else
#define KEYBOARDHOOK_API __declspec(dllimport)
#endif
// This class is exported from the KeyBoardHook.dll
class KEYBOARDHOOK_API CKeyBoardHook {
public:
CKeyBoardHook(void);
// TODO: add your methods here.
};
extern KEYBOARDHOOK_API int nKeyBoardHook;
KEYBOARDHOOK_API int fnKeyBoardHook(void);
extern "C" KEYBOARDHOOK_API void InstallHook(void);
extern "C" KEYBOARDHOOK_API void UnHook(void);
WINCE勾子使用方法
extern "C" KEYBOARDHOOK_API LRESULT CALLBACK KeyBoardProc(int nCode, WPARAM wParam, LPARAM lParam);
extern "C" KEYBOARDHOOK_API void SetAppHWND(HWND hCurAppWnd);
extern "C" KEYBOARDHOOK_API void SetTopHWND(HWND hCurTopWnd);
extern "C" KEYBOARDHOOK_API void SetHoldUpMsg(BOOL bHoldUp);
extern "C" KEYBOARDHOOK_API void SetOnlySendOEMMsg(BOOL bOnlySendOEM); extern "C" KEYBOARDHOOK_API void SetNeedPassOnceMsg(BOOL bWhetherNeed);
3. 建立程序主文件
if (hModule)
{
InHook = (pInstallHook)GetProcAddress(hModule, L"InstallHook");
UnHook = (pUnHook)GetProcAddress(hModule, L"UnHook");
SetAppHWND = (pSetAppHWND)GetProcAddress(hModule, L"SetAppHWND"); SetTopHWND = (pSetTopHWND)GetProcAddress(hModule, L"SetTopHWND"); SetHoldUpMsg = (pSetHoldUpMsg)GetProcAddress(hModule, L"SetHoldUpMsg"); SetOnlySendOEMMsg = (pSetOnlySendOEMMsg)GetProcAddress(hModule,
L"SetOnlySendOEMMsg");
SetNeedPassOnceMsg = (pSetNeedPassOnceMsg)GetProcAddress(hModule,
L"SetNeedPassOnceMsg");
if (!InHook || !UnHook || !SetAppHWND || !SetTopHWND || !SetHoldUpMsg
|| !SetOnlySendOEMMsg || !SetNeedPassOnceMsg)
{
MessageBoxEx(hWnd, L"KeyboardHook.dll加载失败,程序被终止。", L"Info", MB_OK);
PostQuitMessage(0);
}
}
else
{
MessageBoxEx(hWnd, L"KeyboardHook.dll加载失败,程序被终止。", L"Info", MB_OK); PostQuitMessage(0);
}
InHook();
WINCE勾子使用方法
DLL的编写,也可以参考以下网址中的内容:
/Article/kfyy/cyy/jszl/200709/6328_2.html
WinCE上支持三种类型的Hook
#define WH_JOURNALRECORD 0
#define WH_JOURNALPLAYBACK 1
#define WH_KEYBOARD_LL 20
不过前两个使用的时候是使用如下函数:
QASetWindowsJournalHook
QAUnhookWindowsJournalHook
后者使用SetWindowsHookExW和UnhookWindowsHookEx
正在阅读:
WINCE勾子使用方法06-04
2018高中数学第二章统计22用样本归结总体221用样本的频率分布估计总体新人教B版3!12-21
广东省珠海市11-12学年高一上学期期末质量监测试题地理 - 图文12-21
企业知识产权管理工作手册(参考模板)04-09
品德与社会三下教案07-01
普通高中和中专哪一个好03-30
大学生意识形态安全教育思考09-25
感谢有你在我生命中02-06
中国XX大学地源热泵中央空调系统运行管理指导书 - 图文04-17
战争与和平好词好句02-21
- 教学能力大赛决赛获奖-教学实施报告-(完整图文版)
- 互联网+数据中心行业分析报告
- 2017上海杨浦区高三一模数学试题及答案
- 招商部差旅接待管理制度(4-25)
- 学生游玩安全注意事项
- 学生信息管理系统(文档模板供参考)
- 叉车门架有限元分析及系统设计
- 2014帮助残疾人志愿者服务情况记录
- 叶绿体中色素的提取和分离实验
- 中国食物成分表2020年最新权威完整改进版
- 推动国土资源领域生态文明建设
- 给水管道冲洗和消毒记录
- 计算机软件专业自我评价
- 高中数学必修1-5知识点归纳
- 2018-2022年中国第五代移动通信技术(5G)产业深度分析及发展前景研究报告发展趋势(目录)
- 生产车间巡查制度
- 2018版中国光热发电行业深度研究报告目录
- (通用)2019年中考数学总复习 第一章 第四节 数的开方与二次根式课件
- 2017_2018学年高中语文第二单元第4课说数课件粤教版
- 上市新药Lumateperone(卢美哌隆)合成检索总结报告
- 使用方法
- WINCE
- 勾子
- 超级短线指标-尾盘进,明天卖-准确概
- 第一章 建筑工程概预算综述
- Seasonal variation in he Yellow Sea derived from satellite altimetric data
- 论图书馆员的职业道德与读者服务工作
- 毕业设计文献翻译热电偶温度传感器
- 3维地理信息Web服务集成研究
- 基层党组织工作细则(试行)
- 初中化学京改版(2013)九年级上册第5章化学元素与物质组成的表示第一节初步认识化学元素测试
- 2007年高一数学第二学期同步检测 平面向量(一)(B卷)
- 9月开学典礼主持词
- 园林景观与绿化工程监理细则
- 张掖市动物疫病防治现状及对策(2014.5定稿)
- 江苏省常州市武进高中2013-2014学年高二(上)期中生物试卷(必修)(解析版)
- 临床医学神经病学试卷A
- 苏教版英语四下知识点归纳复习完整版
- TS22163评估表 V3.0)
- 曾国藩的用人艺术
- 第六章《汉书》及东汉散文 Microsoft PowerPoint 演示文稿
- 地下隧洞施工超前地质预报方法分析与总结
- 甲醇液相氧化羰基化合成碳酸二甲酯催化剂的研究进展