用部分标题查找WINDOWS 窗口
2005年11月10日 星期四 12:59
用Windows API的FindWindow函数查找窗口是最常用的方法,但需要提供ClassName和完整的窗口标题,对于大多数的应用ClassName几乎无法得到,对于某些窗口比如MDI窗口的标题往往会在打开不同的文档时标题也会改变,我们只能知道窗口的部分名称。此时无法使用FindWindow.WINDOWS API的EnumWindows这个函数可以穷举所有的窗口,利用这个函数我写了个简单类可以实现利用部分窗口的文字查找到所需的窗口。程序比较简单,但稍加扩展可以做的很强。程序如下
// NFFindWindow.h: interface for the CNFFindWindow class.
//
//////////////////////////////////////////////////////////////////////
#if !defined(AFX_NFFINDWINDOW_H__4311FDC0_B190_448D_80DC_31D66CC4EDF1__INCLUDED_)
#define AFX_NFFINDWINDOW_H__4311FDC0_B190_448D_80DC_31D66CC4EDF1__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#define WND_TITLE_LEN 256
typedef struct
{
HWND hwnd;
char wndTitle[WND_TITLE_LEN];
}WINDOW_INFO;
typedef vector <WINDOW_INFO> WNDLISTTYPE;
class CNFFindWindow
{
private:
WNDLISTTYPE m_vector_winList;
static BOOL CALLBACK MyEnumWindowsProc(HWND hwnd, LPARAM lp);
public:
HWND FindStrInTitle(CString str);
CNFFindWindow();
virtual ~CNFFindWindow();
};
#endif // !defined(AFX_NFFINDWINDOW_H__4311FDC0_B190_448D_80DC_31D66CC4EDF1__INCLUDED_)
// NFFindWindow.cpp: implementation of the CNFFindWindow class.
//
//////////////////////////////////////////////////////////////////////
#include “stdafx.h”
#include “NFFindWindow.h”
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CNFFindWindow::CNFFindWindow()
{
}
CNFFindWindow::~CNFFindWindow()
{
}
BOOL CALLBACK CNFFindWindow::MyEnumWindowsProc(HWND hwnd, LPARAM lp)
{
WNDLISTTYPE *wndList;
wndList=(WNDLISTTYPE*) lp;
char buffer[WND_TITLE_LEN];
WINDOW_INFO wndInfo;
::GetWindowText(hwnd,buffer,WND_TITLE_LEN);
wndInfo.hwnd=hwnd;
strcpy(wndInfo.wndTitle,buffer);
wndList->push_back(wndInfo);
return true;
}
HWND CNFFindWindow::FindStrInTitle(CString str)
{
WINDOW_INFO wndInfo;
CString csTmp;
m_vector_winList.clear();
EnumWindows(MyEnumWindowsProc,(LPARAM)&m_vector_winList);
for (unsigned int i=0; i<m_vector_winList.size();i++)
{
wndInfo=m_vector_winList[i];
csTmp=wndInfo.wndTitle;
if (csTmp.Find(str)>=0)
{
return wndInfo.hwnd;
}
}
return NULL;
}
实用举例:
CNFFindWindow findWnd;
HWND hwnd=findWnd.FindStrInTitle(”记事本”);
if (hwnd)
{
AfxMessageBox(”记事本正在运行”);
}
else
{
AfxMessageBox(”记事本未运行”);
}
最近评论