国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

捕獲最小化窗口的縮略圖畫面

這篇具有很好參考價(jià)值的文章主要介紹了捕獲最小化窗口的縮略圖畫面。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

關(guān)鍵字:

capture minimized window

window thumbnail

IsIconic?

==================== 問題背景 ======================

最小化的窗口,API GetClientRect 返回的窗口尺寸是0x0,故無法通過GetDC+BitBlt捕獲到窗口畫面。

但是 Agora/zoom/tencentMeeting 都可以拿到最小化窗口的縮略圖。經(jīng)確認(rèn)這個(gè)程序并沒有注入任何dll到目標(biāo)窗口,且也沒有臨時(shí)顯示最小化了的目標(biāo)窗口。

如果用SHOW_RESTORE恢復(fù)最小化了的目標(biāo)窗口,目標(biāo)窗口是會(huì)收到WM_MOVE消息的,測(cè)試Agora/zoom/tencent抓最小化窗口的縮略圖時(shí),最小化的窗口并沒有收到這個(gè)消息,事實(shí)上,目標(biāo)窗口沒有收到任何窗口消息。

小記:

  1. agora zoom 騰訊會(huì)議 在目標(biāo)窗口最小化時(shí), 都可以拿到窗口縮略圖
  2. 拿到的該縮略圖,畫面和任務(wù)欄鼠標(biāo)懸停時(shí)顯示的縮略圖一致(該縮略圖并不是實(shí)時(shí)的,而是窗口最小化時(shí)刻的畫面)
  3. 獲取縮略圖時(shí),目標(biāo)窗口沒有收到任何窗口消息(SPY)
  4. 開始捕獲窗口后,這幾個(gè)視頻會(huì)議軟件 均可以恢復(fù)最小化了的窗口(即使目標(biāo)窗口是管理員權(quán)限啟動(dòng))

==================== 可用的方法 ====================

方法1(不推薦!)

WS_EX_LAYERED, SetLayeredWindowAttributes

方法2:

DWM接口,關(guān)鍵字:DwmRegisterThumbnail,DwmUpdateThumbnailProperties

通過注入Dll + hook API(DwmRegisterThumbnail)的方式驗(yàn)證zoom進(jìn)程,發(fā)現(xiàn)其就是用dwm捕獲最小化窗口畫面的。

在zoom的窗口選擇界面,所有目標(biāo)窗口的畫面捕獲和刷新 都是用的dwm,zoom每次調(diào)用dwmRegister 傳入的dest HWND都是同一個(gè)句柄,且剛剛就是窗口選擇界面的頂層窗口句柄,

目標(biāo)窗口最小化和restore期間,zoom沒有調(diào)用過dwmUnregister,應(yīng)該是調(diào)用了dwmUpdate(尚未驗(yàn)證)。

方法3:

WGC接口,關(guān)鍵字:GraphicsCapturePicker.PickSingleItemAsync (是系統(tǒng)提供的子進(jìn)程界面)

GitHub - robmikh/Win32CaptureSample: A simple sample using the Windows.Graphics.Capture APIs in a Win32 application.

================ DWM接口 ========================

關(guān)鍵字:

DWM(桌面窗口管理器)API , 可以實(shí)現(xiàn)獲取目標(biāo)窗口的縮略圖(即使目標(biāo)窗口是最小化)

DWM API應(yīng)用之縮略圖_老狼主的博客-CSDN博客_c++ dwm api

DWM API應(yīng)用之縮略圖 - CodeAntenna

Windows 使用 DuiLib 顯示屏幕和窗口縮略圖_12194415的技術(shù)博客_51CTO博客

DwmRegisterThumbnail function (dwmapi.h) - Win32 apps | Microsoft Learn

DwmUpdateThumbnailProperties function (dwmapi.h) - Win32 apps | Microsoft Learn

DwmUnregisterThumbnail function (dwmapi.h) - Win32 apps | Microsoft Learn

注意:

1. 一旦用DwmRegisterThumbnail和DwmUpdateThumbnail,綁定了縮略圖關(guān)系后,只要不調(diào)用DwmUnregister,源窗口的畫面就會(huì)被系統(tǒng)持續(xù)自動(dòng)更新到目標(biāo)窗口,不需要手動(dòng)去刷新畫面。

2. 一旦源窗口銷毀了,目標(biāo)窗口上的畫面也就沒有了(系統(tǒng)會(huì)自動(dòng)清空)

3. 源窗口和目標(biāo)窗口 都必須是頂層窗口,且目標(biāo)窗口必須是當(dāng)前進(jìn)程的窗口

4. UWP窗口的源窗口句柄,需要設(shè)置為parent host句柄(EnumWindows的回調(diào)形參HWND就是parent句柄)

