`
mmdev
  • 浏览: 13296256 次
  • 性别: Icon_minigender_1
  • 来自: 大连
文章分类
社区版块
存档分类
最新评论

Windows Mobile上使用钩子

阅读更多

wince系统对于钩子技术的支持,显然不及windows。有一些技术文档干脆说wince不支持钩子。其实,不尽然。我们还是可以从coredll.dll中,得到一些有用的接口,来实现拦截一些简单的键盘或鼠标的动作。

还是代码最有说服力:

#define WH_JOURNALRECORD 0
#define WH_JOURNALPLAYBACK 1
#define WH_KEYBOARD_LL 20

#define HC_ACTION 0

typedef LRESULT (CALLBACK* HOOKPROC)(int code, WPARAM wParam, LPARAM lParam);
typedef HHOOK (WINAPI *_SetWindowsHookExW)(int, HOOKPROC, HINSTANCE, DWORD);
typedef LRESULT (WINAPI *_CallNextHookEx)(HHOOK, int, WPARAM, LPARAM);
typedef LRESULT (WINAPI *_UnhookWindowsHookEx)(HHOOK);

static _SetWindowsHookExW SetHook;
static _UnhookWindowsHookEx UnhookHook;
static _CallNextHookEx CallNextHook;

HINSTANCE g_hHookApiDll = NULL;
HHOOK g_hKbdHook = NULL;
HHOOK g_hMouseHook = NULL;

LRESULT CALLBACK KbdHookCallback(int nCode, WPARAM wParam, LPARAM lParam);
LRESULT CALLBACK MouseHookCallback(int nCode, WPARAM wParam, LPARAM lParam);

BOOL ActivateHook(HINSTANCE hInstance, HOOKPROC HookCallback);
BOOL DeactivateHook();

BOOL ActivateHook(HINSTANCE hInstance, HOOKPROC hookProc)
{
SetHook = NULL;
CallNextHook = NULL;
UnhookHook = NULL;

EVENTMSG msg = {HC_ACTION};
g_hMouseHook = QASetWindowsJournalHook(WH_JOURNALRECORD, MouseHookCallback, &msg);//这个是针对鼠标的

if(NULL == g_hMouseHook )
{
return FALSE;
}

g_hHookApiDll = LoadLibrary(_T("coredll.dll"));
if(NULL == g_hHookApiDll)
{
return FALSE;
}

SetHook = (_SetWindowsHookExW)GetProcAddress(g_hHookApiDll, _T("SetWindowsHookExW"));
if(NULL == SetHook)
{
return FALSE;
}

g_hKbdHook = SetHook(WH_KEYBOARD_LL, hookProc, hInstance, 0);
if(NULL == g_hKbdHook)
{
return FALSE;
}

CallNextHook = (_CallNextHookEx)GetProcAddress(g_hHookApiDll, _T("CallNextHookEx"));
if(NULL == CallNextHook)
{
return FALSE;
}

UnhookHook = (_UnhookWindowsHookEx)GetProcAddress(g_hHookApiDll, _T("UnhookWindowsHookEx"));
if(NULL == UnhookHook)
{
return FALSE;
}

return TRUE;
}

BOOL DeactivateHook()
{
if(g_hMouseHook != NULL)
{
QAUnhookWindowsJournalHook(WH_JOURNALRECORD);
g_hMouseHook = NULL;
}

if(g_hKbdHook != NULL)
{
UnhookHook(g_hKbdHook);
g_hKbdHook = NULL;
}

if(g_hHookApiDll != NULL)
{
FreeLibrary(g_hHookApiDll);
g_hHookApiDll = NULL;
}

return TRUE;
}

LRESULT CALLBACK KbdHookCallback(int nCode, WPARAM wParam, LPARAM lParam)
{
if(nCode >= HC_ACTION)
{
if(wParam == WM_KEYUP)
{
DWORD dwKey = ((KBDLLHOOKSTRUCT*)lParam)->vkCode;

if(dwKey == VK_UP || dwKey == VK_DOWN || dwKey == VK_LEFT || dwKey == VK_RIGHT)
{
//Do Something
}
}
}

return CallNextHook(g_hKbdHook, nCode, wParam, lParam);
}

LRESULT CALLBACK MouseHookCallback(int nCode, WPARAM wParam, LPARAM lParam)
{
if(nCode >= HC_ACTION)
{
PEVENTMSGMSG pMsg = (PEVENTMSGMSG)lParam;
if(pMsg)
{
if(pMsg->message == WM_LBUTTONDOWN || pMsg->message == WM_LBUTTONUP)
{
//Do Something
}
}
}

return CallNextHook( g_hMouseHook, nCode, wParam, lParam );
}

如果在一个程序中启动了钩子,其他的程序使用钩子将无效。

由于使用了微软未公开的函数,可能会有潜在的问题,建议慎用。另,据说WM6.5以上,已经不支持鼠标钩子。

分享到:
评论

相关推荐

    windows mobile系统钩子示范(C++)

    本文将深入探讨如何使用C++在Windows Mobile环境下,通过Visual Studio 2005来实现系统钩子。钩子是Windows编程中的一个重要概念,它允许我们插入代码到系统消息处理流程中,以便在特定事件发生时执行自定义操作。 ...

    WINDOWS MOBILE 6.0 所有DLL 文件

    此外,Windows Mobile 6.0的开发者还可以利用这些DLL文件来创建自定义解决方案,例如通过API钩子来扩展系统功能,或者编写特定于设备的应用程序。同时,对DLL文件的深入理解有助于优化性能,解决兼容性问题,以及...

    Windows_Mobile实例开发

    根据给定文件的信息,我们可以提炼出一系列关于Windows Mobile实例开发的知识点,重点在于Windows Mobile下的Win32 API应用。以下是对这些知识点的详细介绍: ### 一、开发环境搭建 **概述**: - Windows Mobile...

    HookPPC wince mobile

    《HookPPC在Windows CE Mobile中的应用与技术详解》 HookPPC,全称为"Hooking for PPC (PocketPC)", 是一种在...掌握HookPPC的使用和原理,对于提升Windows CE Mobile平台上的开发效率和应用质量具有重要的意义。

    Windows Mobile:实现信息亭模式

    在Windows Mobile平台上,信息亭模式(Kiosk Mode)是一种特殊的应用程序运行模式,它限制了用户的交互界面,通常用于公共设备或自助服务终端,以提供单一功能或一组特定功能,防止用户访问系统其他部分或者进行非...

    AllocHook.rar_Windows_Phone_Windows_Unix_

    标题“AllocHook.rar_Windows_Phone_Windows_Unix_”暗示了这个压缩包包含的代码示例可能与内存分配和追踪内存泄漏有关,特别是在Windows Phone和Unix系统上。描述中的“LMemDebug.DLL example for windows mobile ...

    LOCK_ST.ZIP_Start Button Lock_lock in

    C# Compact Framework是.NET框架的一个子集,专为资源受限的环境,如Windows CE、Windows Mobile等嵌入式系统设计。它提供了丰富的类库和开发工具,使得开发者可以使用C#语言进行跨平台开发。在C# Compact Framework...

    reddit-mobile

    macOS或Linux(未在Windows上测试) 快速开始 我们将NPM脚本用于所有与开发相关的任务。 吉特 主要的git分支是2X 为了避免合并提交,我们使用了重定基。 钩子 我们在hooks目录中有pre-commit / push钩子,以帮助...

    WTL 9.1 5270 Beta 中文 汉化 中英文对照版

    这些类并未使用hooks(钩子程序)或线程本地存储技术,所以没有植入技术改进的限制。它们也不存在内部依赖性,可以自由地和SDK代码一起混合使用。总之,WTL提供最小最高效的代码,非常接近SDK的体积和速度,同时为...

    Development iOS in a Jailbroken iPhone

    2. 钩子(Hook)技术:通过这种技术,开发者可以注入代码进入系统应用中,实现控制平台行为的目的,比如控制Mobile Safari或Springboard。 3. 未公开API:开发者可以使用那些未通过SDK公开的API来构建创新功能。 4. ...

    drupal-app-jqm-phonegap:drupal-app-ajax-jqm-phonegap

    PhoneGap是Apache Cordova项目的商业版本,它允许开发者使用HTML5、CSS3和JavaScript编写应用,然后将这些应用打包成原生的iOS、Android、Windows Phone等平台的应用。PhoneGap提供了访问设备功能的API,如相机、...

    基于VUE实现判断设备是PC还是移动端

    let flag = navigator.userAgent.match(/(phone|pad|pod|iPhone|iPod|ios|iPad|Android|Mobile|BlackBerry|IEMobile|MQQBrowser|JUC|Fennec|wOSBrowser|BrowserNG|WebOS|Symbian|Windows Phone)/i); return flag !...

Global site tag (gtag.js) - Google Analytics