wince5.0 鼠标钩子 wParam都是零,而且点一下,MouseProc调3次

wohuazhen 2011-03-03 01:00:34
鼠标钩子,如何区别消息类型?
wParam都是零,而且点一下,MouseProc调3次
并没有写dll。直接写在程序里了。

#include "pwinuser.h"
HHOOK g_hHook;//是一个不属于任何类或窗体的全局变量

//初始CMainFrmDlg窗体时=======================================================================
g_hHook=NULL;
EVENTMSG msg = {HC_ACTION};
g_hHook = QASetWindowsJournalHook(WH_JOURNALRECORD,MouseProc,&msg);
//=======================================================================

//结束CMainFrmDlg窗体时==========================================================
QAUnhookWindowsJournalHook(WH_JOURNALRECORD);
g_hHook = NULL;
//==========================================================

#define WM_USER_MOUSE (WM_USER+103)
LRESULT CALLBACK MouseProc(int nCode, WPARAM wParam, LPARAM lParam)
{
static unsigned char i=0;
if(nCode==HC_ACTION)
{
if( (++i%3) == 0)
::SendMessage(HWND_BROADCAST,WM_USER_MOUSE,wParam,FALSE);
}
return CallNextHookEx(g_hHook,nCode,wParam,lParam);
}
ON_MESSAGE(WM_USER_MOUSE,OnMouseReceiveData)
LONG CMainFrmDlg::OnMouseReceiveData(WPARAM wParam, LPARAM lParam)
{
return 0;
}
...全文
154 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
GARY 2011-03-06
  • 打赏
  • 举报
回复
wince鼠标钩子,用过一次,效果还可以。
这是当时记录的一点内容:
http://blog.csdn.net/joyzml/archive/2010/08/21/5828353.aspx
wohuazhen 2011-03-05
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 91program 的回复:]
CE下的钩子,必须是全局的,也就是说要以 DLL 的形式存在
[/Quote]


全局一定要dll吗?
以dll形式存在是因为有多个程序需要知道这个消息吗?
我没用dll也可以跑的啊。
91program 2011-03-04
  • 打赏
  • 举报
回复
CE下的钩子,必须是全局的,也就是说要以 DLL 的形式存在
sb3day 2011-03-03
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 wohuazhen 的回复:]
另外问一个mfc的问题,

CxxDialog dlg;
HWND g_hWnd=dlg.m_hWnd;

和在CxxDialog里实现的
HWND g_hWnd=this->m_hWnd;

这连个g_hWnd不是同一个东西吗?
我想得到this->m_hWnd。
[/Quote]是同一个东西。或者你调试看一下值是多少就知道了
wohuazhen 2011-03-03
  • 打赏
  • 举报
回复
就在写上一个回复时,我想到了一个问题。
CxxDialog dlg; //这里只是声明,实际的窗体并未建立HWND g_hWnd=dlg.m_hWnd; //所以这里的句柄自然为NULL
和在CxxDialog里实现的
HWND g_hWnd=this->m_hWnd; //既然是在对话框类里,自然窗体已经存在
为了验证我的想法,
HWND *phWnd;
CxxDialog dlg;
phWnd=&dlg.m_hWnd;
SendMessage(*phWnd...
实验下来是响应了。
所以我的第2个问题也解决了。
幸好这里并没有不同线程间地址问题。因为此处用到了指针。(其实这句话我自己都不太明)
-------------------------------------
写程序真的要小心。呵呵。
wohuazhen 2011-03-03
  • 打赏
  • 举报
回复
1,我刚才发现自己搞混淆了。

windows下的这个MouseProc 和 wince下的MouseProc 传递的参数意义似乎不太一致。现在可以确认的是wince下MouseProc里
PEVENTMSGMSG pMsg = (PEVENTMSGMSG)lParam;
if(pMsg->message == WM_LBUTTONDOWN);
就可以了。
而在msdn里讲的MouseProc Function好像不是wince下的。先前我被这个迷惑了。

另关于AAa_tnT说的,全局HOOK,我是在应用程序里定义HHOOK的,并未写DLL,是一个独立于窗体和主应用类的在一个cpp文件内的全局HHOOK。目前看起来并没什么大问题。(唯一的问题是,如果我的应用程序异常退出时(调试时,偶然会直接中止一下,或拔了调试线),我的屏幕按键就好像不能用的了,这个应该是我没正常结束钩子引起的,真实原因不明)。


2 MFC程序里
BOOL CtestButtonApp::InitInstance()里
CtestButtonDlg dlg;
m_pMainWnd = &dlg;
//g_hWnd=dlg.m_hWnd;//这里的g_hWnd的定义方法类似1里说的HHOOK
但是在MouseProc里SendMessage(g_hWnd... ,没任何反应。
但如果我把g_hWnd定义在CtestButtonDlg.cpp里,不是类里。
并在窗体初始化时用this->m_hWnd赋值给g_hWnd,这时SendMessage(g_hWnd... ,就有响应了。
当然此时的MouseProc是在CtestButtonDlg.cpp里。

而如果SendMessage(HWND_BROADCAST,那么不论MouseProc放在app.cpp或dlg.cpp里,都有响应。
说得有点乱。呵呵
Ei 2011-03-03
  • 打赏
  • 举报
回复
1.wince 下只能用全局HOOK吧。。
2.不是同一个HWND?,你确定是同一个对象?
wohuazhen 2011-03-03
  • 打赏
  • 举报
回复
另外问一个mfc的问题,

CxxDialog dlg;
HWND g_hWnd=dlg.m_hWnd;

和在CxxDialog里实现的
HWND g_hWnd=this->m_hWnd;

这连个g_hWnd不是同一个东西吗?
我想得到this->m_hWnd。

19,502

社区成员

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

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