再问:SendMessage向其他窗口发送鼠标消息[100分,测试成果立付]

xill 2009-05-31 03:32:46
通过一个窗口程序向另外一个窗口程序发送鼠标左键点击消息。
我做了两个窗口程序AAA,BBB:
AAA:一个dlg窗口,在窗口坐标(100,100)处放了一个button_aaa,同时在on_button_aaa响应函数里面有一个MessageBox("OK!!!");函数
BBB:也是一个dlg窗口,上面有两个button:button_bbb1,button_bbb2。在on_button_bbb1里面已实现如下功能
找到AAA窗口的句柄,将鼠标移动到AAA窗口坐标(100,100)处,点击鼠标,弹出对话框“OK!!!”。
现须要写一个button_bbb2的响应函数on_button_bbb2。用sendmessage实现鼠标点击AAA窗口坐标(100,100)的功能,点击完成后AAA窗口弹出“OK!!!”对话框。

============================================================================
on_button_bbb1实现代码如下,已经测试通过,请务重复,请提供一下on_button_bbb2的代码,要求用sendmessage实现:
//另外我翻看了论坛上这一块的关于SendMessage的问题,也试了很多次,没有成功,请达人帮助。

on_button_bbb1()
{
//g_DstWnd是AAA窗口的句柄
static BOOL flag=FALSE;
CRect crect;
::GetWindowRect(g_DstWnd,crect);
int w=crect.Width();
int h=crect.Height();
if (flag==FALSE)
{
::MoveWindow(g_DstWnd,0,0,w,h,TRUE);//为了保障测试把窗口移动到(0,0)
flag=TRUE;
}


RECT rc;
int x, y;
::GetWindowRect(g_DstWnd,&rc);
x = rc.left+100;
y = rc.top+100;
::SetCursorPos(x,y);
::mouse_event(MOUSEEVENTF_ABSOLUTE|MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
::mouse_event(MOUSEEVENTF_ABSOLUTE|MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
}
============================================================================
我写的on_button_bbb2(),无法实现点击功能(我怀疑,是不是直接点到窗体上去了,而不是点的button_aaa)
另外说明,不希望通过得到button_aaa的句柄去做鼠标点击:
on_button_bbb2()
{
::SetForegroundWindow(g_DstWnd);//激活

CRect crect;
::GetWindowRect(g_DstWnd,crect);
int w=crect.Width();
int h=crect.Height();
::MoveWindow(g_DstWnd,0,0,w,h,TRUE);//移动
Sleep(200);
::SendMessage(g_DstWnd,WM_LBUTTONDOWN, MK_LBUTTON, MAKELONG(100,100));
Sleep(200);
::SendMessage(g_DstWnd,WM_LBUTTONUP,MK_LBUTTON,MAKELONG(100,100));
}
...全文
491 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
shiweifu 2009-05-31
  • 打赏
  • 举报
回复
先找到目标窗体,然后遍历窗体中的控件,找到句柄,发送消息
litomboy 2009-05-31
  • 打赏
  • 举报
回复
可以不可以在按妞上设置个热键,发送键盘消息来替换鼠标消息呢??
xill 2009-05-31
  • 打赏
  • 举报
回复
这样可以做到有button点button,没有button点窗体。


very good!

明天追分,结贴。

  • 打赏
  • 举报
回复
我以前做过
对有的程序来说
不是没有受到消息 而是不处理消息
要先发一个MOUSEMOVE的消息才有用
那个梦幻西游就是这样

例子如下
具体你自己在看看
LPARAM lparam = MAKELPARAM(this->m_xxxx,this->m_yyyy);

::PostMessage(this->m_window->m_hWnd,WM_MOUSEMOVE,0,lparam);

::PostMessage(this->m_window->m_hWnd,WM_LBUTTONDOWN,0,lparam);
xill 2009-05-31
  • 打赏
  • 举报
回复
这样实际上是button_aaa可以看成是透明的了,
good,very good。
等按试验成功给分啊。

看其他人有没思路
xill 2009-05-31
  • 打赏
  • 举报
回复
lambochan 的方法好像可以!
先判定对应的点有没有子窗口,如果有,就取得对应的子窗口句柄取实现点击事件。
xill 2009-05-31
  • 打赏
  • 举报
回复
to:biweilun
用sendmessage的问题是好像必须找到button_aaa的句柄才可以!
在sendmessage里面用窗口句柄是点不到button_aaa的,你可以试噢。

我想做的是如同mouse_event一样,只须要指定窗口坐标就可以点到这个button_aaa,只不过把mouse_event换成sendmessage。
换句话说,我只知道按钮在窗口上的坐标,而无法取到按钮的句柄,在这种前提下要实现点击按钮。如果不用mouse_event,有没有其他的可以?
lambochan 2009-05-31
  • 打赏
  • 举报
回复
ChildWindowFromPoint()..
zwfgdlc 2009-05-31
  • 打赏
  • 举报
回复
试下用

BOOL EnumChildWindows(
HWND hWndParent,
WNDENUMPROC lpEnumFunc,
LPARAM lParam
);

HWND FindWindowEx( HWND hwndParent,
HWND hwndChildAfter,
LPCTSTR lpszClass,
LPCTSTR lpszWindow
);
找到按钮句柄,然后给它发送
BM_CLICK
消息。
crushor 2009-05-31
  • 打赏
  • 举报
回复
那我觉得,你何不找一个键盘录制的工具?录好脚本就可以了。
biweilun 2009-05-31
  • 打赏
  • 举报
回复
SendMessage(bWnd,WM_LBUTTONDOWN,MK_LBUTTON,MAKELPARAM(x,y));
SendMessage(bWnd,WM_LBUTTONUP,0,MAKELPARAM(x,y));
biweilun 2009-05-31
  • 打赏
  • 举报
回复
SendMessage(hWnd,WM_LBUTTONDOWN,0,MAKELPARAM(x,y));
SendMessage(hWnd,WM_LBUTTONUP,0,MAKELPARAM(x,y));

这个是向窗体某一个坐标发送点击消息
biweilun 2009-05-31
  • 打赏
  • 举报
回复
我的Demo里的效果是找到按钮的句柄,然后发送点击事件

你的意思是可能哪里没有任何控件,要向指定的窗体中的一个坐标发送是吗?
xill 2009-05-31
  • 打赏
  • 举报
回复
to:blweilun,的确是可以,但是跟题目有一些差别,你是找到按钮句柄后再点击按钮。

我想问的是,直接通过主窗口句柄发送对窗口坐标上某一点发送鼠标点击消息,如果在该点上刚好有个button,则须要点到button上去,而不是主窗口
biweilun 2009-05-31
  • 打赏
  • 举报
回复
我写的Demo,地址是http://www.brsbox.com/filebox/down/fc/6ce645d355b9a983dfded3753ee29b23
你自己下载下来看,保证有效果
一笑拔剑 2009-05-31
  • 打赏
  • 举报
回复
可以dll 注入
呵呵

不过有点大才小用了

不过sendmessage是可以的

任意位置都可以

只要能找到哪个按纽的句柄
xill 2009-05-31
  • 打赏
  • 举报
回复
to:aa3000
谢谢噢
mouse_event,我已知道如何处理。
其实我想做的是,已知某窗口句柄,同时知道窗口上一个按钮的窗口坐标,我想在不移动鼠标的前提下去点这个按钮,必须用鼠标消息去点这个按钮噢!所以想到用sendmessage,但是一直弄出来。实现相同的功能还有其他方法么??
aa3000 2009-05-31
  • 打赏
  • 举报
回复
LZ 发送的 WM_LBUTTONDOWN WM_LBUTTONUP 只到达了g_DstWnd,应该就是AAA窗口了,按钮是没有接收到,所以不能响应,可以直接使用 mouse_event
xill 2009-05-31
  • 打赏
  • 举报
回复
不好意思,只给了50分,稍后我会补上的。
刚才加分,系统提示:发帖一天后才能加分
xill 2009-05-31
  • 打赏
  • 举报
回复
说白点就特别是想通过后台点击其他窗口!
我的邮件是xill@tom.com
如果把代码发给我也可以噢(非必选:)),十分感谢

16,551

社区成员

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

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

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