#include #include #include "advanced-scene-switcher.hpp" using namespace std; static bool GetWindowTitle(HWND window, string &title) { size_t len = (size_t)GetWindowTextLengthW(window); wstring wtitle; wtitle.resize(len); if (!GetWindowTextW(window, &wtitle[0], (int)len + 1)) return false; len = os_wcs_to_utf8(wtitle.c_str(), 0, nullptr, 0); title.resize(len); os_wcs_to_utf8(wtitle.c_str(), 0, &title[0], len + 1); return true; } static bool WindowValid(HWND window) { LONG_PTR styles, ex_styles; RECT rect; DWORD id; if (!IsWindowVisible(window)) return false; GetWindowThreadProcessId(window, &id); if (id == GetCurrentProcessId()) return false; GetClientRect(window, &rect); styles = GetWindowLongPtr(window, GWL_STYLE); ex_styles = GetWindowLongPtr(window, GWL_EXSTYLE); if (ex_styles & WS_EX_TOOLWINDOW) return false; if (styles & WS_CHILD) return false; return true; } void GetWindowList(vector &windows) { HWND window = GetWindow(GetDesktopWindow(), GW_CHILD); while (window) { string title; if (WindowValid(window) && GetWindowTitle(window, title)) windows.emplace_back(title); window = GetNextWindow(window, GW_HWNDNEXT); } } void GetCurrentWindowTitle(string &title) { HWND window = GetForegroundWindow(); DWORD id; GetWindowTitle(window, title); } pair getCursorPos() { pair pos(0, 0); POINT cursorPos; if (GetPhysicalCursorPos(&cursorPos)) { pos.first = cursorPos.x; pos.second = cursorPos.y; } return pos; } bool isFullscreen() { RECT appBounds; RECT rc; GetWindowRect(GetDesktopWindow(), &rc); HWND hwnd = GetForegroundWindow(); if (hwnd != GetDesktopWindow() && hwnd != GetShellWindow()) { GetWindowRect(hwnd, &appBounds); if (rc.bottom == appBounds.bottom && rc.top == appBounds.top && rc.left == appBounds.left && rc.right == appBounds.right) { return true; } } return false; }