#include "Main.h"
BOOL WINAPI EnumWindowProc(HWND Window, LPARAM Context)
{
((WindowList *)Context)->RecordWindow(Window);
return TRUE;
}
bool IsShellWindow(HWND Window)
{
if(!IsWindow(Window) || !IsWindowVisible(Window))
{
return false;
}
if(GetAncestor(Window, GA_PARENT) != GetDesktopWindow())
{
return false;
}
RECT ClientRect;
GetClientRect(Window, &ClientRect);
if(ClientRect.right - ClientRect.left <= 1 || ClientRect.bottom - ClientRect.top <= 1)
{
return false;
}
char cDescription[256];
GetWindowText(Window, cDescription, 256);
String Description = cDescription;
if(Description.Length() == 0 || Description == "Start")
{
return false;
}
return true;
}
void WindowList::RecordWindow(HWND Window)
{
if(IsShellWindow(Window))
{
_AllWindows.PushEnd();
WindowInfo &CurWindow = _AllWindows.Last();
CurWindow.Window = Window;
RECT WindowRect, ClientRect;
GetWindowRect(Window, &WindowRect);
GetClientRect(Window, &ClientRect);
CurWindow.Dimensions = Vec2i(ClientRect.right - ClientRect.left, ClientRect.bottom - ClientRect.top);
char Description[256];
GetWindowText(Window, Description, 256);
CurWindow.Description = Description;
if(CurWindow.Description == "Program Manager")
{
CurWindow.Description = "Whole Screen";
}
}
}
void WindowList::UpdateList()
{
_AllWindows.FreeMemory();
EnumChildWindows(GetDesktopWindow(), EnumWindowProc, (LPARAM)this);
}
void WindowList::Save(const String &Filename)
{
ofstream File(Filename.CString());
File << _AllWindows.Length() << endl;
for(UINT Index = 0; Index < _AllWindows.Length(); Index++)
{
const WindowInfo &CurWindow = _AllWindows[Index];
File << UINT32(CurWindow.Window) << '\t' << CurWindow.Dimensions.x << '\t' << CurWindow.Dimensions.y << '\t' << CurWindow.Description << endl;
}
}