向组合框MFC添加可见的窗口标题
Add visible window titles to combobox 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);
首先,您的GetDlgItem
有两个参数,第一个是一个包含控件的对话框的句柄。
所以它期望包含这个控件的对话框的HWND
参数,我假设这将是你传递给你的函数作为参数的HWND
。
CComboBox* pComboBox = (CComboBox*)GetDlgItem(hWnd,IDC_COMBO_PROCESS);
^^^^ added parameter
如果你看MSDN中的EnumWindows
,你会看到你必须传递一个回调它有一个HWND
参数,如果你看这个参数是什么它说:
一个顶级窗口的句柄。
这正是你必须传递给GetDlgItem
的内容。
另外,您应该检查GetWindowText
的返回值,因为它返回写入到您传递给它的buff
的字符数。
int ret = GetWindowText(hWnd, buff, 254);
if (ret > 0) pComboBox->AddString(buff); // only add non-empty strings.
除了用户@mfc提供的,我不会从不同的线程进行UI更新。我相信EnumWindows
没有创建枚举线程。它将调用当前线程的调用堆栈内的回调。
这反过来意味着UI可能会冻结一段时间。因此,建议为枚举创建一个线程。更重要的是,我不会直接从不同的线程更新UI。可能是字符串的vector
,或者PostMessage
(每次迭代),我将使用。
的确,EnumWindows
可能执行得相当快。但是,当你移动到枚举其他(内核)对象,如文件,打印机,用户等- UI肯定会冻结。因此,最好练习编写多线程代码。最初编写mt代码是一件痛苦的事情,但后来您会喜欢它,欣赏它,并且离不开它。
- 无法在 GLFW 窗口标题中显示'ä'
- 为什么抓取窗口标题的代码会导致应用崩溃?
- 如何正确获取 Unicode 窗口标题
- 如何随机化程序的窗口标题?
- 如何在QT中获取背景应用程序窗口标题
- 如何在 Ubuntu Qt 中获取活动窗口标题
- 无法从我的滑动窗口中添加值
- 最佳地将窗口标题替换为新的 QString
- 构造函数字符串参数未设置窗口标题
- 将自定义按钮标题添加到消息框
- 无法在窗口中添加缩略图按钮
- 在Visual Studio发射窗口中添加了其他C 支架
- 要添加或不将QT LIB和标题添加到项目目录中
- 在分层窗口中添加一个子窗口
- 获取C++中的窗口标题
- C++:为什么此窗口标题被截断
- 窗口标题GLFW中的FPS计数器
- 如何永久删除主窗口标题栏
- 使用WM_GETTEXT获取窗口标题
- 向组合框MFC添加可见的窗口标题