Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

221 lines
4.1 KiB

/*++
Copyright (c) 2000 Microsoft Corporation
Module Name:
WindowSearch.h
Abstract:
Author:
Hakki T. Bostanci (hakkib) 06-Apr-2000
Revision History:
--*/
#ifndef _WINDOWSEARCH_H_
#define _WINDOWSEARCH_H_
//////////////////////////////////////////////////////////////////////////
//
//
//
class CWindowSearch
{
public:
CWindowSearch()
{
m_nMatches = -1;
//m_hWnd = 0;
}
friend HWND FindChildWindow(HWND hWnd, CWindowSearch &rWindowSearch)
{
rWindowSearch.m_nMatches = 0;
EnumChildWindows(hWnd, EnumProc, (LPARAM) &rWindowSearch);
return rWindowSearch.Result();
}
friend HWND WaitForChildWindow(HWND hWnd, CWindowSearch &rWindowSearch, HANDLE hBreak)
{
rWindowSearch.m_nMatches = 0;
do
{
EnumChildWindows(hWnd, EnumProc, (LPARAM) &rWindowSearch);
}
while (rWindowSearch.m_nMatches == 0 && WaitForSingleObject(hBreak, 250) == WAIT_TIMEOUT);
return rWindowSearch.Result();
}
friend HWND FindThreadWindow(DWORD dwThreadId, CWindowSearch &rWindowSearch)
{
rWindowSearch.m_nMatches = 0;
EnumThreadWindows(dwThreadId, EnumProc, (LPARAM) &rWindowSearch);
return rWindowSearch.Result();
}
friend HWND WaitForThreadWindow(DWORD dwThreadId, CWindowSearch &rWindowSearch, HANDLE hBreak)
{
rWindowSearch.m_nMatches = 0;
do
{
EnumThreadWindows(dwThreadId, EnumProc, (LPARAM) &rWindowSearch);
}
while (rWindowSearch.m_nMatches == 0 && WaitForSingleObject(hBreak, 250) == WAIT_TIMEOUT);
return rWindowSearch.Result();
}
HWND Result() const
{
switch (m_nMatches)
{
case -1:
SetLastError(ERROR_NOT_FOUND);//ERROR_NOT_STARTED);
return 0;
case 0:
SetLastError(ERROR_NOT_FOUND);
return 0;
case 1:
return m_hWnd;
default:
SetLastError(ERROR_NOT_FOUND);//ERROR_MULTIPLE_FOUND);
return 0;
}
}
private:
virtual BOOL TestWindow(HWND hWnd) = 0;
static BOOL CALLBACK EnumProc(HWND hWnd, LPARAM lParam)
{
return ((CWindowSearch *)lParam)->TestWindow(hWnd);
}
protected:
int m_nMatches;
HWND m_hWnd;
};
//////////////////////////////////////////////////////////////////////////
//
//
//
class CWindowSearchByText : public CWindowSearch
{
public:
explicit CWindowSearchByText(PCTSTR pszText)
{
m_pszText = pszText;
}
virtual BOOL TestWindow(HWND hWnd)
{
if (_tcscmp(CWindowText(hWnd), m_pszText) == 0)
{
++m_nMatches;
m_hWnd = hWnd;
}
return TRUE;
}
private:
PCTSTR m_pszText;
};
//////////////////////////////////////////////////////////////////////////
//
//
//
class CWindowSearchByClass : public CWindowSearch
{
public:
explicit CWindowSearchByClass(PCTSTR pszClass)
{
m_pszClass = pszClass;
}
virtual BOOL TestWindow(HWND hWnd)
{
if (_tcscmp(CClassName(hWnd), m_pszClass) == 0)
{
++m_nMatches;
m_hWnd = hWnd;
}
return TRUE;
}
private:
PCTSTR m_pszClass;
};
//////////////////////////////////////////////////////////////////////////
//
//
//
class CWindowSearchById : public CWindowSearch
{
public:
explicit CWindowSearchById(int nId)
{
m_nId = nId;
}
virtual BOOL TestWindow(HWND hWnd)
{
if (GetDlgCtrlID(hWnd) == m_nId)
{
++m_nMatches;
m_hWnd = hWnd;
}
return TRUE;
}
private:
int m_nId;
};
//////////////////////////////////////////////////////////////////////////
//
//
//
inline BOOL PushButton(HWND hWnd)
{
return
PostMessage(hWnd, WM_LBUTTONDOWN, 0, 0) &&
PostMessage(hWnd, WM_LBUTTONUP, 0, 0);
}
//////////////////////////////////////////////////////////////////////////
//
//
//
inline BOOL SetText(HWND hWnd, PCTSTR pText)
{
return SendMessage(hWnd, WM_SETTEXT, 0, (LPARAM) pText);
}
#endif //_WINDOWSEARCH_H_