#include <dwmapi.h>
#pragma comment(lib,"Dwmapi.lib")

HRESULT RegisterThumbWindow(HWND hWndSrc, HWND hWndDst)
{
    HTHUMBNAIL thumbnail = NULL;
    HRESULT hr = DwmRegisterThumbnail(hWndDst, hWndSrc, &thumbnail);
        if (FAILED(hr))
        return hr; // 如果窗口句柄不存在 或傳入了非頂層窗口的句柄 此處會(huì)出錯(cuò)

    RECT dest;
        GetClientRect(hWndDst, &dest);

    DWM_THUMBNAIL_PROPERTIES dskThumbProps;
    dskThumbProps.dwFlags = DWM_TNP_RECTDESTINATION | DWM_TNP_VISIBLE | DWM_TNP_SOURCECLIENTAREAONLY |DWM_TNP_OPACITY; // 標(biāo)識(shí)哪些字段已經(jīng)設(shè)置了有效值
    dskThumbProps.fSourceClientAreaOnly = FALSE;
    dskThumbProps.fVisible = TRUE;
    dskThumbProps.rcDestination = dest;
    dskThumbProps.opacity = 255;

    hr = DwmUpdateThumbnailProperties(thumbnail, &dskThumbProps);
        if (FAILED(hr))
        OutputDebugStringA("error");

        // DwmUnregisterThumbnail(thumbnail);
        return hr;
}

void CMFCApplication4Dlg::OnBnClickedButton1()
{
        // 要把縮略圖顯示在這個(gè)窗口 注意:根據(jù)MSDN這個(gè)窗口必須是頂層窗口,否則返回錯(cuò)誤E_INVALIDARG
        // 注意 這個(gè)句柄 必須是【當(dāng)前進(jìn)程】的窗口句柄
    HWND hwndDestination = m_hWnd; 
    
        // 想捕獲的源窗口 這個(gè)句柄也必須是頂層窗口句柄,UWP窗口在此處需要設(shè)置為parent host句柄
        HWND hwndSource = (HWND)0X004E0286; 
       
        RegisterThumbWindow(hwndSource, hwndDestination);
}

===================== WGC接口 =====================

GitHub - walker-WSH/Win32CaptureSample: A simple sample using the Windows.Graphics.Capture APIs in a Win32 application.

這個(gè)項(xiàng)目,點(diǎn)擊按鈕“Open Picker”, 會(huì)彈出一個(gè)窗口 用來顯示所有窗口 包含最小化窗口的縮略圖。

但是這個(gè)彈出窗口是系統(tǒng)的,主程序退出后 這個(gè)窗口都還在。如果捕獲窗口利用的是WGC技術(shù),則可以完全復(fù)用系統(tǒng)的這個(gè)picker窗口。

捕獲最小化窗口的縮略圖畫面

這個(gè)彈出的子窗口,實(shí)際上是系統(tǒng)提供的獨(dú)立進(jìn)程:

捕獲最小化窗口的縮略圖畫面

================= WS_EX_LAYERED ===================

技術(shù)點(diǎn):臨時(shí)把窗口顯示出來(SW_RESTORE),捕獲到一幀窗口畫面后,再把窗口恢復(fù)最小化。

顯示窗口之前,需要做如下準(zhǔn)備:

1. 給目標(biāo)窗口增加擴(kuò)展屬性 WS_EX_LAYERED(增加了這個(gè)屬性 才可以設(shè)置窗口透明度)。

2. 用API設(shè)置窗口的透明度為透明 (讓用戶感知不到窗口被顯示了)SetLayeredWindowAttributes / GetLayeredWindowAttributes。

3. 臨時(shí)關(guān)閉系統(tǒng)的最大化和最小化的動(dòng)畫效果 animation(否則臨時(shí)restore最小化的窗口時(shí) 系統(tǒng)有動(dòng)畫效果 被用戶感知)。

恢復(fù)了最小化的窗口 抓取到窗口畫面后,再恢復(fù)以上幾個(gè)屬性(有些窗口可能之前就有透明度,要注意保存以前的值)

注意:

以上操作,如果是UWP窗口,需要設(shè)置的HWND對(duì)象是外層的host窗口。

TODO:

尚未驗(yàn)證過如果目標(biāo)窗口是管理員權(quán)限進(jìn)程的,如下API設(shè)置layered透明度是否還能成功?

