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

C++調(diào)用opencv和windows api完成桌面窗口截圖——以夢(mèng)幻西游為例

這篇具有很好參考價(jià)值的文章主要介紹了C++調(diào)用opencv和windows api完成桌面窗口截圖——以夢(mèng)幻西游為例。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

程序簡(jiǎn)介

項(xiàng)目編寫的C++程序,根據(jù)輸入的字符串,遍歷所有桌面窗口標(biāo)題,查找包含該標(biāo)題的窗口,對(duì)該桌面窗口進(jìn)行截圖,以夢(mèng)幻西游為例

輸入:桌面窗口包含的字符串 比如輸入“夢(mèng)幻”,程序就會(huì)截取桌面“夢(mèng)幻西游”的窗口

輸出:該桌面窗口的截圖,數(shù)據(jù)類型為opencv的Mat矩陣

在這里插入圖片描述

程序/數(shù)據(jù)集下載

點(diǎn)擊進(jìn)入下載地址

c++以句柄截屏窗口圖像,功能,C++,c++,opencv,windows

本文章只發(fā)布于博客園爆米算法、CSDN,被抄襲后可能排版錯(cuò)亂或下載失效,作者:爆米LiuChen

代碼環(huán)境、文件結(jié)構(gòu)

VS2019 注意鏈接器需要加入dwmapi.lib,用來調(diào)用windows的API opencv4.5.5

在這里插入圖片描述# 代碼分析

FindWindow.h聲明了查找和定位窗口的函數(shù),定義解析請(qǐng)看下文

#pragma once
#include <dwmapi.h>
#include <windows.h> 
#include <vector> 
#include <string>  
#include <iostream>

struct WindowData;

BOOL CALLBACK WindowEnumerationCallback(HWND hwnd, LPARAM lParam);

HWND getWindowHWND(std::string titleSection);

RECT getWindowLoc(HWND hwnd);

FindWindow.cpp中核心函數(shù)getWindowHWND可以根據(jù)輸入的窗口標(biāo)題字符串,定位到含有該字符串的窗口,返回窗口句柄HWND,然后將句柄輸入getWindowLoc函數(shù),得到窗口的位置,這里調(diào)用了windows api DwmGetWindowAttribute,如果用傳統(tǒng)的方法GetWindowRect會(huì)得到錯(cuò)誤的結(jié)果,因?yàn)閭鹘y(tǒng)方法沒考慮到桌面縮放且自windows vista后的系統(tǒng)桌面窗口加入了“毛玻璃邊緣”效果,得到的窗口位置會(huì)有偏移

#include "FindWindow.h"

struct WindowData {
    HWND handle;//窗口句柄
    char title[256];//窗口標(biāo)題
};

std::vector<WindowData> windowDatas;

// 聲明回調(diào)函數(shù)  
BOOL CALLBACK WindowEnumerationCallback(HWND hwnd, LPARAM lParam) {
    // 通過IsWindow函數(shù)檢查窗口是否有效  
    if (IsWindow(hwnd)) {
        // 通過IsWindowEnabled函數(shù)檢查窗口是否啟用  
        if (IsWindowEnabled(hwnd)) {
            // 通過IsWindowVisible函數(shù)檢查窗口是否可見  
            if (IsWindowVisible(hwnd)) {
                // 獲取窗口的文本,并打印  
                char windowText[256];
                GetWindowTextA(hwnd, windowText, sizeof(windowText));
                WindowData windowData;
                windowData.handle = hwnd;
                memcpy(windowData.title, windowText, 256);
                windowDatas.push_back(windowData);
            }
        }
    }
    // 繼續(xù)枚舉其他窗口  
    return TRUE;
}

//返回包含titleSection的桌面窗口句柄
HWND getWindowHWND(std::string titleSection)
{
    HWND handle = NULL;
    //每次都要清空容器
    windowDatas.clear();
    // 使用EnumWindows函數(shù)枚舉所有窗口,并傳遞給回調(diào)函數(shù)處理  
    EnumWindows(WindowEnumerationCallback, NULL);
    //一個(gè)個(gè)找包含指定字符串的
    for (auto it = windowDatas.begin(); it != windowDatas.end(); it++)
    {
        char title[256];
        memcpy(title, it->title, 256);
        std::string windowTitle(title);
        if (windowTitle.find(titleSection) != std::string::npos)
        {
            handle = it->handle;
        }
    }
    return handle;
}


