怎样用MFC获得已经打开了的窗口的名字?

2024-11-16 19:36:50
推荐回答(3个)
回答(1):

CWnd *wnd = GetDesktopWindow()->GetWindow(GW_CHILD);
while(wnd!=NULL)
{
if(wnd->IsWindowVisible())
{
wnd->GetWindowText(s);//窗口名
GetClassName(wnd->m_hWnd,buff,1024);//类名
str+=s+" ";
}
wnd = wnd->GetWindow(GW_HWNDNEXT);
}

回答(2):

用FindWindow获取窗口句柄,然后用GetWindowText获取窗口名字。

回答(3):

使用EnumWindows函数可以实现遍历所有的顶层窗口程序,并得到程序的句柄、类名及标题信息。
开发核心过程:
创建一个单文档的MFC工程,将其视图类的基类设置为CListView。在视图类的PreCreateWindow函数中,设置列表为报表格式,如下:
BOOL CEnumWindowsProcView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
cs.style |= LVS_REPORT | LVS_NOSORTHEADER;//设置列表视为报表格式
return CListView::PreCreateWindow(cs);
}
在视图类的初始化函数OnInitialUpdate()中,添加列表控件的表头,代码如下:
void CEnumWindowsProcView::OnInitialUpdate()
{
CListView::OnInitialUpdate();
CListCtrl& lc = GetListCtrl();
lc.InsertColumn(0, _T("窗口句柄"),LVCFMT_LEFT,180);
lc.InsertColumn(1, _T("窗口类"),LVCFMT_LEFT,180,1);
lc.InsertColumn(2, _T("窗口标题"),LVCFMT_LEFT,280,1);
// TODO: You may populate your ListView with items by directly accessing
// its list control through a call to GetListCtrl().
}
添加菜单项“窗口程序信息”,并在视图类添加其响应:
void CEnumWindowsProcView::OnGet() //获取窗口信息
{
// TODO: Add your command handler code here
CListCtrl& lc = GetListCtrl();
lc.DeleteAllItems();
EnumWindows(MyEnumWindowsProc, (LPARAM)this);//遍历窗口程序
}
其中,MyEnumWindowsProc函数为订阅的回调函数,实现代码如下:
BOOL CALLBACK CEnumWindowsProcView::MyEnumWindowsProc(HWND hwnd, LPARAM lParam)
{
CEnumWindowsProcView* pView = (CEnumWindowsProcView*)lParam;
CListCtrl& lc =pView->GetListCtrl();
int iItem=-1;
if (hwnd!=pView->GetParentFrame()->GetSafeHwnd()) //不是本程序
{
DWORD dwStyle = GetWindowLong(hwnd, GWL_STYLE);
if ((dwStyle & WS_OVERLAPPEDWINDOW) && (dwStyle & WS_VISIBLE))
{
// add window to list
CString s;
s.Format("主窗口(%04X)",hwnd);//窗口句柄
iItem = lc.InsertItem(lc.GetItemCount(),s);
CWnd* pWnd = CWnd::FromHandle(hwnd);
// 窗口类名
::GetClassName(hwnd, s.GetBuffer(256), 256);
int iSubitem = 1;
lc.SetItemText(iItem,iSubitem++,s);
// 窗口标题
pWnd->GetWindowText(s);
lc.SetItemText(iItem,iSubitem++,s);
}
}
return TRUE;
}
编译运行程序。