HWND hWnd = 0;
    if (pTemp->pObject->bIsUWP) {
        hWnd = pTemp->pObject->hParent; // 如果是UWP窗口 需要使用host窗口
    } else {
        hWnd = pTemp->pObject->hActual;
    }

    if (IsWindow(hWnd)) {
        if (IsIconic(hWnd)) {
            ModifyStyleEx2(hWnd, 0, WS_EX_LAYERED); // 增加了這個(gè)屬性 才可以設(shè)置半透明
            SetLayeredWindowAttributes(hWnd, 0, 155, LWA_ALPHA); // 設(shè)置整個(gè)窗口透明
                        // TODO: 臨時(shí)關(guān)閉系統(tǒng)的最大化和最小化的動(dòng)畫效果
            ShowWindow(hWnd, SW_RESTORE);                        // 顯示窗口

            // TODO: capture window video

            // TODO: 移除layered屬性,恢復(fù)最小化狀態(tài)。
            // 注意:需要確認(rèn)之前是否有l(wèi)ayer屬性,以及對(duì)應(yīng)透明度。GetLayeredWindowAttributes
            ShowWindow(hWnd, SW_MINIMIZE);
        }
    }

備注:

顯示最小化窗口時(shí),如果目標(biāo)窗口是管理員權(quán)限運(yùn)行,而自己的進(jìn)程不是,則使用ShowWindow則會(huì)收到last error = 5。此時(shí)想顯示最小化的目標(biāo)窗口,應(yīng)該用如下兩種方法之一。文章來源地址http://www.zghlxwxcb.cn/news/detail-468864.html

// 方法1 
// [此功能不適用于一般用途。它可能會(huì)在后續(xù)版本的 Windows 中更改或不可用。]
// 根據(jù)微軟注釋 這個(gè)API不建議使用了。
SwitchToThisWindow(hWnd, TRUE)?


// 方法2 (推薦使用)
PostMessage(hWnd, WM_SYSCOMMAND, (WPARAM)SC_RESTORE, 0)

