通过类名和窗口名查找指定窗口
BOOL CALLBACK MyEnumProc(HWND hwnd, LPARAM lParam);
class CFindHWND
{
public:
CFindHWND();
~CFindHWND();
HWND FindWindow(HWND parent, CString wnd_class, CString wnd_name);
BOOL EnumProc(HWND, LPARAM);
protected:
BOOL IsEqual(HWND hwnd, CString wnd_class, CString wnd_name);
private:
BOOL is_finded;
HWND finded_hwnd;
CString find_wnd_class;
CString find_wnd_name;
};
CFindHWND::CFindHWND():is_finded(FALSE),finded_hwnd(FALSE)
{
}
CFindHWND::~CFindHWND()
{
}
HWND CFindHWND::FindWindow(HWND parent, CString wnd_class, CString wnd_name)
{
find_wnd_class = wnd_class;
find_wnd_name = wnd_name;
EnumChildWindows(parent, MyEnumProc, (LPARAM)this);
return finded_hwnd;
}
BOOL CFindHWND::IsEqual(HWND hwnd, CString wnd_class, CString wnd_name)
{
TCHAR tmp_name[MAX_PATH] = {0};
TCHAR tmp_class[MAX_PATH] = {0};
GetWindowText(hwnd, tmp_name, MAX_PATH);
if (wnd_name.CompareNoCase(tmp_name) == 0) {
GetClassName(hwnd, tmp_class, MAX_PATH);
if (wnd_class.CompareNoCase(tmp_class) == 0) return TRUE;
}
return FALSE;
}
BOOL CFindHWND::EnumProc(HWND hwnd, LPARAM)
{
if (is_finded)return FALSE;
if (IsEqual(hwnd,find_wnd_class, find_wnd_name))
{
is_finded = TRUE;
finded_hwnd = hwnd;
return FALSE;
}
if(::GetTopWindow(hwnd))
{
EnumChildWindows(hwnd, MyEnumProc, NULL);
}
return TRUE;
}
BOOL CALLBACK MyEnumProc(HWND hwnd, LPARAM lParam)
{
CFindHWND* ptr = (CFindHWND*)lParam;
BOOL is_continue = FALSE;
if(ptr){
is_continue = ptr->EnumProc(hwnd, lParam);
}
return is_continue;
}
使用:
CFindHWND find;
HWND hwnd = find.FindWindowW(GetDesktopWindow()->m_hWnd, L"Chrome_RenderWidgetHostHWND", L"Chrome Legacy Window");