//根據(jù)窗口句柄和桌面縮放獲得窗口尺寸和位置
RECT getWindowLoc(HWND hwnd)
{
    RECT frame;
    DwmGetWindowAttribute(hwnd, DWMWA_EXTENDED_FRAME_BOUNDS, &frame, sizeof(RECT));
    //std::cout << "窗口位置:(" << frame.left << ", " << frame.top << ")" << std::endl;
    //std::cout << "窗口大?。?" << frame.right-frame.left << ", " << frame.bottom-frame.top << ")" << std::endl;
    return frame;
}

WindowShot.h聲明了根據(jù)坐標(biāo)和尺寸的截圖函數(shù),定義解析請(qǐng)看下文

#pragma once
#include "FindWindow.h"
#include <opencv2/opencv.hpp>

struct WindowRect
{
    int x;
    int y;
    int width;
    int height;
};

class WindowShot
{
public:
    WindowShot();
    double static getZoom();
    cv::Mat getWindowMat(std::string titleSection);
    uchar* getWindowUchar(std::string titleSection);
    WindowRect windowRect;
    cv::Mat getDesktopMat();
    ~WindowShot();

private:
    int width;
    int height;
    double zoom;
    uchar* windowUchar;
    RECT rect;
    HDC screenDC;
    HDC compatibleDC;
    HBITMAP hBitmap;
    LPVOID shotData;
    HWND hwnd;
};

WindowShot.cpp定義了核心函數(shù)getWindowMat,該函數(shù)會(huì)調(diào)用FindWindow模塊來查找窗口的句柄和位置,然后對(duì)整個(gè)屏幕具體的位置進(jìn)行截圖,當(dāng)然同時(shí)也定義了getDesktopMat函數(shù)用來截圖整個(gè)桌面,不同的是這個(gè)函數(shù)用到了個(gè)人桌面縮放率

#include "WindowShot.h"

//初始化變量
WindowShot::WindowShot()
{
    zoom = getZoom();//縮放率 比如1.25
}


//根據(jù)窗口標(biāo)題是否包含該字符串,獲得窗口截圖
cv::Mat WindowShot::getWindowMat(std::string titleSection)
{
    hwnd = getWindowHWND(titleSection);
    //如果窗口小化 就將其展示 
    if (IsIconic(hwnd)) {
        ShowWindow(hwnd, SW_RESTORE);
    }
    SetForegroundWindow(hwnd); // 將窗口置頂  
    rect = getWindowLoc(hwnd); // 窗口位置
    width = rect.right - rect.left;
    height = rect.bottom - rect.top;
    windowRect.x = rect.left;
    windowRect.y = rect.top;
    windowRect.width = width;
    windowRect.height = height;
    shotData = new char[width * height * 4];
    screenDC = GetDC(NULL);// 獲取屏幕 DC
    compatibleDC = CreateCompatibleDC(screenDC);//兼容新DC
    // 創(chuàng)建位圖
    hBitmap = CreateCompatibleBitmap(screenDC, width, height);
    SelectObject(compatibleDC, hBitmap);
    // 得到位圖的數(shù)據(jù)
    BitBlt(compatibleDC, 0, 0, width, height, screenDC, rect.left, rect.top, SRCCOPY);
    GetBitmapBits(hBitmap, width * height * 4, shotData);
    // 創(chuàng)建圖像
    cv::Mat windowMat(height, width, CV_8UC4, shotData);
    return windowMat;
}

//根據(jù)窗口標(biāo)題是否包含該字符串,獲得窗口截圖 將截圖轉(zhuǎn)為uchar* 供python使用
uchar* WindowShot::getWindowUchar(std::string titleSection)
{
    cv::Mat windowMat = this->getWindowMat(titleSection);
    int size = width * height * 4;
    free(windowUchar);
    windowUchar = (uchar*)malloc(sizeof(uchar) * size);
    memcpy(windowUchar, windowMat.data, size);
    return windowUchar;
}

cv::Mat WindowShot::getDesktopMat()
{
    width = GetSystemMetrics(SM_CXSCREEN) * zoom;
    height = GetSystemMetrics(SM_CYSCREEN) * zoom;
    rect.left = 0;
    rect.top = 0;
    rect.right = width;
    rect.bottom = height;
    width = rect.right - rect.left;
    height = rect.bottom - rect.top;
    shotData = new char[width * height * 4];
    screenDC = GetDC(NULL);// 獲取屏幕 DC
    compatibleDC = CreateCompatibleDC(screenDC);//兼容新DC
    // 創(chuàng)建位圖
    hBitmap = CreateCompatibleBitmap(screenDC, width, height);
    SelectObject(compatibleDC, hBitmap);
    // 得到位圖的數(shù)據(jù)
    BitBlt(compatibleDC, 0, 0, width, height, screenDC, rect.left, rect.top, SRCCOPY);
    GetBitmapBits(hBitmap, width * height * 4, shotData);
    // 創(chuàng)建圖像
    cv::Mat desktopMat(height, width, CV_8UC4, shotData);
    return desktopMat;
}

