我想在组合框中添加可见的窗口标题.这是我的来源:
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);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。