如题,我有个MFC程序要捕获另一个程序弹出的消息窗口,窗口有“Yes”和“NO”按钮,我想实现程序自动选择Yes按钮来继续运行……请问怎么实现?谢谢~

解决方案 »

  1.   

    1、查找窗口:HWND hDest = FindWindow(...);2、模拟鼠标按键:
    ::PostMessage(hDest, WM_LBUTTONDOWN, wparam, lparam);
    ::PostMessage(hDest, WM_LBUTTONUP, wparam, lparam);
      

  2.   

    这个方法可行,不过你是想让MFC程序在没有焦点也能随时捕捉的话,用全局钩子吧
      

  3.   


    您这里好像没看到怎么选择Yes按钮喔
      

  4.   

    怎么个正解法?里面都没说怎么选择yes button,而且它默认的按钮是"No"
      

  5.   


    要选择哪个按钮,是在EnumWindows的回调函数里面来判断的(可能这里让你混淆了)。找到窗口句柄之后,直接向这个窗口发消息,就不存在哪个是默认的了。struct tagFW
    {
        HWND  hwnd;
        TCHAR tcTitle[80];
    }FW, *LPFW;
    BOOL CALLBACK EnumWindowsProc(HWND hwnd/*当前找到的窗口句柄*/, LPARAM lParam/*自定义参数*/)
    {
        TCHAR tcTitle[256];
        LPFW  pFW = (LPFW)lParam;    ::GetWindowText(hwnd, tcTitle, sizeof(tcTitle) / sizeof(tcTitle[0]);
        if( _tcsicmp(tcTitle, pFW->tcTitle) == 0 )
        {
            // 找到,保存参数并终止查找
            pFW->hwnd = hwnd;
            return FALSE;
        }
        else
        {
            return TRUE;
        }
    }CYourDlg::OnBnClickedFindWindow()
    {
        FW fw = {NULL, _T("Yes")};
        EnumWindows(EnumWindowsProc, (LPARAM)&fw);    // 发消息。。两个消息参数自己查阅MSDN
        ::PostMessage(fw.hwnd, WM_LBUTTONDOWN, wparam, lparam); 
        ::PostMessage(fw.hwnd, WM_LBUTTONUP, wparam, lparam);
    }
      

  6.   

    1、查找窗口:HWND hDest = FindWindow(...); 2、查找按钮:HWND hbtn = FindWindowEx(hDest ,..); 2、模拟鼠标按键: 
    ::PostMessage(hbtn , WM_LBUTTONDOWN, wparam, lparam); 
    ::PostMessage(hbtn , WM_LBUTTONUP, wparam, lparam); 
      

  7.   

    API:FindWindow() 找到那个窗口的句柄
    API:GetDlgItemID()找到那个窗口中你要的那个按钮的句柄(前提是,要用spy++先找到那个按钮在窗口中的控件ID)
    API:SendMessage() 根据那个按钮的句柄发送一个WM_COMMAND消息即可
      

  8.   

    ::PostMessage(fw.hwnd, WM_LBUTTONDOWN, wparam, lparam); 
    wparam,与lparam两个变量是什么来的,要定义阿!!
      

  9.   


    我就直接像下面定义??
    WPARAM wparam;
    LPARAM lparam;
    但这样定义了有啥意义??
    什么时候用到它??
      

  10.   

    服了你们,没MSDN吗?CYourDlg::OnBnClickedFindWindow()
    {
        FW fw = {NULL, _T("Yes")};
        EnumWindows(EnumWindowsProc, (LPARAM)&fw);    // 发消息。。两个消息参数自己查阅MSDN
        ::PostMessage(fw.hwnd, WM_LBUTTONDOWN, WPARAM(MK_LBUTTON), MAKELPARAM(1, 1)); 
        ::PostMessage(fw.hwnd, WM_LBUTTONUP, WPARAM(MK_LBUTTON), MAKELPARAM(1, 1)); 
    }
      

  11.   

    可能我结帖快了点了:
    下面是我的代码,可是却不能实现功能:typedef struct tagFW
    {
        HWND  hwnd;
        TCHAR tcTitle[80];
    }FW, *LPFW;
    BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam)
    {
        TCHAR tcTitle[1024];
        LPFW  pFW = (LPFW)lParam;    ::GetWindowText(hwnd, tcTitle, sizeof(tcTitle) / sizeof(tcTitle[0]));
        if( _tcsicmp(tcTitle, pFW->tcTitle) == 0 )
        {
            pFW->hwnd = hwnd;
            return FALSE;
        }
        else
        {
            return TRUE;
        }
    }void CAddDlg::OnClosebtn() 
    {
    FW fw = {NULL, _T("Yes")};
        EnumWindows(EnumWindowsProc, (LPARAM)&fw);    ::PostMessage(fw.hwnd, WM_LBUTTONDOWN, WPARAM(MK_LBUTTON), MAKELPARAM(1, 1)); 
        ::PostMessage(fw.hwnd, WM_LBUTTONUP, WPARAM(MK_LBUTTON), MAKELPARAM(1, 1));
    }
    希望全能的vcPlayer 能继续帮我看一下问题所在呀~