当前位置: 首页 > news >正文

让你的静态网站 做后台陕西免费做网站公司

让你的静态网站 做后台,陕西免费做网站公司,2020长沙马拉松线上赛,114在线查询电话检测窗口是否最大化#xff08;窗口覆盖或独占全屏#xff09;兼容 Win10/11 问题描述 在 Win10/11 上有很多 UWP 进程#xff0c;检测窗口是否最大化将迎来新的挑战。这些窗口以其不能够使用 Win32 的 IsWindowVisible 获取窗口可见性为特征。此时#xff0c;必须使用 D…检测窗口是否最大化窗口覆盖或独占全屏兼容 Win10/11 问题描述 在 Win10/11 上有很多 UWP 进程检测窗口是否最大化将迎来新的挑战。这些窗口以其不能够使用 Win32 的 IsWindowVisible 获取窗口可见性为特征。此时必须使用 DWM API 来判断窗口的可见性状态。 代码实现 下面的代码实现了一个工具类检测当前桌面是否被覆盖以及覆盖窗口的信息。此代码参考 CustomDesktop 开源项目并做了预览桌面时的逃逸规则 “Singleton.h” #pragma oncenamespace cd {templateclass Tclass Singleton{protected:Singleton() default;virtual ~Singleton() default;public:static T GetInstance(){static T s_instance;return s_instance;}};#define DECL_SINGLETON(T) friend class SingletonT #define DECL_SINGLETON_DEFAULT(T) \DECL_SINGLETON(T); \private: \T() default; \~T() default }“CheckCovered.h” #pragma once #include Singleton.h #include thread #include memorynamespace cd {// 检测桌面是否被遮挡了class CheckCovered final : public SingletonCheckCovered{DECL_SINGLETON(CheckCovered);public:bool IsReady() { return m_runThreadFlag; }bool Init();bool Uninit();private:CheckCovered();~CheckCovered();std::unique_ptrstd::thread m_thread;bool m_runThreadFlag true;bool m_isCovered false;HWND m_coveredByHwnd NULL;void CheckCoveredThread();bool IsDesktopCovered();}; }“CheckCovered.cpp” #include CheckCovered.h#ifdef _WIN64 #include Dwmapi.h #endifnamespace cd {CheckCovered::CheckCovered(){Init();}CheckCovered::~CheckCovered(){Uninit();}bool CheckCovered::Init(){m_runThreadFlag true;/* 在主线程中执行函数可以用来做 dllmain 中不能完成的初始化通过自定义消息实现// MYDLL_API void WINAPI ExecInMainThread(std::functionvoid() function);CD_API void WINAPI ExecInMainThread(std::functionvoid() function){PostMessage(g_global.m_fileListWnd, WM_EXEC_FUNCTION, reinterpret_castWPARAM(new decltype(function)(std::move(function))), NULL);}*/ExecInMainThread([this]{ m_thread std::make_uniquestd::thread(CheckCovered::CheckCoveredThread, this); });return true;}bool CheckCovered::Uninit(){m_runThreadFlag false;if (m_thread ! nullptr m_thread-joinable())m_thread-join();m_thread nullptr;return true;}void CheckCovered::CheckCoveredThread(){while (m_runThreadFlag){if (IsDesktopCovered()){if (!m_isCovered){m_isCovered true;//ExecInMainThread([]{ g_desktopCoveredEvent(); });#ifdef _DEBUGWCHAR windowName[100], className[100];GetWindowTextW(m_coveredByHwnd, windowName, _countof(windowName));GetClassNameW(m_coveredByHwnd, className, _countof(className));_RPTFW2(_CRT_WARN, L桌面被 %s (%s) 遮挡\n, windowName, className); #endif}}else{if (m_isCovered){m_isCovered false;//ExecInMainThread([]{ g_desktopUncoveredEvent(); });_RPTF0(_CRT_WARN, 桌面从被遮挡恢复\n);}}for (int i 0; i 10; i){if (!m_runThreadFlag)break;Sleep(100);}}}bool CheckCovered::IsDesktopCovered(){m_coveredByHwnd NULL;// 对于 D3D 独占全屏的程序不能用 IsZoomed 判断全屏// TODO兼容多屏幕int screenWidth GetSystemMetrics(SM_CXSCREEN);int screenHeight GetSystemMetrics(SM_CYSCREEN);HWND hwnd GetForegroundWindow();if (hwnd ! GLOBAL_YOUR_WINDOW) // GLOBAL_YOUR_WINDOW 是你要检测是否被全屏幕覆盖的窗口{RECT rect;GetWindowRect(hwnd, rect);if (rect.left 0 rect.top 0 rect.right screenWidth rect.bottom screenHeight){WCHAR wsClassName[MAX_PATH] { 0 };GetClassNameW(hwnd, wsClassName, MAX_PATH);if (wcsstr(wsClassName, LLivePreview) NULL) { // 预览桌面窗口出现时恢复动画播放m_coveredByHwnd hwnd;return true;}else {m_coveredByHwnd nullptr;return false;}}}EnumWindows([](HWND hwnd, LPARAM pCoveredByHwnd)-BOOL { #ifdef _WIN64// 对于 win10 app不能用 IsWindowVisible 判断是否可见DWORD cloaked 0;DwmGetWindowAttribute(hwnd, DWMWA_CLOAKED, cloaked, sizeof(cloaked));if (cloaked ! 0)return TRUE; #endif// 有最大化的窗口而且可见则被遮挡最小化也是不可见if (IsZoomed(hwnd) IsWindowVisible(hwnd)){*(HWND*)pCoveredByHwnd hwnd;return FALSE;}return TRUE;}, (LPARAM)m_coveredByHwnd);if (m_coveredByHwnd ! nullptr) {WCHAR wsClassName[MAX_PATH] { 0 };GetClassNameW(m_coveredByHwnd, wsClassName, MAX_PATH);if (wcsstr(wsClassName, LLivePreview) NULL) { // 预览桌面窗口出现时恢复动画播放return true;}else {m_coveredByHwnd nullptr;return false;}}return false;} }这里有两个点要说一下一是此代码需要完善多桌面的情况二是此代码考虑了预览桌面时候会产生一个窗口覆盖全屏的情况LivePreview为了避免检测失效应该排除此时的覆盖情况代码中也已经初步实现了。 本文发布于2024.06.10.
http://www.dnsts.com.cn/news/172060.html

