mirror of
https://github.com/microsoft/PowerToys.git
synced 2026-04-04 18:26:39 +02:00
- remove common lib - split settings, remove common-md - move ipc interop/kb_layout to interop - rename core -> settings, settings -> old_settings - os-detect header-only; interop -> PowerToysInterop - split notifications, move single-use headers where they're used - winstore lib - rename com utils - rename Updating and Telemetry projects - rename core -> settings-ui and remove examples folder - rename settings-ui folder + consisent common/version include
60 lines
1.7 KiB
C++
60 lines
1.7 KiB
C++
#pragma once
|
|
|
|
#define WIN32_LEAN_AND_MEAN
|
|
#include <Windows.h>
|
|
#include <dwmapi.h>
|
|
|
|
#include <array>
|
|
#include <optional>
|
|
|
|
#pragma comment(lib, "dwmapi.lib")
|
|
|
|
// Initializes and runs windows message loop
|
|
inline int run_message_loop(const bool until_idle = false, const std::optional<uint32_t> timeout_seconds = {})
|
|
{
|
|
MSG msg{};
|
|
bool stop = false;
|
|
UINT_PTR timerId = 0;
|
|
if (timeout_seconds.has_value())
|
|
{
|
|
timerId = SetTimer(nullptr, 0, *timeout_seconds * 1000, nullptr);
|
|
}
|
|
|
|
while (!stop && GetMessageW(&msg, nullptr, 0, 0))
|
|
{
|
|
TranslateMessage(&msg);
|
|
DispatchMessageW(&msg);
|
|
stop = until_idle && !PeekMessageW(&msg, nullptr, 0, 0, PM_NOREMOVE);
|
|
stop = stop || (msg.message == WM_TIMER && msg.wParam == timerId);
|
|
}
|
|
if (timeout_seconds.has_value())
|
|
{
|
|
KillTimer(nullptr, timerId);
|
|
}
|
|
return static_cast<int>(msg.wParam);
|
|
}
|
|
|
|
// Check if window is part of the shell or the taskbar.
|
|
inline bool is_system_window(HWND hwnd, const char* class_name)
|
|
{
|
|
// We compare the HWND against HWND of the desktop and shell windows,
|
|
// we also filter out some window class names know to belong to the taskbar.
|
|
constexpr std::array system_classes = { "SysListView32", "WorkerW", "Shell_TrayWnd", "Shell_SecondaryTrayWnd", "Progman" };
|
|
const std::array system_hwnds = { GetDesktopWindow(), GetShellWindow() };
|
|
for (auto system_hwnd : system_hwnds)
|
|
{
|
|
if (hwnd == system_hwnd)
|
|
{
|
|
return true;
|
|
}
|
|
}
|
|
for (const auto system_class : system_classes)
|
|
{
|
|
if (!strcmp(system_class, class_name))
|
|
{
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|