#include #include #include "auto-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; GetWindowThreadProcessId(window, &id); if (id == GetCurrentProcessId()) { title = ""; return; } GetWindowTitle(window, title); }