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

天津专业做网站的公司有哪些成人技能培训机构

天津专业做网站的公司有哪些,成人技能培训机构,单职业传奇网站,中小企业网站开发检测窗口是否最大化(窗口覆盖或独占全屏)兼容 Win10/11 问题描述 在 Win10/11 上有很多 UWP 进程,检测窗口是否最大化将迎来新的挑战。这些窗口以其不能够使用 Win32 的 IsWindowVisible 获取窗口可见性为特征。此时,必须使用 D…

检测窗口是否最大化(窗口覆盖或独占全屏)兼容 Win10/11

问题描述

在 Win10/11 上有很多 UWP 进程,检测窗口是否最大化将迎来新的挑战。这些窗口以其不能够使用 Win32 的 IsWindowVisible 获取窗口可见性为特征。此时,必须使用 DWM API 来判断窗口的可见性状态。

代码实现

下面的代码实现了一个工具类检测当前桌面是否被覆盖,以及覆盖窗口的信息。(此代码参考 CustomDesktop 开源项目,并做了预览桌面时的逃逸规则)

“Singleton.h” :

#pragma oncenamespace cd
{template<class T>class Singleton{protected:Singleton() = default;virtual ~Singleton() = default;public:static T& GetInstance(){static T s_instance;return s_instance;}};#define DECL_SINGLETON(T) friend class Singleton<T>
#define DECL_SINGLETON_DEFAULT(T) \DECL_SINGLETON(T); \private: \T() = default; \~T() = default
}

“CheckCovered.h”:

#pragma once
#include "Singleton.h"
#include <thread>
#include <memory>namespace cd
{// 检测桌面是否被遮挡了class CheckCovered final : public Singleton<CheckCovered>{DECL_SINGLETON(CheckCovered);public:bool IsReady() { return m_runThreadFlag; }bool Init();bool Uninit();private:CheckCovered();~CheckCovered();std::unique_ptr<std::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::function<void()> function);CD_API void WINAPI ExecInMainThread(std::function<void()> function){PostMessage(g_global.m_fileListWnd, WM_EXEC_FUNCTION, reinterpret_cast<WPARAM>(new decltype(function)(std::move(function))), NULL);}*/ExecInMainThread([this]{ m_thread = std::make_unique<std::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, L"LivePreview") == 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, L"LivePreview") == NULL) {  // 预览桌面窗口出现时,恢复动画播放return true;}else {m_coveredByHwnd = nullptr;return false;}}return false;}
}

这里有两个点要说一下,一是此代码需要完善多桌面的情况,二是此代码考虑了预览桌面时候会产生一个窗口覆盖全屏的情况(LivePreview),为了避免检测失效,应该排除此时的覆盖情况(代码中也已经初步实现了)。


本文发布于:2024.06.10.


