一个老外的软件,我想通过我自己的VC程序来控制它。有办法不?比如点我程序的几个按钮,相当于点了它的对应的几个按钮。
   我用FindWindow得到了它的句柄m_hWnd。然后通过句柄给它发消息。因为不知道我想要控制的那几个按钮的ID号,所以我从100到90000循环发送消息.
   void CMainFrame::OnMagnifyPicture()
{

    ////发送一个按钮单击消息。IDcount ,我假设是ID号
while(IDcount < 90000)
{
SendMessage(WM_COMMAND,MAKEWPARAM(IDcount,BN_CLICKED),(LPARAM)m_hWnd); 
IDcount++;
}
CString pi;
pi.Format("%d",IDcount);
MessageBox(pi);
MessageBox("没反应!");
}
1)发现不是没反应,就是控制了我自己的写的软件。可是明明是老外那个软件的句柄,求解?
2)这个方法没见到效果后,我用SPY++查看老外的软件,发现我要控制的那几个按钮是Class: ToolbarWindow32,Style: 5000005D,而更蛋疼的是我总共想控制6个按钮,却发现是两两一对的ToolBar图片,就更没法精确控制每一个按钮了。
不知各位有思路实现没有?

解决方案 »

  1.   

    1、你可以EnumChildWindow去找按钮
    2、你的SendMessage实际上是this->SendMessage,你向自己发消息了,使用API就多一个参数
       ::SendMessage 
      

  2.   

    呵呵,我也想呢!但是几个G的软件啊!怎么发啊!
    另外问一下,EnumChildWindow里面需要用到的回调函数是系统什么时候调用的?能不能我点一个我程序里的按钮后再调用?
      

  3.   

    EnumChildWindow里面需要用到的回调函数是你调用EnumChildWindow的时候调用的,也就说你不调用EnumChildWindow的话,回调函数也不会调用。
    综上所述,如果你在按钮的事件处理程序里调用的话,回调函数就在按钮事件里调用
      

  4.   

    楼主,人家的按钮是Class: ToolbarWindow32,我估计你找到窗口句柄用处也不大,我看你还不如用SPY++,看看当你按下老外的那个按钮的时候,都引发了什么事件,你再依样画葫芦的给发那样的消息过去,我觉得可能还是比较靠谱的
      

  5.   

    嗯,谢谢你。主要是SPY++这个东东用的也不是很熟,我试试你说的方法哈。
    另外问问EnumChildWindow这个函数到底能得到些什么,我也不是很清楚。
      

  6.   

    EnumChildWindow是吧一个窗口的子窗口挨个给你枚举一遍,每次枚举一个子窗口的时候,就把你传给EnumChildWindow的那个函数指针调用一下,告诉你发现了一个子窗口。
      

  7.   

    最保险的是先FindWindow找到主窗体, 然后使用8楼的方法EnumChildWindow来找。 FindChildWindow不是很靠谱, 曾经试验过另一种控制对话框的程序。 另外, 用SPY++找出对方软件的ID号, 通过ID号找到句柄, 接着向这个句柄发送消息。 理论上是这样, 不过搞不清楚toolbar它的实现机制, 我没用过, 如果你知道的话, 就发送对应的消息。 另外, 有一种情况你需要搞清楚, toolbar是否支持跨进程消息传递机制(这样说应该不恰当, 因为很长时间没有写控件这样的东西了), 我记得 微软对 按钮以后开发的控件不支持这样的消息直接控制了(请注意描述还是不准确), 也就是说 对于获取某些信息等总是失败。 保证100%成功的最靠谱的方法是 使用一个DLL注入到指定进程, 然后通过自己的进程与指定的DLL进行通信, 通过注入的DLL发出实际的消息来控制进程的控制转向。
      

  8.   

    void CXXXDlg::OnBnClickedClock()
    {
    if(::FindWindow(NULL, "钟表"))
    {
    //MessageBox("您已经打开窗口了,请关闭后再打开,谢谢!", "温馨提示!", NULL);
    clockdlg.OnBnClickedCancel();
    return;
    }
    clockdlg.WndCreate(this);        //把父窗口的指针传给子窗口 }
      

  9.   

    简单的触发消息可以通过findwindow获取句柄
    复杂的数据设置需要通过代码注入来完成
      

  10.   

    用spy++看一下你按按钮的时候都触发了什么消息
    一定有一个是实现功能的
    然后直接发这个消息即可
    不用模拟点击
      

  11.   

    保证100%成功的最靠谱的方法是 使用一个DLL注入到指定进程, 然后通过自己的进程与指定的DLL进行通信, 通过注入的DLL发出实际的消息来控制进程的控制转向.
    说实话,有点晕。不过和全局钩子有点像
    你说的100%成功的最靠谱的方法是不是11楼说的代码注入?
      

  12.   

    我试了,找一半天都没找到触发什么消息,可能不会用来SPY++软件。。
    囧...
      

  13.   

    IDcount 这是你本地的吧,TOOLBAR是个内部结构,有消息可以获取里面的东西的
      

  14.   

    这个是我定义的本地 static int IDcount = 150;//我猜的ID号,一直到90000
    有什么消息获得TOOLBAR是个内部结构呢?
      

  15.   

    折腾一半天,终于得到它的消息了。
    WM_NCHITTEST
    WM_NOTIFY
    WM_SETCURSOR
    TB_GETTOOLTIPS
    TB_GETITEMRECT
    WM_MOUSEMOVE...
      

  16.   


    不猜ID也可以,通过枚举窗体,匹配窗体的“TEXT”,向具有这个“TEXT”标识的按钮上发消息。
    例如这样://枚举子窗体(这里是广义的Window,因为Button等这样的控件也是Window,这里就是在枚举所有的控件)
    EnumChildWindows(GetParent(hwnd, EnumChildProc, 0);//EnumChildWindows枚举窗体的回调
    BOOL CALLBACK EnumChildProc(HWND hwndChild, LPARAM lParam) 
    {
    TCHAR tmpWindowName[256];
    GetWindowText(hwndChild,tmpWindowName,256);
    if (_tcscmp(tmpWindowName,_T("确认")) == 0)
    {
    PostMessage(..............);
    }
    return TRUE;
    }
      

  17.   


    EnumChildWindows(GetParent(hwnd), EnumChildProc, 0);BOOL CALLBACK EnumChildProc(HWND hwndChild, LPARAM lParam) 
    {
        TCHAR tmpWindowName[256];
        GetWindowText(hwndChild,tmpWindowName,256);
        if (_tcscmp(tmpWindowName,_T("确认")) == 0)
        {
            PostMessage(..............);
        }        
        return TRUE;
    }
      

  18.   

    弱弱的问句:
     GetWindowText(hwndChild,tmpWindowName,256); 
    上面的子窗口句柄hwndChild如何得到?
      

  19.   

    像上述网友说的,枚举控件上的"Text",但是工具栏上的图标是位图,没有"Text"....
    我去枚举,没有成功...
      

  20.   

    SendMessage(WM_COMMAND,MAKEWPARAM(IDcount,BN_CLICKED),(LPARAM)m_hWnd); 
    ::PostMessage(m_hWnd, WM_LBUTTONDOWN, 0, MAKELPARAM(0,0));