Code:
/* */
/* Area Section */
/* */
#define AREA_ABORT 1
#define AREA_CLICK 2
#define AREA_POSMOVED 3
HHOOK AreaMouseHook;
HHOOK AreaKBHook;
long __stdcall AreaCaptureProc(unsigned int _message, long _lParam)
{
static HWND hWnd = FindWindow("XimaSSS", "");
static Win::Window ghostWindow;
static clock_t endWait;
static const int borderSize = 5;
static bool sizing(false);
static POINT startPos;
static POINT endPos;
switch(_message)
{
case AREA_ABORT:
{
sizing = false;
RECT rect;
{
rect.left = startPos.x;
rect.top = startPos.y;
rect.right = endPos.x;
rect.bottom = endPos.y;
RedrawWindow(ghostWindow, &rect, 0, RDW_ALLCHILDREN | RDW_UPDATENOW | RDW_INVALIDATE);
}
startPos.x = startPos.y = 0;
endPos.x = endPos.y = 0;
if(ghostWindow.isWindow())
ghostWindow.destroy();
PostMessage(hWnd, Area_Abort, 0, 0);
break;
}
case AREA_CLICK:
{
if(sizing)
{
sizing = false;
RECT rect;
{
rect.left = startPos.x;
rect.top = startPos.y;
rect.right = endPos.x;
rect.bottom = endPos.y;
RedrawWindow(ghostWindow, &rect, 0, RDW_ALLCHILDREN | RDW_UPDATENOW | RDW_INVALIDATE);
}
startPos.x = startPos.y = 0;
endPos.x = endPos.y = 0;
if(ghostWindow.isWindow())
ghostWindow.destroy();
}
else
{
if(!GetCursorPos(&startPos))
return AreaCaptureProc(AREA_ABORT, 0);
sizing = true;
{
Win::Class _class(0, GetModuleHandle(0), 0, 0, "Dummy", 0, 0);
if(!_class.reg())
return false;
}
ghostWindow.create(0, WS_VISIBLE | WS_CHILD, "Dummy", "", 0, 0, 1280, 1024, 0, GetDesktopWindow());
}
break;
}
case AREA_POSMOVED:
{
if(!sizing)
return 1;
RECT rect;
{
rect.left = startPos.x;
rect.top = startPos.y;
rect.right = endPos.x;
rect.bottom = endPos.y;
RedrawWindow(ghostWindow, &rect, 0, RDW_ALLCHILDREN | RDW_UPDATENOW | RDW_INVALIDATE);
}
GetCursorPos(&endPos);
{
HDC hMarkerDC = GetDC(ghostWindow);
HBRUSH hBorder = CreateSolidBrush(RGB(255, 0, 0));
// tl->tr
rect.left = startPos.x;
rect.top = startPos.y;
rect.right = endPos.x;
rect.bottom = startPos.y > endPos.y ? startPos.y - borderSize : startPos.y + borderSize;
FillRect(hMarkerDC, &rect, hBorder);
// tl->bl
rect.left = startPos.x;
rect.top = startPos.y;
rect.right = startPos.x > endPos.x ? startPos.x - borderSize : startPos.x + borderSize;
rect.bottom = endPos.y;
FillRect(hMarkerDC, &rect, hBorder);
// br->bl
rect.left = startPos.x;
rect.top = endPos.y > startPos.y ? endPos.y - borderSize : endPos.y + borderSize;
rect.right = endPos.x;
rect.bottom = endPos.y;
FillRect(hMarkerDC, &rect, hBorder);
// br->tr
rect.left = endPos.x > startPos.x ? endPos.x - borderSize : endPos.x + borderSize;
rect.top = startPos.y;
rect.right = endPos.x;
rect.bottom = endPos.y;
FillRect(hMarkerDC, &rect, hBorder);
DeleteObject(hBorder);
ReleaseDC(ghostWindow, hMarkerDC);
}
break;
}
}
return 1;
}
LRESULT __stdcall AreaMouseHookProc(int nCode, unsigned int _wParam, long _lParam)
{
if(nCode != HC_ACTION)
return CallNextHookEx(AreaMouseHook, nCode, _wParam, _lParam);
switch(_wParam)
{
case WM_RBUTTONUP:
return AreaCaptureProc(AREA_ABORT, 0);
break;
case WM_LBUTTONUP:
return AreaCaptureProc(AREA_CLICK, 0);
break;
case WM_LBUTTONDOWN:
return AreaCaptureProc(AREA_CLICK, 0);
break;
case WM_MOUSEMOVE:
AreaCaptureProc(AREA_POSMOVED, 0);
return 0;
break;
default:
return CallNextHookEx(AreaMouseHook, nCode, _wParam, _lParam);
}
return 1;
}
LRESULT __stdcall AreaKBHookProc(int nCode, unsigned int _wParam, long _lParam)
{
if(nCode != HC_ACTION)
return CallNextHookEx(AreaKBHook, nCode, _wParam, _lParam);
switch(_wParam)
{
case WM_KEYDOWN:
switch(reinterpret_cast<kbstruct*>(_lParam)->vkCode)
{
case VK_SPACE:
//PostMessage(hWnd, CW_WindowSelected, 0, 0);
break;
case VK_ESCAPE:
return AreaCaptureProc(AREA_ABORT, 0);
break;
default:
return CallNextHookEx(AreaKBHook, nCode, _wParam, _lParam);
}
break;
default:
return CallNextHookEx(AreaKBHook, nCode, _wParam, _lParam);
}
return 1;
}