我也是经过搜索论坛,找到一些例子,东摸摸西摸摸,然后成了下面这些代码功能是对话框上的一个按钮,想通过点击这个按钮执行一些准备后,就去点击一个按钮
目前我通过Spy知道了这个按钮的ID是204,但是这个软件窗口是有5个窗口的,有3个窗口是有组,
下面还有有些窗口,而我这个204的按钮是在第2组下面的一个窗口(不知道我对窗口的理解无错误?)然后我这段执行代码只能去历遍5个窗口,下面的子窗口是历遍不到的,所以都确定不下那个按钮句柄,
麻烦高手帮我一下,我折腾了一晚都搞不出来,能力水平所限void CokbyPSDlg::OnBnClickedButton2()   //执行
{
/********************/
        /*执行了一些过程,略*/
        /********************/ HWND hwnd = FindWindow(NULL,_T("登记评审确定"));
        //找到另外一个软件的目标窗口 HWND hChildWnd = ::GetWindow(hwnd, GW_CHILD);        //开始找
while( hChildWnd!=NULL )
{
int nID = ::GetDlgCtrlID(hChildWnd);
CString kk;
kk.Format(L"%d",nID);
AfxMessageBox(kk);
                //我通过消息窗口来看看逐个显示的ID             

SendMessage(hChildWnd,WM_LBUTTONDOWN,0,0); //发点击
                
hChildWnd = ::GetWindow(hChildWnd, GW_HWNDNEXT);
}  
        //只历遍大窗口,小窗口历遍不到,所以看不到204这个窗口...}

解决方案 »

  1.   

    SyntaxBOOL EnumChildWindows(          HWND hWndParent,
        WNDENUMPROC lpEnumFunc,
        LPARAM lParam
    );
    ParametershWndParent
    [in] Handle to the parent window whose child windows are to be enumerated. If this parameter is NULL, this function is equivalent to EnumWindows. 
    Windows 95/98/Me: hWndParent cannot be NULL.lpEnumFunc
    [in] Pointer to an application-defined callback function. For more information, see EnumChildProc. 
    lParam
    [in] Specifies an application-defined value to be passed to the callback function. 
    SyntaxBOOL CALLBACK EnumChildProc(          HWND hwnd,
        LPARAM lParam
    );
    Parametershwnd
    [in] Handle to a child window of the parent window specified in EnumChildWindows. 
    lParam
    [in] Specifies the application-defined value given in EnumChildWindows. 
    Return ValueTo continue enumeration, the callback function must return TRUE; to stop enumeration, it must return FALSE.
      

  2.   

    你可以通过spy++看看这个点这个按钮向哪个窗口发了什么消息
    然后直接PostMessage这个按钮消息就可以
    不用所谓模拟点击
      

  3.   

    想办法找到按钮的父窗口,pHwnd然后用GetDlgItem
    HWND hwnd=::GetDlgItem(pHwnd,204);  
    ::SendMessage(hwnd,WM_LBUTTONDOWN,0,0);很多情况你找不到按钮的ID,或者ID是不对的,像你上面遍历没什么必要,直接用spy++查这个按钮的父窗口,以及父窗口的父窗口....一层一层找下来就行了
      

  4.   

    如果找对了按钮窗口,得到了句柄,建议如下操作:
    PostMessage(hwndBtn,WM_LBUTTONDOWN,0,0);
    Sleep(5);
    PostMessage(hwndBtn,WM_LBUTTONUP,0,0); 
      

  5.   

    一定要在发送DOWN以后,要发送鼠标的UP消息
      

  6.   

    FindWindowEx可以,找到该Button的HWND窗口句柄,然后直接发送BN_CLICKED notification
    PostMessage(HWND_PARENT, WM_COMMAND, (WPARAM)MAKEWPARAM(ID, BN_CLICKED), (LPARAM)HWND_BUTTON);
      

  7.   


    我了解过这个,应该用这个来枚举子窗口,也有常试过这个API函数,不过不知道为什么老是弄不起来,
    貌似要一个回调的,在MFC里我搞不起来,所以才发了这个求助帖
    能理解大大的意思,不过现阶段,还是向按钮发消息先,我有用spy++看到这些消息,不过暂时不能理解内容,
    post是下一步折腾的计划,呵呵呵明白,可是我看了MSDN的说明就糊涂了,或者说不知道应该如何开始。
    这次找到的ID是肯定正确的,呵呵
    FindWindowEx在MSDN的例子看上去摸不到门道在我这个事情上来用,囧