首页
社区
课程
招聘
[旧帖] sendmessage鼠标模拟一点疑问 0.00雪花
发表于: 2011-5-1 01:25 15620

[旧帖] sendmessage鼠标模拟一点疑问 0.00雪花

2011-5-1 01:25
15620
HWND cildhwndbut=::GetDlgItem(cildhwnd,0x64);
        if(cildhwnd==NULL)
        {
                MessageBox("不存在!");
        }

int y=645,x=555;
int lparam;
lparam=(y<<16)+x;
SetCursorPos(555,645);
::SendMessage(cildhwnd,WM_LBUTTONDOWN,0,lparam);//MK_LBUTTON
::SendMessage(cildhwnd,WM_LBUTTONUP,0,lparam);

如上代码,是一段模拟鼠标消息实现 麻将游戏自动出牌,
但是当使用SetCursorPos(555,645);会影响鼠标动作,就不能实现后台模拟了.
但是如果把这句注释掉窗口就不响应WM_LBUTTONDOWN消息了.
请教一下需要怎么做才能实现后台模拟呢.

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (18)
雪    币: 859
活跃值: (309)
能力值: ( LV11,RANK:180 )
在线值:
发帖
回帖
粉丝
2
是么是后台模拟??
你可以先GetCursorPos保存当前位置
然后SetCursorPos然后SendMessage,再Sleep一会,再SetCursorPos把鼠标设置回原来的位置
2011-5-1 01:48
0
雪    币: 191
活跃值: (20)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
所谓后台就是在窗口最小化的时候一样的能实现.而不需要鼠标真实的移动到那个位置
2011-5-1 02:52
0
雪    币: 69
活跃值: (30)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
4
void Bot::LeftClick(WORD x, WORD y)
{
	PostMessage(m_hWnd, WM_MOUSEMOVE, 0, MAKELPARAM(x, y));
	Sleep(100);
	PostMessage(m_hWnd, WM_LBUTTONDOWN, MK_LBUTTON, MAKELPARAM(x, y));
	Sleep(50);
	PostMessage(m_hWnd, WM_LBUTTONUP, 0, MAKELPARAM(x, y));
	Sleep(100);
}
2011-5-1 07:22
0
雪    币: 21
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
SendMessage要等消息执行后才返回,容易导致软件卡死。
PostMessage不等执行就返回,不过消息石沉大海的可能性很大。
既然是模拟为什么不用key_event和mouse_event。
更方便的用按键精灵模拟去,这个比自己写个程序模拟省心多了。
2011-5-1 10:27
0
雪    币: 66
活跃值: (25)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
6
这种情况应该是麻将程序在接收到鼠标消息的时候对窗口有没有获取焦点,或者是鼠标有没有在窗口内进行了检测。
在Post鼠标消息之前,给游戏程序来些伪装的消息试试?
鄙人拙见,不知可行性怎样
2011-5-1 23:22
0
雪    币: 191
活跃值: (20)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
楼上正解!!
我就是在想怎么给游戏程序来些伪装消息!百思不得其解.
2011-5-2 03:02
0
雪    币: 242
活跃值: (448)
能力值: ( LV11,RANK:188 )
在线值:
发帖
回帖
粉丝
8
都sendmessage了,何不就直接去call游戏的窗口proc /:^]!

用WM_MOUSEMOVE来欺骗窗口就好
2011-5-2 05:35
0
雪    币: 29
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
Public Sub SendKey(ByVal key As Keys, ByVal Diablo2Handle As IntPtr)
        If Diablo2Handle = Nothing Then Exit Sub
        PostMessage(Diablo2Handle, WM_KEYDOWN, key, 0)
        PostMessage(Diablo2Handle, WM_KEYUP, key, 0)
    End Sub

用postmessage
2011-5-2 07:58
0
雪    币: 29
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
::SendMessage(cildhwnd,WM_LBUTTONDOWN,0,lparam);//MK_LBUTTON

窗口对象应该是最大的那个,不应该是子窗口的吧.我一直都是用的最大的那个
2011-5-2 08:01
0
雪    币: 191
活跃值: (20)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
我通过SPY++观察游戏窗口,能收到WM_LBUTTONDOWN消息,但是却没有自动出牌,
2011-5-2 12:33
0
雪    币: 35
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
PostMessage有没有可能被hook了。
下面一段代码可以在windows xp下绕过用户层的hook

__declspec(naked) int WINAPI sysFastCall()
{
        __asm
        {
                mov edx, esp
                _emit 0x0f
                _emit 0x34
        }
}

__declspec(naked) BOOL WINAPI MyPostMessage(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
{
        __asm
        {
                mov eax, 0x11DB
                call sysFastCall
                retn 0x10
        }
}
2011-5-2 13:12
0
雪    币: 143
活跃值: (61)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
13
你们想得太多了,4L正解。
2011-5-2 14:08
0
雪    币: 191
活跃值: (20)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
我在画图程序里面实验,利用::SendMessage(cildhwnd,WM_LBUTTONDOWN,0,lparam);
模拟鼠标按键消息,用 SPY++观察画图程序窗口能收到WM_LBUTTONDOWN消息,但是却没工作.
在sendmessage前面加上SetCursorPos(555,645),在画图程序窗口为激活时能正常工作,
有什么办法能让画图程序窗口在最小化的时候也能正常的接受消息和模拟鼠标按键呢.
2011-5-4 11:43
0
雪    币: 777
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
新手关注一下
2011-7-7 16:34
0
雪    币: 204
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
还有一个办法解决。 HOOK  GetCursorPos  然后必要时候返回成你自己的POS
2011-7-7 17:31
0
雪    币: 113
活跃值: (100)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
17
有印象是使用mouse_event API来实现模拟鼠标事件的。
2011-7-7 22:49
0
雪    币: 54
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
注释掉这句好象可以不用,直接下面几句就OK,因为我使用后台的时候就后面几条就OK的,若不行的话是否坐标有误?或者游戏屏蔽了后台操作?
2011-7-19 12:38
0
雪    币: 203
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
最好是找到出牌方法自己调用。这种想在程序失去焦点时还能模拟那就不知道怎么弄的了。另,在程序有焦点时需要有次序的发送消息,一般为MOVE,DOWN,UP
2011-7-19 14:15
0
游客
登录 | 注册 方可回帖
返回
//