回答过“如何让我的程序不被WM那些键关闭?”的comiunknown /derfson2006/roc196等请进[散分帖]

OenAuth.Core 2009-01-05 01:47:44
谢谢comiunknown  derfson2006 roc196 等人的帮助。
现在问题如下:我从CodeProject里面找了个例子,可以实现屏蔽那几个键,用MFC在多普达上测试通过。可我想把它换成DLL,然后调用竟然没任何反应?
DLL的头文件如下:

#ifndef _WINCE_KB_HOOK_H
#define _WINCE_KB_HOOK_H

//used for passing to SetWindowsHookEx funtion to set a Low level (LL) keyboard hook
#define WH_KEYBOARD_LL 20
#define WINCEKBHOOK_API extern "C" __declspec(dllexport)

// Define the function types used by hooks
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);


// For the low level keyboard hook, your keyboards procedures is passed a pointer to KBDLLHOOKSTRUCT instance
typedef struct {
DWORD vkCode;
DWORD scanCode;
DWORD flags;
DWORD time;
ULONG_PTR dwExtraInfo;
} KBDLLHOOKSTRUCT, *PKBDLLHOOKSTRUCT;


// Win32 Hook APIs
static _SetWindowsHookExW SetWindowsHookEx;
static _UnhookWindowsHookEx UnhookWindowsHookEx;
static _CallNextHookEx CallNextHookEx;
//StartHook用来供外部调用
WINCEKBHOOK_API bool StartHook(HINSTANCE hInstance);
WINCEKBHOOK_API BOOL ActivateKBHook(HINSTANCE hInstance, HOOKPROC LLKeyboardHookCallbackFunction);
#endif


实现文件如下:


#include "stdafx.h"
#include <windows.h>
#include "winceKBhook.h"
#include "ras.h"
//globals
HINSTANCE g_hHookApiDLL = NULL; //handle to coredll.dll, where all the hook related APIs are present
HHOOK g_hInstalledLLKBDhook = NULL; //g_hInstalledLLKBDhook represents handle to the installed KB hook

//定义要屏蔽的键
int BlockKeyList[] = {VK_TBACK,VK_TTALK,VK_TEND,VK_THOME};
LRESULT CALLBACK LLKeyboardHookCallbackFunction(int nCode, WPARAM wParam, LPARAM lParam)
{
int countKeyList =4;
for(int i=0;i<countKeyList;i++)
{
//如果是屏蔽的键,则返回
if((((KBDLLHOOKSTRUCT*)lParam)->vkCode) == BlockKeyList[i])
{
return TRUE;
}
}

return CallNextHookEx(g_hInstalledLLKBDhook, nCode, wParam, lParam);
}
WINCEKBHOOK_API bool StartHook(HINSTANCE hInstance)
{
ActivateKBHook(hInstance,LLKeyboardHookCallbackFunction);
return true;
}
WINCEKBHOOK_API BOOL ActivateKBHook(HINSTANCE hInstance, HOOKPROC LLKeyboardHookCallbackFunction)
{
SetWindowsHookEx = NULL;
CallNextHookEx = NULL;
UnhookWindowsHookEx = NULL;

//now load the coredll.dll
g_hHookApiDLL = LoadLibrary(_T("coredll.dll"));
if(g_hHookApiDLL == NULL)
{
return false;
}
else
{

SetWindowsHookEx = (_SetWindowsHookExW)GetProcAddress(g_hHookApiDLL, _T("SetWindowsHookExW"));
if(SetWindowsHookEx == NULL)
{
//this means that MS has really stopped supporting this API in WinCE
return false;
}
else
{
g_hInstalledLLKBDhook = SetWindowsHookEx(WH_KEYBOARD_LL, LLKeyboardHookCallbackFunction, hInstance, 0);
if(g_hInstalledLLKBDhook == NULL)
{
return false;
}
}

CallNextHookEx = (_CallNextHookEx)GetProcAddress(g_hHookApiDLL, _T("CallNextHookEx"));
if(CallNextHookEx == NULL)
{
return false;
}

UnhookWindowsHookEx = (_UnhookWindowsHookEx)GetProcAddress(g_hHookApiDLL, _T("UnhookWindowsHookEx"));
if(UnhookWindowsHookEx == NULL)
{
return false;
}
}

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



调用代码如下:


HINSTANCE h=LoadLibrary(_T("HookDll.dll"));
if(h!=NULL)
{
typedef bool (*FUNCTION)(HINSTANCE hInstance);
FUNCTION p=(FUNCTION)GetProcAddress(h,_T("StartHook"));
//运行看起来没什么问题,不过没任何效果,所有键都还正常可以用
p(theApp.m_hInstance);
FreeLibrary(h);

}
...全文
575 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
thinkinwm 2010-04-15
  • 打赏
  • 举报
回复
mark
liaoxiuhua 2009-05-11
  • 打赏
  • 举报
回复
楼主啊,怎么生成DLL文件啊

我创建了一个MFC的静态DLL,然后在拷贝到另一个工程中

static HINSTANCE hDllInst;
hDllInst = LoadLibrary(_T("wmkbhook.dll"));
if(hDllInst == NULL)
{
AfxMessageBox(_T("找不到文件"));
return FALSE;
}

然后一直调试找不到文件咋回事哟
liaoxiuhua 2009-05-11
  • 打赏
  • 举报
回复
楼主你好,我拷贝了你的代码,在装载钩子的时候就出错返回了,我的是mobile 5.0 SP程序,也是MFC的
xingyuanwang 2009-04-14
  • 打赏
  • 举报
回复
不错。
大饼哥- 2009-01-05
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 huliang509 的回复:]
谢谢楼主分享代码,学习了
[/Quote]
谢谢
huliang509 2009-01-05
  • 打赏
  • 举报
