首页
社区
课程
招聘
如何使用SendMessage函数实现模拟鼠标点击按钮事件?(内有两种代码比较)
发表于: 2012-7-24 23:02 17289

如何使用SendMessage函数实现模拟鼠标点击按钮事件?(内有两种代码比较)

2012-7-24 23:02
17289
用SPY++获得了QQ连连看的 开始按钮坐标!
利用坐标写了如下代码:
        m_hGame = FindWindow(NULL, "QQ游戏 - 连连看角色版");
        int lparam;
        lparam = ((562)<<16) + 664;
        lparam = ((562)<<16)+(664);
        SendMessage(m_hGame, WM_LBUTTONDOWN, 0, lparam);
        SendMessage(m_hGame, WM_LBUTTONUP, 0, lparam);
        SendMessage(m_hGame, WM_LBUTTONDOWN, 0, lparam);
        SendMessage(m_hGame, WM_LBUTTONUP, 0, lparam);
上述代码不能实现开始按钮的点击这是怎么回事???

上述代码应该是属于软件模拟,所以我尝试了使用硬件模拟:
            //获取游戏窗口句柄
            HWND gameh;
            gameh=::FindWindow(NULL,"QQ游戏 - 连连看角色版");
            CRect r1;
            ::GetWindowRect(gameh,&r1);
            
            //保存当前鼠标指针
               //取得当前鼠标位置
            CPoint p;
            GetCursorPos(&p);
            //设置鼠标指针位置  取开局所在坐标:x=655;y=577 //lparam 0x0241028f
            SetCursorPos(655+r1.left,577+r1.top);
            //模拟鼠标的 单击(鼠标按下/鼠标抬起)
            //MOUSEEVENTF_LEFTDOWN Specifies that the left button is down.
               //MOUSEEVENTF_LEFTUP
            //鼠标在当前位置按下
            mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);
            mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);
            //鼠标在当前位置抬起
            mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);
            //还原鼠标位置
            Sleep(200);//过一段时间 再执行后边的代码
            SetCursorPos(p.x,p.y);

利用这段代码就正确实现了开始按钮的点击!

这两段代码在逻辑上应该是一样的,但是为什么有两种不一样的结果产生?
怎么在后台模拟这个开始按钮的点击事件呢?或者如何正确使用SendMessage实现鼠标点击开始按钮这个事件呢?

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (15)
雪    币: 31
活跃值: (53)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
2
你应该把消息发给按钮控件而不是它的父窗口吧?向按钮发送WM_LBUTTONDOWN试试?
2012-7-24 23:41
0
雪    币: 908
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
1、呵呵,你做的是QQLLK看啊,我最近刚做了一个就是用SendMessage发送的按键消息,这个消息是好使的,结贴联系我吧!
2012-7-25 09:10
0
雪    币: 285
活跃值: (16)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
4
KeybdEvent(VK_LBUTTON,0);
        SendMessage(hTlbb,WM_LBUTTONDOWN,1,0x1f0028);
        Sleep(50);
        SendMessage(hTlbb,WM_MOUSEMOVE,1,0x1f0028);
        Sleep(50);
        SendMessage(hTlbb,WM_LBUTTONUP,0,0x1f0028);
        KeybdEvent(VK_LBUTTON,KEYEVENTF_KEYUP);
2012-7-25 09:56
0
雪    币: 285
活跃值: (16)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
5
上面少了这段代码:
void KeybdEvent (BYTE bKeyCode,DWORD dwFlags)
{
        keybd_event(bKeyCode, MapVirtualKey(bKeyCode, 0), dwFlags, 0);
}
2012-7-25 09:57
0
雪    币: 34
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
怎么找到按钮控件的句柄?用SPY++?
2012-7-25 10:07
0
雪    币: 34
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
这段代码不是模拟键盘点击事件的? 我要的是鼠标点击事件~~用鼠标模拟点击事件··点击某一个按钮·
2012-7-25 10:10
0
雪    币: 1489
活跃值: (1228)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
8
向父窗口发送按钮的通知码。
2012-7-25 10:17
0
雪    币: 34
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
还是不行诶··呵呵 我试过了··还是谢谢了·
2012-7-25 10:47
0
雪    币: 908
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
貌似腾讯是加了限制的,因此发送消息时需要注意一下,
这是我模拟的点击消息,经过测试了,是可以的!结贴给分吧!
HWND hGameWnd = ::FindWindow(NULL,L"QQ游戏 - 连连看角色版");
::PostMessage(hGameWnd,WM_LBUTTONDOWN,VK_LBUTTON,0x0231028E);
::PostMessage(hGameWnd,WM_LBUTTONUP,0,0x0231028E);
2012-7-25 10:55
0
雪    币: 47
活跃值: (36)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
话说貌似这个大家都玩过吧
2012-7-25 11:01
0
雪    币: 34
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
貌似 还是不行···应该不是加限制  因为 我点击棋子就是用的SendMessage.
但是我想用SendMessage点击这个按钮就不行。
2012-7-25 11:10
0
雪    币: 34
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
还是不行!应该不是加了限制,因为我点击棋子的时候就是用SendMessage。
用同样的方法点击按钮就不成功。
2012-7-25 11:11
0
雪    币: 34
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
求指教········
2012-7-25 11:12
0
雪    币: 908
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
。。。。。。。。。。。。。。。。。。。
2012-7-25 11:25
0
雪    币: 7
活跃值: (32)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
发送消息之间,加个延时。。
2012-7-25 14:10
0
游客
登录 | 注册 方可回帖
返回
//