相关文章:

  • 珠海华中建设工程有限公司网站中核工建设集团网站
  • 自己做网站需要学什么东西网站流量盈利模式
  • 深圳杰恩创意设计有限公司网站汕头房产网站建设
  • 购物网站建设需要注意什么农村网站做移动
  • 做网站简单还是做app简单网站推广app
  • 站长之家ppt做网站美工的理由
  • 网站改版应该怎么做怎么做网站营销策划
  • 网站建设投入及费用专业的大良网站建设
  • 网站可以换域名吗关键词推广工具
  • wordpress分站企业网站优化设计的含义
  • 楼梯 技术支持 东莞网站建设网站建设项目规划书社团宣传
  • flash网站读条怎么做淄博营销型网站建设公司
  • 丽江做网站龙岗网站价格
  • 如何网站专题制作wordpress 点餐主题
  • 国内永久免费crm系统网站推荐有哪些网站名字怎么取最好
  • 用网页制作个人网站网站建设运动会成绩管理系统
  • 医院网站建设情况说明书徐州网站建设方案优化
  • 网上做兼职的网站有哪些工作网站开发使用的软件
  • 旅游网站logo工程建筑公司网站
  • 机房网站建设方案成都必去的10个景点
  • cms 网站模板俄罗斯门户网站
  • 无锡 网站建设公司wordpress 仿阿里巴巴
  • 怎么做谷歌这样的网站吗化工企业常用推广网站
  • 太原网站优化多少钱wordpress手机页面悬浮导航栏
  • 做文案图片上什么网站深圳别墅设计公司首选
  • 洛阳 网站建设公司吉林省建设安全协会网站
  • 舞蹈培训东莞网站建设百度竞价排名算法
  • 泰州网站设计公司广南网站制作
  • 中国建设领域专业人员网站青岛代理注册公司电话
  • ppt模板免费下载的网站wordpress 弹出对话框