From e703551b4a169746d40409d198b9e2577631bc90 Mon Sep 17 00:00:00 2001 From: Seraphima Zykova Date: Wed, 27 Apr 2022 23:21:00 +0300 Subject: [PATCH] [Tools]Add a tool to get window styles (#17824) * window styles tool * removed window name * new line delimiter * spell * rename tool * add tool to installer * added info * app name * clean up * spell check * Update tools/WindowStylesReportTool/WindowStylesReportTool.cpp * class name * spell check * PROCESS_QUERY_LIMITED_INFORMATION * updated installer docs * pipeline * added release dependency * signing * pipeline * removed font * timestamp * Update tools/WindowStylesReportTool/WindowStylesReportTool.cpp Co-authored-by: Heiko <61519853+htcfreek@users.noreply.github.com> --- .github/actions/spell-check/expect.txt | 6 + .pipelines/ESRPSigning_core.json | 1 + .../ci/templates/build-powertoys-steps.yml | 19 + .pipelines/release.yml | 11 + doc/devdocs/readme.md | 7 + installer/PowerToysSetup/Product.wxs | 4 + tools/WindowStylesReportTool/Resource.h | 24 + .../WindowStylesReportTool.cpp | 424 ++++++++++++++++++ .../WindowStylesReportTool.h | 3 + .../WindowStylesReportTool.ico | Bin 0 -> 55183 bytes .../WindowStylesReportTool.rc | 103 +++++ .../WindowStylesReportTool.sln | 31 ++ .../WindowStylesReportTool.vcxproj | 111 +++++ .../WindowStylesReportTool.vcxproj.filters | 49 ++ tools/WindowStylesReportTool/pch.cpp | 1 + tools/WindowStylesReportTool/pch.h | 3 + tools/WindowStylesReportTool/small.ico | Bin 0 -> 55183 bytes 17 files changed, 797 insertions(+) create mode 100644 tools/WindowStylesReportTool/Resource.h create mode 100644 tools/WindowStylesReportTool/WindowStylesReportTool.cpp create mode 100644 tools/WindowStylesReportTool/WindowStylesReportTool.h create mode 100644 tools/WindowStylesReportTool/WindowStylesReportTool.ico create mode 100644 tools/WindowStylesReportTool/WindowStylesReportTool.rc create mode 100644 tools/WindowStylesReportTool/WindowStylesReportTool.sln create mode 100644 tools/WindowStylesReportTool/WindowStylesReportTool.vcxproj create mode 100644 tools/WindowStylesReportTool/WindowStylesReportTool.vcxproj.filters create mode 100644 tools/WindowStylesReportTool/pch.cpp create mode 100644 tools/WindowStylesReportTool/pch.h create mode 100644 tools/WindowStylesReportTool/small.ico diff --git a/.github/actions/spell-check/expect.txt b/.github/actions/spell-check/expect.txt index a6987c170a..3ac98ffdad 100644 --- a/.github/actions/spell-check/expect.txt +++ b/.github/actions/spell-check/expect.txt @@ -527,6 +527,7 @@ enum EOAC eol epicgames +epo Eqn ERASEBKGND EREOF @@ -574,6 +575,7 @@ fallthrough fancyzones FANCYZONESDRAWLAYOUTTEST FANCYZONESEDITOR +FANCYZONESWINDOWSTYLES Farbraum Faroe FARPROC @@ -695,6 +697,7 @@ helptext Heure HEVC hfile +HFONT hglobal hhk HHmmss @@ -1309,6 +1312,7 @@ NCPAINT NCRBUTTONDBLCLK NCRBUTTONDOWN NCRBUTTONUP +NCRENDERING NDEBUG Ndombe ndp @@ -2254,6 +2258,8 @@ WINDOWSBUILDNUMBER Windowscodecs windowsdesktop windowssearch +WINDOWSTYLES +WINDOWSTYLESICON windowsx windowwalker winerror diff --git a/.pipelines/ESRPSigning_core.json b/.pipelines/ESRPSigning_core.json index 576f38511b..e8c370c09e 100644 --- a/.pipelines/ESRPSigning_core.json +++ b/.pipelines/ESRPSigning_core.json @@ -17,6 +17,7 @@ "PowerToys.Interop.dll", "BugReportTool\\PowerToys.BugReportTool.exe", "WebcamReportTool\\PowerToys.WebcamReportTool.exe", + "WindowStylesReportTool\\PowerToys.WindowStylesReportTool.exe", "Telemetry.dll", "PowerToys.ManagedTelemetry.dll", "PowerToys.ManagedCommon.dll", diff --git a/.pipelines/ci/templates/build-powertoys-steps.yml b/.pipelines/ci/templates/build-powertoys-steps.yml index 1204b10401..b54c7a9fd8 100644 --- a/.pipelines/ci/templates/build-powertoys-steps.yml +++ b/.pipelines/ci/templates/build-powertoys-steps.yml @@ -76,6 +76,25 @@ steps: msbuildArgs: ${{ parameters.additionalBuildArguments }} maximumCpuCount: true +- task: NuGetCommand@2 + displayName: Restore NuGet packages for WindowStylesReportTool.sln + inputs: + command: restore + feedsToUse: config + configPath: NuGet.config + restoreSolution: tools\WindowStylesReportTool\WindowStylesReportTool.sln + restoreDirectory: '$(Build.SourcesDirectory)\tools\WindowStylesReportTool\packages' + +- task: VSBuild@1 + displayName: 'Build WindowStylesReportTool.sln' + inputs: + solution: '**\WindowStylesReportTool.sln' + vsVersion: 17.0 + platform: '$(BuildPlatform)' + configuration: '$(BuildConfiguration)' + msbuildArgs: ${{ parameters.additionalBuildArguments }} + maximumCpuCount: true + - task: NuGetCommand@2 displayName: Restore NuGet packages for PowerToysSetup.sln inputs: diff --git a/.pipelines/release.yml b/.pipelines/release.yml index 2112bfd27a..5e7d2d5bc5 100644 --- a/.pipelines/release.yml +++ b/.pipelines/release.yml @@ -155,6 +155,17 @@ jobs: clean: true maximumCpuCount: true + - task: VSBuild@1 + displayName: Build WindowStylesReportTool + inputs: + solution: '**/tools/WindowStylesReportTool/WindowStylesReportTool.sln' + vsVersion: 17.0 + msbuildArgs: /p:CIBuild=true /bl:$(Build.SourcesDirectory)\msbuild.binlog + platform: $(BuildPlatform) + configuration: $(BuildConfiguration) + clean: true + maximumCpuCount: true + - task: VSBuild@1 displayName: Build PowerToysSetupCustomActions inputs: diff --git a/doc/devdocs/readme.md b/doc/devdocs/readme.md index e06f9b6d65..c2f6459049 100644 --- a/doc/devdocs/readme.md +++ b/doc/devdocs/readme.md @@ -66,6 +66,7 @@ The installer can only be compiled in `Release` mode, step 1 and 2 must be done 1. Compile `PowerToys.sln`. Instructions are listed above. 2. Compile `BugReportTool.sln` tool. Path from root: `tools\BugReportTool\BugReportTool.sln` (details listed below) 3. Compile `WebcamReportTool.sln` tool. Path from root: `tools\WebcamReportTool\WebcamReportTool.sln` (details listed below) +3. Compile `WindowStylesReportTool.sln` tool. Path from root: `tools\WindowStylesReportTool\WindowStylesReportTool.sln` (details listed below) 4. Compile `PowerToysSetup.sln` Path from root: `installer\PowerToysSetup.sln` (details listed below) ### Prerequisites for building the MSI installer @@ -85,6 +86,12 @@ The installer can only be compiled in `Release` mode, step 1 and 2 must be done 2. In Visual Studio, in the `Solutions Configuration` drop-down menu select `Release` 3. From the `Build` menu, choose `Build Solution`. +### Locally compiling the Window styles reporting tool + +1. Open `tools\WindowStylesReportTool\WindowStylesReportTool.sln` +2. In Visual Studio, in the `Solutions Configuration` drop-down menu select `Release` +3. From the `Build` menu, choose `Build Solution`. + ### Locally compiling the installer 1. Open `installer\PowerToysSetup.sln` diff --git a/installer/PowerToysSetup/Product.wxs b/installer/PowerToysSetup/Product.wxs index 62fbcb8f3d..f52eb502fc 100644 --- a/installer/PowerToysSetup/Product.wxs +++ b/installer/PowerToysSetup/Product.wxs @@ -616,6 +616,9 @@ + + + @@ -1049,6 +1052,7 @@ + diff --git a/tools/WindowStylesReportTool/Resource.h b/tools/WindowStylesReportTool/Resource.h new file mode 100644 index 0000000000..3753dba0ce --- /dev/null +++ b/tools/WindowStylesReportTool/Resource.h @@ -0,0 +1,24 @@ +//{{NO_DEPENDENCIES}} +// Microsoft Visual C++ generated include file. +// Used by WindowStylesReportTool.rc + +#define IDR_MAINFRAME 128 +#define IDD_ABOUTBOX 103 +#define IDI_WINDOWSTYLESICON 107 +#define IDI_SMALLICON 108 +#define IDC_WINDOWSTYLES 109 +#ifndef IDC_STATIC +#define IDC_STATIC -1 +#endif +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS + +#define _APS_NO_MFC 130 +#define _APS_NEXT_RESOURCE_VALUE 129 +#define _APS_NEXT_COMMAND_VALUE 32771 +#define _APS_NEXT_CONTROL_VALUE 1000 +#define _APS_NEXT_SYMED_VALUE 110 +#endif +#endif diff --git a/tools/WindowStylesReportTool/WindowStylesReportTool.cpp b/tools/WindowStylesReportTool/WindowStylesReportTool.cpp new file mode 100644 index 0000000000..3391567cbb --- /dev/null +++ b/tools/WindowStylesReportTool/WindowStylesReportTool.cpp @@ -0,0 +1,424 @@ +#include "pch.h" +#include "WindowStylesReportTool.h" + +#include +#include + +#include +#include +#include + +inline std::optional get_last_error_message(const DWORD dw) +{ + std::optional message; + try + { + const auto msg = std::system_category().message(dw); + message.emplace(begin(msg), end(msg)); + } + catch (...) + { + } + return message; +} + +inline std::wstring get_last_error_or_default(const DWORD dw) +{ + auto message = get_last_error_message(dw); + return message.has_value() ? message.value() : L""; +} + +std::filesystem::path get_desktop_path() +{ + wchar_t* p; + if (S_OK != SHGetKnownFolderPath(FOLDERID_Desktop, 0, NULL, &p)) return ""; + + std::filesystem::path result = p; + CoTaskMemFree(p); + + return result; +} + +// Get the executable path or module name for modern apps +inline std::wstring get_process_path(DWORD pid) noexcept +{ + auto process = OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION, TRUE, pid); + std::wstring name; + if (process != INVALID_HANDLE_VALUE) + { + name.resize(MAX_PATH); + DWORD name_length = static_cast(name.length()); + if (QueryFullProcessImageNameW(process, 0, (LPWSTR)name.data(), &name_length) == 0) + { + name_length = 0; + } + name.resize(name_length); + CloseHandle(process); + } + return name; +} + +// Get the executable path or module name for modern apps +inline std::wstring get_process_path(HWND window) noexcept +{ + const static std::wstring app_frame_host = L"ApplicationFrameHost.exe"; + + DWORD pid{}; + GetWindowThreadProcessId(window, &pid); + auto name = get_process_path(pid); + + if (name.length() >= app_frame_host.length() && + name.compare(name.length() - app_frame_host.length(), app_frame_host.length(), app_frame_host) == 0) + { + // It is a UWP app. We will enumerate the windows and look for one created + // by something with a different PID + DWORD new_pid = pid; + + EnumChildWindows( + window, [](HWND hwnd, LPARAM param) -> BOOL { + auto new_pid_ptr = reinterpret_cast(param); + DWORD pid; + GetWindowThreadProcessId(hwnd, &pid); + if (pid != *new_pid_ptr) + { + *new_pid_ptr = pid; + return FALSE; + } + else + { + return TRUE; + } + }, + reinterpret_cast(&new_pid)); + + // If we have a new pid, get the new name. + if (new_pid != pid) + { + return get_process_path(new_pid); + } + } + + return name; +} + +class Logger +{ +private: + inline static std::wofstream logger; + +public: + ~Logger() + { + logger.close(); + } + + static void init(std::string loggerName) + { + std::filesystem::path rootFolder(get_desktop_path()); + + auto logsPath = rootFolder; + logsPath.append(L"window_styles.txt"); + + logger.open(logsPath.string(), std::ios_base::out | std::ios_base::app); + } + + template + static void log(const FormatString& fmt, const Args&... args) + { + logger << std::format(fmt, args...) << std::endl; + } +}; + +std::map dwmAttributesReadable = { + {DWMWINDOWATTRIBUTE::DWMWA_NCRENDERING_ENABLED, L"DWMWA_NCRENDERING_ENABLED"}, + {DWMWINDOWATTRIBUTE::DWMWA_CAPTION_BUTTON_BOUNDS, L"DWMWA_CAPTION_BUTTON_BOUNDS"}, + {DWMWINDOWATTRIBUTE::DWMWA_EXTENDED_FRAME_BOUNDS, L"DWMWA_EXTENDED_FRAME_BOUNDS"}, + {DWMWINDOWATTRIBUTE::DWMWA_CLOAKED, L"DWMWA_CLOAKED"}, +}; + +template +void LogDwmInfo(HWND window, DWMWINDOWATTRIBUTE attr, T& value) +{ + if (DwmGetWindowAttribute(window, attr, &value, sizeof(value)) == S_OK) + { + Logger::log(L"{}: {} ", dwmAttributesReadable[attr], value); + } + else + { + Logger::log(L"Failed to get {}", dwmAttributesReadable[attr]); + } +} + +void LogDwmRect(HWND window, DWMWINDOWATTRIBUTE attr, RECT& value) +{ + if (DwmGetWindowAttribute(window, attr, &value, sizeof(value)) >= 0) + { + Logger::log(L"{}: LT({},{}), RB({},{}), [{} x {}] ", dwmAttributesReadable[attr], value.left, value.top, value.right, value.bottom, value.right - value.left, value.bottom - value.top); + } + else + { + Logger::log(L"Failed to get {}", dwmAttributesReadable[attr]); + } +} + +void LogStyles(HWND window) +{ + auto style = GetWindowLong(window, GWL_STYLE); + + Logger::log(L"------------------ Style --------------------- "); + Logger::log(L""); + + Logger::log(L"WS_BORDER {}", ((style & WS_BORDER) == WS_BORDER)); + Logger::log(L"WS_CAPTION {}", ((style & WS_CAPTION) == WS_CAPTION)); + Logger::log(L"WS_CHILD {}", ((style & WS_CHILD) == WS_CHILD)); + Logger::log(L"WS_CHILDWINDOW {}", ((style & WS_CHILDWINDOW) == WS_CHILDWINDOW)); + Logger::log(L"WS_CLIPCHILDREN {}", ((style & WS_CLIPCHILDREN) == WS_CLIPCHILDREN)); + Logger::log(L"WS_CLIPSIBLINGS {}", ((style & WS_CLIPSIBLINGS) == WS_CLIPSIBLINGS)); + Logger::log(L"WS_DISABLED {}", ((style & WS_DISABLED) == WS_DISABLED)); + Logger::log(L"WS_DLGFRAME {}", ((style & WS_DLGFRAME) == WS_DLGFRAME)); + Logger::log(L"WS_GROUP {}", ((style & WS_GROUP) == WS_GROUP)); + Logger::log(L"WS_HSCROLL {}", ((style & WS_HSCROLL) == WS_HSCROLL)); + Logger::log(L"WS_ICONIC {}", ((style & WS_ICONIC) == WS_ICONIC)); + Logger::log(L"WS_MAXIMIZE {}", ((style & WS_MAXIMIZE) == WS_MAXIMIZE)); + Logger::log(L"WS_MAXIMIZEBOX {}", ((style & WS_MAXIMIZEBOX) == WS_MAXIMIZEBOX)); + Logger::log(L"WS_MINIMIZE {}", ((style & WS_MINIMIZE) == WS_MINIMIZE)); + Logger::log(L"WS_MINIMIZEBOX {}", ((style & WS_MINIMIZEBOX) == WS_MINIMIZEBOX)); + Logger::log(L"WS_OVERLAPPED {}", ((style & WS_OVERLAPPED) == WS_OVERLAPPED)); + Logger::log(L"WS_OVERLAPPEDWINDOW {}", ((style & WS_OVERLAPPEDWINDOW) == WS_OVERLAPPEDWINDOW)); + Logger::log(L"WS_POPUP {}", ((style & WS_POPUP) == WS_POPUP)); + Logger::log(L"WS_POPUPWINDOW {}", ((style & WS_POPUPWINDOW) == WS_POPUPWINDOW)); + Logger::log(L"WS_SIZEBOX {}", ((style & WS_SIZEBOX) == WS_SIZEBOX)); + Logger::log(L"WS_SYSMENU {}", ((style & WS_SYSMENU) == WS_SYSMENU)); + Logger::log(L"WS_TABSTOP {}", ((style & WS_TABSTOP) == WS_TABSTOP)); + Logger::log(L"WS_THICKFRAME {}", ((style & WS_THICKFRAME) == WS_THICKFRAME)); + Logger::log(L"WS_TILED {}", ((style & WS_TILED) == WS_TILED)); + Logger::log(L"WS_TILEDWINDOW {}", ((style & WS_TILEDWINDOW) == WS_TILEDWINDOW)); + Logger::log(L"WS_VISIBLE {}", ((style & WS_VISIBLE) == WS_VISIBLE)); + Logger::log(L"WS_VSCROLL {}", ((style & WS_VSCROLL) == WS_VSCROLL)); + + Logger::log(L""); +} + +void LogExStyles(HWND window) +{ + auto exStyle = GetWindowLong(window, GWL_EXSTYLE); + Logger::log(L"------------------ Exstyle --------------------- "); + Logger::log(L""); + + Logger::log(L"WS_EX_ACCEPTFILES {}", (exStyle & WS_EX_ACCEPTFILES) == WS_EX_ACCEPTFILES); + Logger::log(L"WS_EX_APPWINDOW {}", (exStyle & WS_EX_APPWINDOW) == WS_EX_APPWINDOW); + Logger::log(L"WS_EX_CLIENTEDGE {}", (exStyle & WS_EX_CLIENTEDGE) == WS_EX_CLIENTEDGE); + Logger::log(L"WS_EX_COMPOSITED {}", (exStyle & WS_EX_COMPOSITED) == WS_EX_COMPOSITED); + Logger::log(L"WS_EX_CONTEXTHELP {}", (exStyle & WS_EX_CONTEXTHELP) == WS_EX_CONTEXTHELP); + Logger::log(L"WS_EX_CONTROLPARENT {}", (exStyle & WS_EX_CONTROLPARENT) == WS_EX_CONTROLPARENT); + Logger::log(L"WS_EX_DLGMODALFRAME {}", (exStyle & WS_EX_DLGMODALFRAME) == WS_EX_DLGMODALFRAME); + Logger::log(L"WS_EX_LAYERED {}", (exStyle & WS_EX_LAYERED) == WS_EX_LAYERED); + Logger::log(L"WS_EX_LAYOUTRTL {}", (exStyle & WS_EX_LAYOUTRTL) == WS_EX_LAYOUTRTL); + Logger::log(L"WS_EX_LEFT {}", (exStyle & WS_EX_LEFT) == WS_EX_LEFT); + Logger::log(L"WS_EX_LEFTSCROLLBAR {}", (exStyle & WS_EX_LEFTSCROLLBAR) == WS_EX_LEFTSCROLLBAR); + Logger::log(L"WS_EX_LTRREADING {}", (exStyle & WS_EX_LTRREADING) == WS_EX_LTRREADING); + Logger::log(L"WS_EX_MDICHILD {}", (exStyle & WS_EX_MDICHILD) == WS_EX_MDICHILD); + Logger::log(L"WS_EX_NOACTIVATE {}", (exStyle & WS_EX_NOACTIVATE) == WS_EX_NOACTIVATE); + Logger::log(L"WS_EX_NOINHERITLAYOUT {}", (exStyle & WS_EX_NOINHERITLAYOUT) == WS_EX_NOINHERITLAYOUT); + Logger::log(L"WS_EX_NOPARENTNOTIFY {}", (exStyle & WS_EX_NOPARENTNOTIFY) == WS_EX_NOPARENTNOTIFY); + Logger::log(L"WS_EX_NOREDIRECTIONBITMAP {}", (exStyle & WS_EX_NOREDIRECTIONBITMAP) == WS_EX_NOREDIRECTIONBITMAP); + Logger::log(L"WS_EX_OVERLAPPEDWINDOW {}", (exStyle & WS_EX_OVERLAPPEDWINDOW) == WS_EX_OVERLAPPEDWINDOW); + Logger::log(L"WS_EX_PALETTEWINDOW {}", (exStyle & WS_EX_PALETTEWINDOW) == WS_EX_PALETTEWINDOW); + Logger::log(L"WS_EX_RIGHT {}", (exStyle & WS_EX_RIGHT) == WS_EX_RIGHT); + Logger::log(L"WS_EX_RIGHTSCROLLBAR {}", (exStyle & WS_EX_RIGHTSCROLLBAR) == WS_EX_RIGHTSCROLLBAR); + Logger::log(L"WS_EX_RTLREADING {}", (exStyle & WS_EX_RTLREADING) == WS_EX_RTLREADING); + Logger::log(L"WS_EX_STATICEDGE {}", (exStyle & WS_EX_STATICEDGE) == WS_EX_STATICEDGE); + Logger::log(L"WS_EX_TOOLWINDOW {}", (exStyle & WS_EX_TOOLWINDOW) == WS_EX_TOOLWINDOW); + Logger::log(L"WS_EX_TOPMOST {}", (exStyle & WS_EX_TOPMOST) == WS_EX_TOPMOST); + Logger::log(L"WS_EX_TRANSPARENT {}", (exStyle & WS_EX_TRANSPARENT) == WS_EX_TRANSPARENT); + Logger::log(L"WS_EX_WINDOWEDGE {}", (exStyle & WS_EX_WINDOWEDGE) == WS_EX_WINDOWEDGE); + + Logger::log(L""); +} + +void LogDwmAttributes(HWND window) +{ + Logger::log(L"------------------ DwmAttributes --------------------- "); + Logger::log(L""); + + int intValue{}; + unsigned int uintValue{}; + + LogDwmInfo(window, DWMWINDOWATTRIBUTE::DWMWA_NCRENDERING_ENABLED, intValue); + LogDwmInfo(window, DWMWINDOWATTRIBUTE::DWMWA_CLOAKED, intValue); + + RECT rectValue{}; + LogDwmRect(window, DWMWINDOWATTRIBUTE::DWMWA_CAPTION_BUTTON_BOUNDS, rectValue); + LogDwmRect(window, DWMWINDOWATTRIBUTE::DWMWA_EXTENDED_FRAME_BOUNDS, rectValue); + + Logger::log(L""); +} + +void LogVirtualDesktopInfo(HWND window) +{ + Logger::log(L"------------------ VirtualDesktop info --------------------- "); + Logger::log(L""); + + IVirtualDesktopManager* vdManager = nullptr; + auto res = CoCreateInstance(CLSID_VirtualDesktopManager, nullptr, CLSCTX_ALL, IID_PPV_ARGS(&vdManager)); + if (FAILED(res)) + { + Logger::log(L"Failed to create VirtualDesktopManager instance"); + Logger::log(L""); + return; + } + + BOOL isWindowOnCurrentDesktop = false; + if (vdManager->IsWindowOnCurrentVirtualDesktop(window, &isWindowOnCurrentDesktop) == S_OK) + { + Logger::log(L"Window is on current virtual desktop: {}", isWindowOnCurrentDesktop); + } + + GUID id{}; + auto vdIdRes = vdManager->GetWindowDesktopId(window, &id); + if (vdIdRes == S_OK) + { + OLECHAR* guidString; + if (StringFromCLSID(id, &guidString) == S_OK) + { + Logger::log(L"Virtual desktop id: {}", guidString); + } + + CoTaskMemFree(guidString); + } + else + { + Logger::log(L"GetWindowDesktopId error: {}", get_last_error_or_default(vdIdRes)); + } + + if (vdManager) + { + vdManager->Release(); + } + + Logger::log(L""); +} + +void LogInfo(HWND window) +{ + auto processPath = get_process_path(window); + auto app = processPath; + auto pos = processPath.find_last_of('\\'); + if (pos != std::string::npos && pos + 1 < processPath.length()) + { + app = processPath.substr(pos + 1); + } + + Logger::log(L"Timestamp: {}", std::chrono::system_clock::now()); + Logger::log(L"Window: {}", app); + + WCHAR className[256]; + auto classNameLength = GetClassName(window, className, sizeof(className)); + if (classNameLength > 0) + { + Logger::log(L"Class: {}", className); + } + else + { + Logger::log(L"GetClassName error: {}", get_last_error_or_default(GetLastError())); + } + + Logger::log(L""); + + LogStyles(window); + LogExStyles(window); + LogDwmAttributes(window); + LogVirtualDesktopInfo(window); + + Logger::log(L"======================================="); + Logger::log(L""); +} + +LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); + +int APIENTRY wWinMain(_In_ HINSTANCE hInstance, + _In_opt_ HINSTANCE hPrevInstance, + _In_ LPWSTR lpCmdLine, + _In_ int nCmdShow) +{ + UNREFERENCED_PARAMETER(hPrevInstance); + UNREFERENCED_PARAMETER(lpCmdLine); + + Logger::init("WindowStylesReportTool"); + + WNDCLASSEXW wcex; + wcex.cbSize = sizeof(WNDCLASSEX); + wcex.style = {}; + wcex.lpfnWndProc = WndProc; + wcex.cbClsExtra = 0; + wcex.cbWndExtra = 0; + wcex.hInstance = hInstance; + wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_WINDOWSTYLESICON)); + wcex.hCursor = LoadCursor(nullptr, IDC_ARROW); + wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1); + wcex.lpszMenuName = L""; + wcex.lpszClassName = L"WindowStylesReportTool"; + wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALLICON)); + + if (!RegisterClassExW(&wcex)) + { + Logger::log(L"Register class error: {}", get_last_error_or_default(GetLastError())); + return FALSE; + } + + HWND hWnd = CreateWindowW(L"WindowStylesReportTool", L"Window Style Report Tool", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, 600, 200, nullptr, nullptr, hInstance, nullptr); + if (!hWnd) + { + Logger::log(L"Window creation error: {}", get_last_error_or_default(GetLastError())); + return FALSE; + } + + if (!RegisterHotKey(hWnd, 1, MOD_ALT | MOD_CONTROL | MOD_NOREPEAT, 0x53)) // ctrl + alt + s + { + Logger::log(L"Failed to register hotkey: {}", get_last_error_or_default(GetLastError())); + return FALSE; + } + + ShowWindow(hWnd, nCmdShow); + UpdateWindow(hWnd); + + MSG msg{}; + while (GetMessage(&msg, nullptr, 0, 0)) + { + TranslateMessage(&msg); + DispatchMessage(&msg); + } + + return (int) msg.wParam; +} + +LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) +{ + switch (message) + { + case WM_HOTKEY: + { + LogInfo(GetForegroundWindow()); + PostQuitMessage(0); + } + break; + case WM_PAINT: + { + PAINTSTRUCT ps; + HDC hdc = BeginPaint(hWnd, &ps); + + LPCWSTR text = L"Please select the target window (using a mouse or Alt+Tab), \r\nand press Ctrl+Alt+S to capture its styles. \r\nYou can find the output file \"window_styles.txt\" on your desktop."; + RECT rc{0,50,600,200}; + DrawText(hdc, text, (int)wcslen(text), &rc, DT_CENTER | DT_WORDBREAK); + + EndPaint(hWnd, &ps); + } + break; + case WM_DESTROY: + PostQuitMessage(0); + break; + default: + return DefWindowProc(hWnd, message, wParam, lParam); + } + return 0; +} diff --git a/tools/WindowStylesReportTool/WindowStylesReportTool.h b/tools/WindowStylesReportTool/WindowStylesReportTool.h new file mode 100644 index 0000000000..d00d47e788 --- /dev/null +++ b/tools/WindowStylesReportTool/WindowStylesReportTool.h @@ -0,0 +1,3 @@ +#pragma once + +#include "resource.h" diff --git a/tools/WindowStylesReportTool/WindowStylesReportTool.ico b/tools/WindowStylesReportTool/WindowStylesReportTool.ico new file mode 100644 index 0000000000000000000000000000000000000000..e82442c2643edd754a5dcece07d0a1ecb79c438b GIT binary patch literal 55183 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 literal 0 HcmV?d00001 diff --git a/tools/WindowStylesReportTool/WindowStylesReportTool.rc b/tools/WindowStylesReportTool/WindowStylesReportTool.rc new file mode 100644 index 0000000000..83e42764bd --- /dev/null +++ b/tools/WindowStylesReportTool/WindowStylesReportTool.rc @@ -0,0 +1,103 @@ +ÿþ//Microsoft Visual C++ generated resource script. +// +#include "resource.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE resource. +// +#ifndef APSTUDIO_INVOKED +#endif +#define APSTUDIO_HIDDEN_SYMBOLS +#include "windows.h" +#undef APSTUDIO_HIDDEN_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) +LANGUAGE 9, 1 + +///////////////////////////////////////////////////////////////////////////// +// +// Icon +// + +// Icon with lowest ID value placed first to ensure application icon +// remains consistent on all systems. + +IDI_WINDOWSTYLESICON ICON "WindowStylesReportTool.ico" +IDI_SMALL ICON "small.ico" + + +///////////////////////////////////////////////////////////////////////////// +// +// DESIGNINFO +// + +#ifdef APSTUDIO_INVOKED +GUIDELINES DESIGNINFO +BEGIN + IDD_ABOUTBOX, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 163 + TOPMARGIN, 7 + BOTTOMMARGIN, 55 + END +END +#endif // APSTUDIO_INVOKED + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// +1 TEXTINCLUDE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE +BEGIN + "#ifndef APSTUDIO_INVOKED\r\n" + "#include ""targetver.h""\r\n" + "#endif\r\n" + "#define APSTUDIO_HIDDEN_SYMBOLS\r\n" + "#include ""windows.h""\r\n" + "#undef APSTUDIO_HIDDEN_SYMBOLS\r\n" + "\0" +END + +3 TEXTINCLUDE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + +///////////////////////////////////////////////////////////////////////////// +// +// String Table +// + +STRINGTABLE +BEGIN + IDC_WINDOWSTYLES "WINDOWSTYLES" +END + +#endif +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE resource. +// + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + \ No newline at end of file diff --git a/tools/WindowStylesReportTool/WindowStylesReportTool.sln b/tools/WindowStylesReportTool/WindowStylesReportTool.sln new file mode 100644 index 0000000000..f16f6fe905 --- /dev/null +++ b/tools/WindowStylesReportTool/WindowStylesReportTool.sln @@ -0,0 +1,31 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.0.32014.148 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "WindowStylesReportTool", "WindowStylesReportTool.vcxproj", "{0FEBAFAF-CB77-41F0-8EF9-8E3AD4B4F842}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|ARM64 = Debug|ARM64 + Debug|x64 = Debug|x64 + Release|ARM64 = Release|ARM64 + Release|x64 = Release|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {0FEBAFAF-CB77-41F0-8EF9-8E3AD4B4F842}.Debug|ARM64.ActiveCfg = Debug|x64 + {0FEBAFAF-CB77-41F0-8EF9-8E3AD4B4F842}.Debug|ARM64.Build.0 = Debug|x64 + {0FEBAFAF-CB77-41F0-8EF9-8E3AD4B4F842}.Debug|x64.ActiveCfg = Debug|x64 + {0FEBAFAF-CB77-41F0-8EF9-8E3AD4B4F842}.Debug|x64.Build.0 = Debug|x64 + {0FEBAFAF-CB77-41F0-8EF9-8E3AD4B4F842}.Release|ARM64.ActiveCfg = Release|x64 + {0FEBAFAF-CB77-41F0-8EF9-8E3AD4B4F842}.Release|ARM64.Build.0 = Release|x64 + {0FEBAFAF-CB77-41F0-8EF9-8E3AD4B4F842}.Release|x64.ActiveCfg = Release|x64 + {0FEBAFAF-CB77-41F0-8EF9-8E3AD4B4F842}.Release|x64.Build.0 = Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {D271E9C3-5C4D-45E4-8D23-9F1BB5443513} + EndGlobalSection +EndGlobal diff --git a/tools/WindowStylesReportTool/WindowStylesReportTool.vcxproj b/tools/WindowStylesReportTool/WindowStylesReportTool.vcxproj new file mode 100644 index 0000000000..6fb57d152e --- /dev/null +++ b/tools/WindowStylesReportTool/WindowStylesReportTool.vcxproj @@ -0,0 +1,111 @@ + + + + + Debug + x64 + + + Release + x64 + + + + 16.0 + Win32Proj + {0febafaf-cb77-41f0-8ef9-8e3ad4b4f842} + WindowStylesReportTool + 10.0.18362.0 + + + + Application + true + v143 + Unicode + + + Application + false + v143 + true + Unicode + + + + + + + + + + + + + + + true + $(SolutionDir)..\..\$(Platform)\$(Configuration)\$(ProjectName)\ + $(SolutionDir)..\..\$(Platform)\$(Configuration)\obj\$(ProjectName)\ + PowerToys.$(ProjectName) + + + false + $(SolutionDir)..\..\$(Platform)\$(Configuration)\$(ProjectName)\ + $(SolutionDir)..\..\$(Platform)\$(Configuration)\obj\$(ProjectName)\ + PowerToys.$(ProjectName) + + + + Level3 + true + _DEBUG;_WINDOWS;%(PreprocessorDefinitions) + true + C:\repo\PowerToys\deps\spdlog\include;C:\repo\PowerToys\src\common;C:\repo\PowerToys\src;%(AdditionalIncludeDirectories) + + + Windows + true + dwmapi.lib;%(AdditionalDependencies) + + + + + Level3 + true + true + true + NDEBUG;_WINDOWS;%(PreprocessorDefinitions) + true + + + Windows + true + true + true + dwmapi.lib;%(AdditionalDependencies) + + + + + + + + + + + Create + Create + + + + + + + + + + + + + \ No newline at end of file diff --git a/tools/WindowStylesReportTool/WindowStylesReportTool.vcxproj.filters b/tools/WindowStylesReportTool/WindowStylesReportTool.vcxproj.filters new file mode 100644 index 0000000000..2aff154c7a --- /dev/null +++ b/tools/WindowStylesReportTool/WindowStylesReportTool.vcxproj.filters @@ -0,0 +1,49 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + Header Files + + + Header Files + + + Header Files + + + + + Source Files + + + Header Files + + + + + Resource Files + + + + + Resource Files + + + Resource Files + + + \ No newline at end of file diff --git a/tools/WindowStylesReportTool/pch.cpp b/tools/WindowStylesReportTool/pch.cpp new file mode 100644 index 0000000000..17305716aa --- /dev/null +++ b/tools/WindowStylesReportTool/pch.cpp @@ -0,0 +1 @@ +#include "pch.h" \ No newline at end of file diff --git a/tools/WindowStylesReportTool/pch.h b/tools/WindowStylesReportTool/pch.h new file mode 100644 index 0000000000..3166a6ce10 --- /dev/null +++ b/tools/WindowStylesReportTool/pch.h @@ -0,0 +1,3 @@ +#pragma once + +#include \ No newline at end of file diff --git a/tools/WindowStylesReportTool/small.ico b/tools/WindowStylesReportTool/small.ico new file mode 100644 index 0000000000000000000000000000000000000000..e82442c2643edd754a5dcece07d0a1ecb79c438b GIT binary patch literal 55183 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 literal 0 HcmV?d00001