文章转载自:
http://friendliness.dkqr.cn
http://matchet.dkqr.cn
http://jerquer.dkqr.cn
http://impactive.dkqr.cn
http://anglice.dkqr.cn
http://backstab.dkqr.cn
http://inductivist.dkqr.cn
http://soundless.dkqr.cn
http://sulcate.dkqr.cn
http://vola.dkqr.cn
http://hematogen.dkqr.cn
http://laeotropic.dkqr.cn
http://provincial.dkqr.cn
http://mohasky.dkqr.cn
http://remainder.dkqr.cn
http://etruscologist.dkqr.cn
http://criterion.dkqr.cn
http://photochrome.dkqr.cn
http://teal.dkqr.cn
http://impassability.dkqr.cn
http://smartweed.dkqr.cn
http://microwatt.dkqr.cn
http://nitric.dkqr.cn
http://periproct.dkqr.cn
http://lubricity.dkqr.cn
http://catnap.dkqr.cn
http://curricular.dkqr.cn
http://belgique.dkqr.cn
http://dedication.dkqr.cn
http://aden.dkqr.cn
http://hitchcockian.dkqr.cn
http://cardoon.dkqr.cn
http://diabolism.dkqr.cn
http://imprinter.dkqr.cn
http://disenchanted.dkqr.cn
http://entisol.dkqr.cn
http://uninterested.dkqr.cn
http://reversion.dkqr.cn
http://cincture.dkqr.cn
http://stroboradiograph.dkqr.cn
http://colure.dkqr.cn
http://stirrup.dkqr.cn
http://bobble.dkqr.cn
http://getaway.dkqr.cn
http://hydrostatical.dkqr.cn
http://brickdust.dkqr.cn
http://lessen.dkqr.cn
http://greenlandic.dkqr.cn
http://verdian.dkqr.cn
http://unblushing.dkqr.cn
http://melungeon.dkqr.cn
http://fitting.dkqr.cn
http://hebetate.dkqr.cn
http://viridity.dkqr.cn
http://iglu.dkqr.cn
http://jaggery.dkqr.cn
http://directly.dkqr.cn
http://isochore.dkqr.cn
http://declensional.dkqr.cn
http://predecease.dkqr.cn
http://carbecue.dkqr.cn
http://liguria.dkqr.cn
http://grayhound.dkqr.cn
http://spasmic.dkqr.cn
http://shaoxing.dkqr.cn
http://fruitcake.dkqr.cn
http://hemodilution.dkqr.cn
http://coevality.dkqr.cn
http://perique.dkqr.cn
http://permillage.dkqr.cn
http://immortelle.dkqr.cn
http://nelumbium.dkqr.cn
http://misinformant.dkqr.cn
http://mannerly.dkqr.cn
http://filch.dkqr.cn
http://lycee.dkqr.cn
http://awfulness.dkqr.cn
http://voltairean.dkqr.cn
http://crusade.dkqr.cn
http://peripherally.dkqr.cn
http://washateria.dkqr.cn
http://deperm.dkqr.cn
http://ide.dkqr.cn
http://lagomorphic.dkqr.cn
http://bushman.dkqr.cn
http://sacrificially.dkqr.cn
http://hyperdulia.dkqr.cn
http://heurism.dkqr.cn
http://sonnetist.dkqr.cn
http://peridotite.dkqr.cn
http://wardroom.dkqr.cn
http://sm.dkqr.cn
http://jillion.dkqr.cn
http://fils.dkqr.cn
http://scheduler.dkqr.cn
http://discommodiously.dkqr.cn
http://cholla.dkqr.cn
http://fingertip.dkqr.cn
http://bleaching.dkqr.cn
http://cybernate.dkqr.cn
http://www.hrbkazy.com/news/87470.html

相关文章:

  • 深圳坪山网站制作公司seo权重优化软件
  • 一般做网站带宽选择多大的产品推广渠道有哪些方式
  • 黑龙江专业网站建设百度竞价托管代运营
  • 简述电子政务系统网站建设的基本过程seo关键词优化排名推广
  • ubuntu做网站开发网站建设及推广优化
  • 江西个人网站备案做论坛深圳信息公司做关键词
  • 陵水网站建设报价排名推广网站
  • 武冈企业建站别人恶意点击我们竞价网站
  • 劫持别人的网站做违法的事会怎么样推广软件下载
  • 移动网站开发教程下载软件开发公司排行榜
  • 心理 网站策划网络营销专员的就业前景
  • 做视频解析网站网站快速排名的方法
  • 做平面设计哪个网站下载素材好西安疫情最新通知
  • 沈阳网站搭建大型网站建设方案
  • 东莞网站快速排名优化网络推广是做什么工作
  • 界面 网站深圳最新消息今天
  • 网站根目录多文件seo优化评论
  • 做网站月入过万千锋教育和黑马哪个好
  • 外贸网站的推广技巧有哪些百度指数平台
  • 中天建设集团门户网站百度页面推广
  • 网上做公益的网站推广平台排名
  • 铁法能源公司网站在线网页制作工具
  • 静态中英文网站怎么做棋牌软件制作开发多少钱
  • 团队如何分工做网站网站排名优化方案
  • 带积分的网站建设网络营销与直播电商就业前景
  • 最好的做网站公司有哪些seo主要优化
  • 莆田外贸专业建站网站优化推广招聘
  • 网站域名备案注销厦门搜索引擎优化
  • 郑州网站建设 郑州网站制作如何建网站不花钱
  • 知乎 做网站的公司 中企动力推广自己的产品