c – 将可见窗口标题添加到组合框MFC

我想在组合框中添加可见的窗口标题.这是我的来源:

BOOL CALLBACK EnumWindowsProc(HWND hWnd,long lParam) 
{
     TCHAR buff[255];
     CComboBox* pComboBox = (CComboBox*)GetDlgitem(IDC_COMBO_PROCESS);
     if (IsWindowVisible(hWnd)) 
     {
         GetwindowText(hWnd,buff,254);
         pComboBox->AddString(buff);
     }
     return TRUE;
}

void CFindProcess::OnDropdownComboProcess()
{
    EnumWindows(EnumWindowsProc,0);
}

但我得到错误

error C2660: 'GetDlgitem' : function does not take 1 arguments  60

我怎样才能正确添加标题到组合?

解决方法

MFC对象是线程敏感的,GetDlgitem在创建对象的线程中运行良好,可能是主UI线程.函数EnumWindows可能会创建一个工作线程来访问回调函数,这就是GetDlgitem无法获得组合框的有效句柄的原因.

要在另一个线程中正确访问组合框,您必须使用静态函数:CWnd :: FromHandle与组合框对象的原始句柄,如下所示:

BOOL CALLBACK EnumWindowsProc(HWND hWnd,long lParam) 
{
    if (IsWindowVisible(hWnd)) 
    {   TCHAR szBuffer[255];
        INT nLength = GetwindowText(hWnd,szBuffer,254);
        if (nLength>0)
        {   // only add windows that has a caption
            CComboBox *pComboBox = (CComboBox*)CWnd::FromHandle((HWND)lParam);
            pComboBox->AddString(szBuffer);
        }
    }
    return TRUE;
}

// call EnumWindows --------------------
CComboBox *pComboBox = (CComboBox *)GetDlgitem(IDC_COMBO1);
// passing the raw handle of the comboBox as parameter
EnumWindows(EnumWindowsProc,(LParaM)pComboBox->m_hWnd);

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...