一. 对于有指定的窗口标题名称的窗口用FindWindow就可以满足要求;
二. 对于同一应用程序的多个实例枚举(ViewWnd.exe同时运行了3个实例,要把它们都要枚举出来),可以使用FindWindowEx。例如:
HWND hwndLog=NULL;
HWND hWnd[10]={NULL,NULL,NULL,NULL};
int nCount =0;
do
{
hwndLog=::FindWindowEx(NULL,hwndLog,NULL,_T("ViewWnd"),);
if(hwndLog!=NULL && nCount<10 )
hWnd[nCount++] = hwndLog;
}
while(hwndLog!=NULL);
三. 如果对于题栏自动改变,比如我们要检测 Notepad是不是已运行而事先不知道Notepad的标题栏,显然FindWindow和FindWindowEx都是无能为力的。这种情况我们可以通过枚举 windows任务列表的办法来实现
//我自己对要找到的窗口进行相应的操作
BOOL ProceWndTask(HWND hWnd)
{
...............................
return TRUE;
}
//定义一个EnumWindows要调用的回调函数
BOOL CALLBACK EnumWindowProc(HWND hWnd, LPARAM lParam)
{
TCHAR szClass[256]={0};
TCHAR szWindow[256]={0};
::GetWindowText(hWnd, szWindow, 255); //获取窗口标题
::GetClassName(hWnd, szClass, 255); //获取窗口类名称
if ( ::IsWindow(hWnd) && //判断是否为一个窗口
::IsWindowVisible(hWnd) && //如果指定的窗口及其父窗口具有WS_VISIBLE风格即可见窗口
(::GetWindowLong(hWnd, GWL_EXSTYLE)&WS_EX_TOOLWINDOW)!=WS_EX_TOOLWINDOW &&
::GetWindowLong(hWnd, GWL_HWNDPARENT)==0 )
{
int i=wcslen(szClass);
TCHAR* cFind = NULL;
cFind = wcsstr(szWindow,_T("ViewWnd"));
if(cFind)
{
ProceWndTask(hWnd);
}
}
}
return TRUE;
}
然后在我们的程序里可以调用 EnumWindows(EnumWindowProc, NULL)即可
二. 对于同一应用程序的多个实例枚举(ViewWnd.exe同时运行了3个实例,要把它们都要枚举出来),可以使用FindWindowEx。例如:
HWND hwndLog=NULL;
HWND hWnd[10]={NULL,NULL,NULL,NULL};
int nCount =0;
do
{
hwndLog=::FindWindowEx(NULL,hwndLog,NULL,_T("ViewWnd"),);
if(hwndLog!=NULL && nCount<10 )
hWnd[nCount++] = hwndLog;
}
while(hwndLog!=NULL);
三. 如果对于题栏自动改变,比如我们要检测 Notepad是不是已运行而事先不知道Notepad的标题栏,显然FindWindow和FindWindowEx都是无能为力的。这种情况我们可以通过枚举 windows任务列表的办法来实现
//我自己对要找到的窗口进行相应的操作
BOOL ProceWndTask(HWND hWnd)
{
...............................
return TRUE;
}
//定义一个EnumWindows要调用的回调函数
BOOL CALLBACK EnumWindowProc(HWND hWnd, LPARAM lParam)
{
TCHAR szClass[256]={0};
TCHAR szWindow[256]={0};
::GetWindowText(hWnd, szWindow, 255); //获取窗口标题
::GetClassName(hWnd, szClass, 255); //获取窗口类名称
if ( ::IsWindow(hWnd) && //判断是否为一个窗口
::IsWindowVisible(hWnd) && //如果指定的窗口及其父窗口具有WS_VISIBLE风格即可见窗口
(::GetWindowLong(hWnd, GWL_EXSTYLE)&WS_EX_TOOLWINDOW)!=WS_EX_TOOLWINDOW &&
::GetWindowLong(hWnd, GWL_HWNDPARENT)==0 )
{
int i=wcslen(szClass);
TCHAR* cFind = NULL;
cFind = wcsstr(szWindow,_T("ViewWnd"));
if(cFind)
{
ProceWndTask(hWnd);
}
}
}
return TRUE;
}
然后在我们的程序里可以调用 EnumWindows(EnumWindowProc, NULL)即可