/* 獲取屏幕縮放值 */
double WindowShot::getZoom()
{
    // 獲取窗口當(dāng)前顯示的監(jiān)視器
    HWND hWnd = GetDesktopWindow();
    HMONITOR hMonitor = MonitorFromWindow(hWnd, MONITOR_DEFAULTTONEAREST);

    // 獲取監(jiān)視器邏輯寬度
    MONITORINFOEX monitorInfo;
    monitorInfo.cbSize = sizeof(monitorInfo);
    GetMonitorInfo(hMonitor, &monitorInfo);
    int cxLogical = (monitorInfo.rcMonitor.right - monitorInfo.rcMonitor.left);

    // 獲取監(jiān)視器物理寬度
    DEVMODE dm;
    dm.dmSize = sizeof(dm);
    dm.dmDriverExtra = 0;
    EnumDisplaySettings(monitorInfo.szDevice, ENUM_CURRENT_SETTINGS, &dm);
    int cxPhysical = dm.dmPelsWidth;

    return cxPhysical * 1.0 / cxLogical;
}

WindowShot::~WindowShot()
{
    DeleteObject(hBitmap);
    DeleteDC(compatibleDC);
}

結(jié)果展示

運(yùn)行一下main.cpp,得到夢(mèng)幻西游的窗口截圖(文章開頭已給出),對(duì)比下整個(gè)桌面截圖

在這里插入圖片描述文章來源地址http://www.zghlxwxcb.cn/news/detail-832713.html

