VC 鼠标钩子 程序假死 大家进来帮忙看看啊

程序员小哈
领域专家: 嵌入式与硬件开发技术领域
2009-10-17 08:54:18
我初始化中注册了一个鼠标钩子
初始化函数中:
hHook=SetWindowsHookEx(WH_MOUSE,MouseProc,0,GetCurrentThreadId());
全局函数:
LRESULT CALLBACK MouseProc (int nCode,WPARAM wParam,LPARAM lParam)
{
//跟踪鼠标移动时的位置变化信息
if(wParam == WM_LBUTTONDOWN)
{ //是鼠标移动消息
point=((MOUSEHOOKSTRUCT *)lParam)->pt;//取鼠标信息

CString str;
str.Format("此处坐标为x=%d,y=%d",point.x,point.y);

CRect rc;
GetClientRect(wnd,&rc);
ScreenToClient(wnd,&point);
if (rc.PtInRect(point))
{
::PostMessage(wnd,WM_NCLBUTTONDOWN, HTCAPTION, MAKELPARAM(point.x,point.y));
}
}
//传递勾子信息
return CallNextHookEx(hHook,nCode,wParam,lParam);
}

为什么刚开始可以拖动对话框,但是拖动几次之后,cpu使用率就到了50%,像假死了一样
这么做哪不对吗?正确的用法该怎么用呢?


我的目的是想实现鼠标左键点击时拖动窗口移动,因为我在做一个程序的精简模式,精简模式下没有标题栏,整个对话框窗口都被一个web控件覆盖了,此时我点击对话框窗口时,无法响应鼠标左键点击事件,我上网查了一下,说要用钩子来做,我照网上的方法做了,可以实现,但是几次拖动之后就出现假死了,过了一会又会恢复回来,望各位指点一下,谢谢大家

还有一个问题就是,我上面的全局函数中如果不用PostMessage,而改用::SendMessage(wnd,WM_NCHITTEST,HTCAPTION, MAKELPARAM(point.x,point.y));的话,调试,发现WM_NCHITTEST对应的函数根本没有进入,怀疑是这种发送消息的方式不行,这是为什么呢?
...全文
473 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
lsldd 2010-03-18
  • 打赏
  • 举报
回复
不需要用钩子的。
非标题栏也可以拖动窗口的。
程序员小哈 2009-10-19
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 tr0j4n 的回复:]
这个不需要钩子吧。。重载消息就可以了。
先判断WM_LBUTTONDOWN,设置状态变量,然后在WM_MOUSEMOVE里面判断

这些消息的重载都在对话框里面做
[/Quote]

我在web控件上点击,那个WM_LBUTTONDOWN消息没有响应啊,所以我才想到鼠标钩子的,今天实验成功了^_^是在钩子中发送WM_MouseMove消息。
首先谢谢你的关注,
我想再问你一个问题:
单独开贴没有那么多分了,(*^__^*) 嘻嘻……
你用过web控件吗?
我今天用web控件加载这个URL,
http://api.smgbb.tv/tv.swf?cid=214×tamp=0&site=api.smgbb.tv&autoStart=true
却提示我无效字符,我用IE、360打开都可以正常播放的,我又试着打开http://api.smgbb.tv/tv.swf
发现也报那个错误,这个无效参数应该不是链接吧?http://api.smgbb.tv/tv.swf这个链接已经很简单了啊?是Web页面中的js错误吗?是的话,为什么IE等浏览器却没有问题呢?望给予帮助^_^
谢谢啦
今天晚了,明天再过来结贴^_^
程序员小哈 2009-10-19
  • 打赏
  • 举报
回复
自己再顶一下,上面的问题大家帮看一下,稍后就结贴,谢谢
MoXiaoRab 2009-10-18
  • 打赏
  • 举报
回复
这个不需要钩子吧。。重载消息就可以了。
先判断WM_LBUTTONDOWN,设置状态变量,然后在WM_MOUSEMOVE里面判断

这些消息的重载都在对话框里面做
MoXiaoRab 2009-10-18
  • 打赏
  • 举报
回复
哦。我明白你的意思了。

你需要在对话框中添加响应,让对话框先截取到左键点击这个信息。
左键拖拽为什么用OnNcHitTest呢
程序员小哈 2009-10-18
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 tr0j4n 的回复:]
目的是想实现鼠标左键点击时拖动窗口移动?这句话没看懂

至于假死,则怀疑是消息太多的原因,都是Post的
[/Quote]
我现在对话框中有一个web控件,我如下做法,实现了,左键点击客户区时可以拖动窗口:
LRESULT CCTreeCtrlDlg::OnNcHitTest(CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值

return HTCAPTION;
//return CDialog::OnNcHitTest(point);
}

但是,当鼠标左键点击web控件上时,却不能实现窗口拖动,是不是因为web控件把消息给屏蔽了呢?我查到网上说,需要用钩子来实现,我早上又实验了一下,发现钩子没有问题,现在的问题是:一,possmessage会假死,而我只有鼠标左键点击时才会post消息啊?二,在那个钩子的回调函数中怎么能让,窗口移动呢?我在其中发送wndDlg->SendMessage(WM_NCHITTEST,0,0);的话,能进入响应函数,但是没有效果呢?希望继续关注,谢谢
MoXiaoRab 2009-10-18
  • 打赏
  • 举报
回复
目的是想实现鼠标左键点击时拖动窗口移动?这句话没看懂

至于假死,则怀疑是消息太多的原因,都是Post的
程序员小哈 2009-10-18
  • 打赏
  • 举报
回复
自己顶一下,大家进来看看啊

16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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