我想在组合框中添加可见的窗口标题.这是我的来源:
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);