到了這里,關(guān)于C++調(diào)用opencv和windows api完成桌面窗口截圖——以夢(mèng)幻西游為例的文章就介紹完了。如果您還想了解更多內(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)文章

  • Flink窗口(2)—— Window API

    Flink窗口(2)—— Window API

    目錄 窗口分配器 時(shí)間窗口 計(jì)數(shù)窗口 全局窗口 窗口函數(shù) 增量聚合函數(shù) 全窗口函數(shù)(full window functions) 增量聚合和全窗口函數(shù)的結(jié)合使用 Window API 主要由兩部分構(gòu)成: 窗口分配器 (Window Assigners)和 窗口函數(shù) (Window Functions) 在window()方法中傳入一個(gè)窗口分配器; 在aggreg

    2024年01月16日
    瀏覽(26)
  • Windows API遍歷桌面上所有文件

    要獲取桌面上的圖標(biāo),可以使用Windows API中的Shell API。以下是遍歷桌面上所有文件的示例代碼: ? 在這個(gè)示例中,通過調(diào)用`SHGetFolderPathW`函數(shù)來獲取桌面文件夾的路徑。然后使用`FindFirstFileW`和`FindNextFileW`遍歷桌面上的所有文件和文件夾。我們只對(duì)文件感興趣,所以在循環(huán)中排

    2024年02月16日
    瀏覽(17)
  • postman-使用Postman的模擬服務(wù)來模擬(mock)后端數(shù)據(jù),完成前端模擬API調(diào)用

    postman-使用Postman的模擬服務(wù)來模擬(mock)后端數(shù)據(jù),完成前端模擬API調(diào)用

    最近項(xiàng)目上比較忙,任務(wù)多時(shí)間緊,導(dǎo)致后端開發(fā)任務(wù)繁多,無法及時(shí)開發(fā)完畢,但是前端同學(xué)已經(jīng)把對(duì)應(yīng)功能開發(fā)完成,需要進(jìn)行前后端聯(lián)調(diào)來驗(yàn)證API及一些交互問題;這不能因?yàn)楹蠖说倪M(jìn)度來影響前端的工作完成情況,因此,Postman的mock數(shù)據(jù)功能就用了,確實(shí)好用。 Set

    2024年02月11日
    瀏覽(23)
  • 從零開始學(xué)習(xí)調(diào)用百度地圖網(wǎng)頁(yè)API:二、初始化地圖,鼠標(biāo)交互創(chuàng)建信息窗口

    從零開始學(xué)習(xí)調(diào)用百度地圖網(wǎng)頁(yè)API:二、初始化地圖,鼠標(biāo)交互創(chuàng)建信息窗口

    注 :需要將 你的ak 替換,從百度地圖官網(wǎng)注冊(cè)申請(qǐng)。 腳本中使用BMap創(chuàng)建Map實(shí)例,centerAndZoom()初始化地圖設(shè)置中心點(diǎn)為北京,地圖等級(jí)15。enableScrollWheelZoom()鼠標(biāo)滾輪可縮放窗口。addEventListener監(jiān)聽鼠標(biāo)點(diǎn)擊事件,發(fā)生后,傳遞事件e至function(e),執(zhí)行openInfoWindow,在鼠標(biāo)點(diǎn)擊坐

    2024年02月07日
    瀏覽(98)
  • 關(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)
  • Qt開發(fā)_調(diào)用OpenCV(4.x)完成人臉檢測(cè)并繪制馬賽克(攝像頭實(shí)時(shí)數(shù)據(jù))

    這個(gè)基于Qt和OpenCV的人臉檢測(cè)和人臉打碼項(xiàng)目是通過實(shí)時(shí)視頻流中的人臉識(shí)別來保護(hù)隱私。 該項(xiàng)目目的是保護(hù)隱私并確保人臉數(shù)據(jù)安全。在某些情況下,使用實(shí)時(shí)視頻流進(jìn)行人臉檢測(cè)和識(shí)別可能涉及對(duì)個(gè)人隱私的侵犯。通過在圖像中打碼人臉區(qū)域,可以避免未經(jīng)許可的人臉出

    2024年02月06日
    瀏覽(22)
  • 第11課 利用windows API捕獲桌面圖像并通過FFmpeg分享

    第11課 利用windows API捕獲桌面圖像并通過FFmpeg分享

    在上一章,我們已經(jīng)實(shí)現(xiàn)了一對(duì)一音視頻對(duì)話功能。在實(shí)際應(yīng)用中,我們常需要把自己的電腦桌面分享給他人以實(shí)現(xiàn)桌面共享功能,這種功能在視頻會(huì)議、在線教學(xué)等場(chǎng)景中很常見,這種功能如何實(shí)現(xiàn)呢?這節(jié)課我們就來解決這個(gè)問題。 1.備份demo9并修改demo9為demo11。 2.在fm

    2024年02月03日
    瀏覽(14)
  • API Monitor簡(jiǎn)易使用教程 監(jiān)控Windows dll調(diào)用 監(jiān)控Windows API調(diào)用 查看函數(shù)名,參數(shù)類型,參數(shù),返回值

    API Monitor簡(jiǎn)易使用教程 監(jiān)控Windows dll調(diào)用 監(jiān)控Windows API調(diào)用 查看函數(shù)名,參數(shù)類型,參數(shù),返回值

    1、API Filter窗口:選定要監(jiān)聽的dll函數(shù)或windows API,可以打斷點(diǎn) 選中并右鍵勾上Breakpoint 選 Before Call 2、Monitor New Process 窗口 :選擇要運(yùn)行的exe 3、Summary窗口:會(huì)列出所有調(diào)用的函數(shù)。點(diǎn)函數(shù),查看函數(shù)名,參數(shù)類型,參數(shù),返回值等。還能設(shè)斷點(diǎn)。 當(dāng)調(diào)用到斷點(diǎn)的函數(shù)調(diào)用時(shí)

    2024年01月21日
    瀏覽(34)
  • Opencv C++實(shí)現(xiàn)yolov5部署onnx模型完成目標(biāo)檢測(cè)

    頭文件 命名空間 結(jié)構(gòu)體 Net_config 里面存了三個(gè)閾值和模型地址,其中 置信度 ,顧名思義,看檢測(cè)出來的物體的精準(zhǔn)度。以測(cè)量值為中心,在一定范圍內(nèi),真值出現(xiàn)在該范圍內(nèi)的幾率。 endsWith()函數(shù) 判斷sub是不是s的子串 anchors_640圖像接收數(shù)組 根據(jù)圖像大小,選擇相應(yīng)長(zhǎng)度的

    2024年02月13日
    瀏覽(25)
  • Windows下使用QT+OpenCV完成人臉檢測(cè)(獲取攝像頭的數(shù)據(jù)進(jìn)行檢測(cè))

    Windows下使用QT+OpenCV完成人臉檢測(cè)(獲取攝像頭的數(shù)據(jù)進(jìn)行檢測(cè))

    Windows版本: Win10 X64 OpenCV版本: 2.4.13.6 QT版本: 5.12 OpenCV官網(wǎng)下載地址: ???https://opencv.org??? ? ? 目前官網(wǎng)OpenCV最新的版本是4.2.0 ,Windows版本的OpenCV在3.X版本后就不帶X86的庫(kù),只有X64的庫(kù),如果需要X86的庫(kù),需要自己下載源碼去重新編譯。 由于我的QT軟件在安裝時(shí)沒有安裝

    2024年01月16日
    瀏覽(27)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包