通过一个窗口程序向另外一个窗口程序发送鼠标左键点击消息。
我做了两个窗口程序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));
}

解决方案 »

  1.   

    说白点就特别是想通过后台点击其他窗口!
    我的邮件是[email protected]
    如果把代码发给我也可以噢(非必选:)),十分感谢
      

  2.   

    LZ 发送的 WM_LBUTTONDOWN WM_LBUTTONUP 只到达了g_DstWnd,应该就是AAA窗口了,按钮是没有接收到,所以不能响应,可以直接使用 mouse_event
      

  3.   

    to:aa3000
    谢谢噢
    mouse_event,我已知道如何处理。
    其实我想做的是,已知某窗口句柄,同时知道窗口上一个按钮的窗口坐标,我想在不移动鼠标的前提下去点这个按钮,必须用鼠标消息去点这个按钮噢!所以想到用sendmessage,但是一直弄出来。实现相同的功能还有其他方法么??
      

  4.   

    可以dll 注入
    呵呵不过有点大才小用了不过sendmessage是可以的任意位置都可以只要能找到哪个按纽的句柄
      

  5.   

    我写的Demo,地址是http://www.brsbox.com/filebox/down/fc/6ce645d355b9a983dfded3753ee29b23
    你自己下载下来看,保证有效果
      

  6.   

    to:blweilun,的确是可以,但是跟题目有一些差别,你是找到按钮句柄后再点击按钮。我想问的是,直接通过主窗口句柄发送对窗口坐标上某一点发送鼠标点击消息,如果在该点上刚好有个button,则须要点到button上去,而不是主窗口
      

  7.   

    我的Demo里的效果是找到按钮的句柄,然后发送点击事件你的意思是可能哪里没有任何控件,要向指定的窗体中的一个坐标发送是吗?
      

  8.   

    SendMessage(hWnd,WM_LBUTTONDOWN,0,MAKELPARAM(x,y));
    SendMessage(hWnd,WM_LBUTTONUP,0,MAKELPARAM(x,y));这个是向窗体某一个坐标发送点击消息
      

  9.   

    SendMessage(bWnd,WM_LBUTTONDOWN,MK_LBUTTON,MAKELPARAM(x,y));
    SendMessage(bWnd,WM_LBUTTONUP,0,MAKELPARAM(x,y));
      

  10.   

    试下用
    BOOL EnumChildWindows(
        HWND hWndParent,
        WNDENUMPROC lpEnumFunc,
        LPARAM lParam
    );或
    HWND FindWindowEx(          HWND hwndParent,
        HWND hwndChildAfter,
        LPCTSTR lpszClass,
        LPCTSTR lpszWindow
    );找到按钮句柄,然后给它发送BM_CLICK消息。
      

  11.   

    to:biweilun
    用sendmessage的问题是好像必须找到button_aaa的句柄才可以!
    在sendmessage里面用窗口句柄是点不到button_aaa的,你可以试噢。我想做的是如同mouse_event一样,只须要指定窗口坐标就可以点到这个button_aaa,只不过把mouse_event换成sendmessage。
    换句话说,我只知道按钮在窗口上的坐标,而无法取到按钮的句柄,在这种前提下要实现点击按钮。如果不用mouse_event,有没有其他的可以?
      

  12.   

    lambochan 的方法好像可以!
    先判定对应的点有没有子窗口,如果有,就取得对应的子窗口句柄取实现点击事件。
      

  13.   

    这样实际上是button_aaa可以看成是透明的了,
    good,very good。
    等按试验成功给分啊。看其他人有没思路
      

  14.   

    我以前做过
    对有的程序来说
    不是没有受到消息 而是不处理消息
    要先发一个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);
      

  15.   

    这样可以做到有button点button,没有button点窗体。
    very good!明天追分,结贴。