回复
谢谢楼主分享代码,学习了
comiunknown 2009-01-05
  • 打赏
  • 举报
回复
恭喜,不过这样做适应性不强,有的WM手机没有某些硬按键,还有这种方法无法拦截用户直接在触摸屏上点“开始”,“OK”按键。
88csdn 2009-01-05
  • 打赏
  • 举报
回复
呵呵~~~肯定是可以的~~~
恭喜恭喜~~~
OenAuth.Core 2009-01-05
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 BEYONDMA 的回复:]
能不能说下是怎么解决的?
[/Quote]

主要是这几个键int BlockKeyList[] = {VK_TBACK,VK_TTALK,VK_TEND,VK_THOME};
我一直以为这些键对应的是"返回""通话""OK","WIDOWS",所以我测试的时候每一次按OK时,程序还是会被关闭掉,我以为我的程序有问题,于是自己写测试语句,一步步跟踪(我用的C#调用VC DLL不方便用F10和F11单步跟踪),发现自己的程序本来就没问题,于是我就想那几个键有问题,于是查了一下winuserrm.h,把下面
#define VK_TSOFT1 VK_F1 // Softkey 1
#define VK_TSOFT2 VK_F2 // Softkey 2
#define VK_TTALK VK_F3 // Talk
#define VK_TEND VK_F4 // End
#define VK_THOME VK_LWIN // Home
#define VK_TBACK VK_ESCAPE // Back

#define VK_TACTION VK_RETURN // Action
#define VK_TRECORD VK_F10 // Record
#define VK_TFLIP VK_F17 // Flip
#define VK_TPOWER VK_F18 // Power
#define VK_TVOLUMEUP VK_F6 // Volume Up
#define VK_TVOLUMEDOWN VK_F7 // Volume Down

#define VK_TUP VK_UP // Up
#define VK_TDOWN VK_DOWN // Down
#define VK_TLEFT VK_LEFT // Left
#define VK_TRIGHT VK_RIGHT // Right


所有的键都屏蔽了,发现竟然成功了,然后一个个排除,问题解决,呵呵,程序本身没任何问题。
beyondma 2009-01-05
  • 打赏
  • 举报
回复
能不能说下是怎么解决的?
OenAuth.Core 2009-01-05
  • 打赏
  • 举报
回复
问题已解决,接分吧,哈哈哈

高兴ING...

可以休假啦~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
OenAuth.Core 2009-01-05
  • 打赏
  • 举报
回复
屏蔽代码的出处:http://www.codeproject.com/KB/mobile/KeyboardhooksWinCE.aspx

我都是用MFC智能程序测试的

若能帮忙解决该问题,定开帖重谢。
也感谢帮顶者

再次对上面几人说声谢谢

7,657

社区成员

发帖
与我相关
我的任务
社区描述
Windows Phone是微软发布的一款手机操作系统,它将微软旗下的Xbox LIVE游戏、Zune音乐与独特的视频体验整合至手机中。
社区管理员
  • Windows客户端开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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