Applying this philosophy means that from time to time i need to play "find the window" and I have finally got round to writing a relatively generic class to do this. Being that kind of guy, I thought i'd share it with you all so you can have a good snigger.
Here it is: surprisingly named: WindowFinder
#pragma once
#include "../../StdString.h"
struct WinFindData
{
WinFindData(CStdString sTextToFind) : m_sTextToFind(sTextToFind),
m_bFound(false) ,
m_hWnd(NULL) {}
CStdString m_sTextToFind;
bool m_bFound;
HWND m_hWnd;
};
class WindowFinder
{
public:
WindowFinder(CStdString sWindowTitle);
virtual ~WindowFinder(){};
bool Find(HWND hWnd, HWND& pHwndFound);
HWND GetHWND()
{
return m_hWnd;
}
private:
CStdString m_sWindowTitle;
HWND m_hWnd;
static BOOL CALLBACK EnumChildProc( HWND hwnd, LPARAM lParam);
};
WindowFinder::WindowFinder(CStdString sWindowTitle)
: m_sWindowTitle(sWindowTitle)
{
}
bool WindowFinder::Find(HWND hWnd, HWND& pHwndFound)
{
WinFindData winFindData(m_sWindowTitle);
LPARAM lParam =(LPARAM)&winFindData;
EnumChildWindows(hWnd, WindowFinder::EnumChildProc, lParam);
pHwndFound = winFindData.m_hWnd;
return winFindData.m_bFound;
}
BOOL CALLBACK WindowFinder::EnumChildProc( HWND hWnd, LPARAM lParam)
{
WinFindData* pData = (WinFindData*)lParam;
if(pData->m_bFound)
return TRUE;
CStdString sWindowTitle = pData->m_sTextToFind;
CStdString sText;
::GetWindowText(hWnd, sText.GetBuffer(MAX_PATH),MAX_PATH);
sText.ReleaseBuffer();
if(sWindowTitle.CompareNoCase(sText) ==0)
{
pData->m_bFound = true;
pData->m_hWnd = hWnd;
return TRUE;
}
else
{
WindowFinder finder(pData->m_sTextToFind);
if( finder.Find(hWnd, pData->m_hWnd))
{
pData->m_bFound = true;
pData->m_hWnd = finder.GetHWND();
}
}
return TRUE;
}
No comments:
Post a Comment