OnTimer捕获鼠标消息 我在OnTimer函数里用SetCapture函数捕获鼠标消息,用的是GetMessage();当按下鼠标左键时,调用killTimer()和ReleaseCapture().一般情况下运行良好的,但有的时候按下鼠标左键却没有反应,哪位能帮忙解答一下不,不甚感激!!! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 OnTimer是有定时循环功能的,可能在获取消息的时候并没有鼠标按下的操作,而按下时又不在OnTimer里。最好是让程序自己处理这个消息,在获取后激活OnTimer。 因为我要捕捉对话框外的鼠标事件,所以是在点击对话框上的按钮以后再激活OnTimer来捕获鼠标消息的,不能像你说的那样做。不过原因倒有可能是你说的那样。 用HOOK捕获鼠标消息吧,给个说明:#pragma once extern HHOOK hMouseHook;extern bool bNcLButtonDown; LRESULT CALLBACK MouseHookProc(int nCode,WPARAM wParam, LPARAM lParam); //NCButtonUpHelper.cpp #include "stdafx.h" HHOOK hMouseHook = NULL;bool bNcLButtonDown = false; LRESULT CALLBACK MouseHookProc(int nCode,WPARAM wParam, LPARAM lParam){ if (nCode == HC_ACTION) { PMOUSEHOOKSTRUCT mhs = (PMOUSEHOOKSTRUCT)lParam; CWnd *pWnd = AfxGetMainWnd(); switch (wParam) { case WM_NCLBUTTONDOWN: { if (HTCAPTION == mhs->wHitTestCode && mhs->hwnd == pWnd->GetSafeHwnd()) { SendMessage(mhs->hwnd,WM_NCLBUTTONDOWN,HTCAPTION,MAKELONG(mhs->pt.x,mhs->pt.y)); bNcLButtonDown = true; } } break; case WM_NCLBUTTONUP: { bNcLButtonDown = false; } break; case WM_LBUTTONUP: { if (true == bNcLButtonDown && mhs->hwnd == pWnd->GetSafeHwnd()) { PostMessage(mhs->hwnd,WM_NCLBUTTONUP,HTCAPTION,MAKELONG(mhs->pt.x,mhs->pt.y)); bNcLButtonDown = false; } } break; } } return CallNextHookEx(hMouseHook,nCode,wParam,lParam);} //例子加入,鼠标点击客户区外(对话框标题栏、非设备区) #include "NCButtonUpHelper.h" 在OnInitDialog()初始化对话框里加入 hMouseHook = SetWindowsHookEx(WH_MOUSE, (HOOKPROC)MouseHookProc, (HINSTANCE)AfxGetInstanceHandle(), AfxGetThread()->m_nThreadID); 在OnDestroy()消息里添加卸载钩子 if (hMouseHook != NULL) { UnhookWindowsHookEx(hMouseHook); } Hook吧,SetWindowsHookEx(WH_MOUSE_LL, ...) 那请问可以将hook的回调函数写成对话框类的成员函数吗?我有试过用HOOK 的,但是调用SetWindowsHookEx的时候报错,说要函数的成员列表,没用过,所以不知道怎么解决。我是将回调函数写成了成员函数的 SetWindowsHookEx(WH_MOUSE_LL, ...) 终于解决了还是Hook好用。不过钩子的回调函数应该是不能写成成员函数,要捕捉对话框外的要用WH_MOUSE_LL。自己开始没有注意到这一点。 新手求助~~关于vector的push_back() 关于小型视频会议的设计 如何在和html页面绑定的控件里面得到页面的http头信息 .net2003下访问access数据库? 网络数据传输问题,在线给分,另有给分帖子,保底300…… 鼠标钩子-点击一次响应多次的问题 让我郁闷的编译错误,大虾救命啦!!!!!!!!!! 如何改变主窗口的标题"无标题"改为其他文字? WINAMP的磁性窗体的实现!!! IDispatch,InVoke,VTBL区别在哪里?? 真心求解答,关于研发与测试 新窗口弹出问题
最好是让程序自己处理这个消息,在获取后激活OnTimer。
#pragma once
extern HHOOK hMouseHook;
extern bool bNcLButtonDown;
LRESULT CALLBACK MouseHookProc(int nCode,WPARAM wParam, LPARAM lParam);
//NCButtonUpHelper.cpp
#include "stdafx.h"
HHOOK hMouseHook = NULL;
bool bNcLButtonDown = false;
LRESULT CALLBACK MouseHookProc(int nCode,WPARAM wParam, LPARAM lParam)
{
if (nCode == HC_ACTION)
{
PMOUSEHOOKSTRUCT mhs = (PMOUSEHOOKSTRUCT)lParam;
CWnd *pWnd = AfxGetMainWnd();
switch (wParam)
{
case WM_NCLBUTTONDOWN:
{
if (HTCAPTION == mhs->wHitTestCode && mhs->hwnd == pWnd->GetSafeHwnd())
{
SendMessage(mhs->hwnd,WM_NCLBUTTONDOWN,HTCAPTION,MAKELONG(mhs->pt.x,mhs->pt.y));
bNcLButtonDown = true;
}
}
break;
case WM_NCLBUTTONUP:
{
bNcLButtonDown = false;
}
break;
case WM_LBUTTONUP:
{
if (true == bNcLButtonDown && mhs->hwnd == pWnd->GetSafeHwnd())
{
PostMessage(mhs->hwnd,WM_NCLBUTTONUP,HTCAPTION,MAKELONG(mhs->pt.x,mhs->pt.y));
bNcLButtonDown = false;
}
}
break;
}
}
return CallNextHookEx(hMouseHook,nCode,wParam,lParam);
}
//例子加入,鼠标点击客户区外(对话框标题栏、非设备区)
#include "NCButtonUpHelper.h"
在OnInitDialog()初始化对话框里加入
hMouseHook = SetWindowsHookEx(WH_MOUSE,
(HOOKPROC)MouseHookProc,
(HINSTANCE)AfxGetInstanceHandle(),
AfxGetThread()->m_nThreadID);
在OnDestroy()消息里添加卸载钩子
if (hMouseHook != NULL)
{
UnhookWindowsHookEx(hMouseHook);
}
WH_MOUSE_LL。自己开始没有注意到这一点。