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

标签 c++ mfc combobox

我想将可见的窗口标题添加到组合框。这是我的来源:

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++ - 将可见窗口标题添加到组合框 MFC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15311708/

相关文章:

c++ - 设置 MFC 对话框的位置

c++ - C++ 中 CString 的字节数

C# 如何在设计中设置字符串集合的默认值

r - R中使用tcltk的多个组合框

C++ boost::qi 将空格和换行符分隔的数字解析为二维 vector

c++ - 单元测试 C++11 闭包

C++ | cout, 打印返回的对象

c++ - 将基类的对象转换为派生类

c# - 从 C# 修改任何窗口的不透明度

mysql - 通过 Combobox 和 SQL 数据库表填充文本框