到了這里,關(guān)于捕獲最小化窗口的縮略圖畫面的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 關(guān)于Windows桌面遠(yuǎn)程后,unity程序無法全屏顯示或者顯示窗口默認(rèn)最小化解決方法

    關(guān)于Windows桌面遠(yuǎn)程后,unity程序無法全屏顯示或者顯示窗口默認(rèn)最小化解決方法

    按以下步驟操作 1、Win+R打開運(yùn)行,然后輸入regedit打開注冊(cè)表 2、根據(jù)計(jì)算機(jī)HKEY_CURRENT_USERSoftwareDefaultCompany路徑找到DefaultCompany的文件夾 3、在DefaultCompany文件夾下找到unity打包時(shí)exe文件對(duì)應(yīng)名稱的文件夾,右鍵刪除整個(gè)文件夾,刪除后再去啟動(dòng)unity.exe程序即可恢復(fù)正常顯示畫

    2024年04月10日
    瀏覽(19)
  • electron在最小化窗口后,任務(wù)欄右鍵關(guān)閉再托盤喚起黑屏的解決方法

    在點(diǎn)擊托盤喚醒的回調(diào)函數(shù)下我的代碼是這樣的: 因?yàn)槲蚁胍钚』笤賳拘芽梢曰氐皆即翱跔顟B(tài),比如最大化。但是這么喚醒后會(huì)導(dǎo)致頁面黑屏,在找了很多文檔無果。最后在我試驗(yàn)再次調(diào)用.show后成功喚醒了 所以 ,最后我的解決方案是在restore后再次調(diào)用show方法進(jìn)行展

    2024年02月11日
    瀏覽(27)
  • 【Qt UI相關(guān)】Qt中如何控制 窗口的最大化、最小化和關(guān)閉按鈕?一文帶你掌握用法

    【Qt UI相關(guān)】Qt中如何控制 窗口的最大化、最小化和關(guān)閉按鈕?一文帶你掌握用法

    窗口的最大化、最小化和關(guān)閉按鈕通常是由操作系統(tǒng)的窗口管理器控制的,而不是由應(yīng)用程序控制的。這些按鈕的行為(例如點(diǎn)擊最大化按鈕會(huì)將窗口的大小調(diào)整為屏幕的大?。┦怯纱翱诠芾砥鲗?shí)現(xiàn)的,應(yīng)用程序通常不能改變這些行為。 在 Qt 中,你可以通過 QWidget::setWindow

    2024年02月11日
    瀏覽(29)
  • 機(jī)器學(xué)習(xí)的學(xué)習(xí)準(zhǔn)則(期望風(fēng)險(xiǎn)最小化、經(jīng)驗(yàn)風(fēng)險(xiǎn)最小化、結(jié)構(gòu)風(fēng)險(xiǎn)最小化)

    機(jī)器學(xué)習(xí)的學(xué)習(xí)準(zhǔn)則(期望風(fēng)險(xiǎn)最小化、經(jīng)驗(yàn)風(fēng)險(xiǎn)最小化、結(jié)構(gòu)風(fēng)險(xiǎn)最小化)

    訓(xùn)練集是有N個(gè)獨(dú)立同分布的樣本組成,即每個(gè)樣本(x,y)是獨(dú)立的從相同的分布中抽取的。這個(gè)真實(shí)的分布未知 輸入空間X和輸出空間Y構(gòu)成樣本空間,對(duì)于樣本空間中的樣本(x, y)∈X x Y,假定x和y之間可通過一個(gè)未知的真實(shí)隱射y=g(x)來描述,或者通過真實(shí)條件概率分布來描述。

    2024年02月09日
    瀏覽(18)
  • DFA的最小化

    DFA的最小化

    一、實(shí)驗(yàn)?zāi)康?1.熟練掌握DFA與NFA的定義與有關(guān)概念。 2.理解并掌握確定的有窮自動(dòng)機(jī)的最小化等算法。 二、實(shí)驗(yàn)要求 輸入:DFA 輸出:最小化的DFA 三、實(shí)驗(yàn)過程 1.化簡(jiǎn)DFA關(guān)鍵在于把它的狀態(tài)集分成一些兩兩互不相交的子集,使得任何兩個(gè)不相交的子集間的狀態(tài)都是可區(qū)分

    2024年02月09日
    瀏覽(29)
  • QT最小化程序到托盤運(yùn)行

    QT最小化程序到托盤運(yùn)行

    實(shí)現(xiàn)程序關(guān)閉時(shí)最小化托盤的功能 托盤實(shí)現(xiàn)顯示主頁面和退出的功能 支持?jǐn)U展,直接引用TrayIcon類即可,對(duì)外暴露接口 單例實(shí)現(xiàn),可復(fù)用 注:博主所有資源永久免費(fèi),若有幫助,請(qǐng)點(diǎn)贊轉(zhuǎn)發(fā)是對(duì)我莫大的幫助 注:博主本人學(xué)習(xí)過程的分享,引用他人的文章皆會(huì)標(biāo)注原作者

    2024年02月05日
    瀏覽(29)
  • LeetCode——最小化字符串長(zhǎng)度

    LeetCode——最小化字符串長(zhǎng)度

    目錄 一、題目 二、題目解讀? 三、代碼? 1、set去重 2、用一個(gè)二進(jìn)制數(shù)記錄每個(gè)字母是否出現(xiàn)過 6462. 最小化字符串長(zhǎng)度 - 力扣(Leetcode) 給你一個(gè)下標(biāo)從? 0 ?開始的字符串? s ?,重復(fù)執(zhí)行下述操作? 任意 ?次: 在字符串中選出一個(gè)下標(biāo)? i ?,并使? c ?為字符串下標(biāo)? i

    2024年02月08日
    瀏覽(91)
  • LabVIEW開發(fā)最小化5G系統(tǒng)測(cè)試平臺(tái)

    LabVIEW開發(fā)最小化5G系統(tǒng)測(cè)試平臺(tái)

    LabVIEW開發(fā)最小化5G系統(tǒng)測(cè)試平臺(tái) 由于具有大量存儲(chǔ)能力和數(shù)據(jù)的應(yīng)用程序的智能手機(jī)的激增,當(dāng)前一代產(chǎn)品被迫提高其吞吐效率。正交頻分復(fù)用由于其卓越的品質(zhì),如單抽頭均衡和具有成本效益的實(shí)施,現(xiàn)在被廣泛用作物理層技術(shù)。這些好處是以嚴(yán)格的同步、正交性和高功耗

    2024年02月12日
    瀏覽(19)
  • unity發(fā)布設(shè)置(最小化、置頂、限制單開)

    unity發(fā)布設(shè)置(最小化、置頂、限制單開)

    1. 勾上下圖標(biāo)紅處,發(fā)布后可防止按windows鍵縮小 ?2.發(fā)布后程序默認(rèn)最小化 3.發(fā)布的程序只能開一個(gè)進(jìn)程

    2024年02月12日
    瀏覽(27)
  • 最小化安裝Linux系統(tǒng)初始化腳本

    目錄 最小化安裝Linux系統(tǒng)初始化腳本 注:此腳本適用于centos 7/8、Ubuntu1804,具體需要根據(jù)實(shí)際情況進(jìn)行測(cè)試調(diào)整。 此腳本包含的功能: 允許 root 用戶使用 ssh 登錄 關(guān)閉 selinux 關(guān)閉防火墻 設(shè)置 ps1 設(shè)置默認(rèn)編輯器為 vim 自定義 vim 自定義歷史命令 修改內(nèi)核參數(shù) 設(shè)置資源限制 修

    2024年02月12日
    瀏覽(27)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包