如何获得一个特定窗口的屏幕截图与生 rust 的Windows?

tjrkku2a  于 2023-03-18  发布在  Windows
关注(0)|答案(1)|浏览(259)

我想知道如何对特定窗口的一部分进行屏幕截图。应用程序顶部可能有一个覆盖层(游戏覆盖层),隐藏了我感兴趣的内容。我想找到一种方法,只对应用程序进行屏幕截图,忽略覆盖层或顶部的内容。
我想知道是否有可能优化它,以便有**~5截图/秒**
现在我尝试使用screenshots货物包,代码如下:

use opencv::{core, highgui, imgcodecs};
use screenshots::Screen;
use std::{time::Instant};
use opencv::core::{log, Mat};

const WIDTH: i32 = 275;
const HEIGHT: i32 = 275;

fn get_img(screen: Screen) -> Mat {
    let image = screen.capture().unwrap();
    let buffer: Vec<u8> = image.into();

    // Change image type to OpenCV Mat
    let original_image: Mat = imgcodecs::imdecode(&core::Mat::from_slice(buffer.as_slice()).unwrap(), imgcodecs::IMREAD_COLOR).unwrap();
    return original_image;
}

fn main() {
    let window_name = "test".to_owned();
    highgui::named_window(&window_name, highgui::WINDOW_NORMAL).unwrap();
    highgui::resize_window(&window_name, WIDTH, HEIGHT).unwrap();

    let screens = Screen::all().unwrap();
    let screen = screens[1].clone();

    let mut img = get_img(screen);

    loop {
        let now = Instant::now();
        img = get_img(screen);

        // print in console the time it took to process the image
        println!("{} ms", now.elapsed().as_millis());
    }
}

但它似乎不可能采取屏幕截图只是一个特定的窗口背后的覆盖。
我使用cargo run --release
目标操作系统是Windows,我也在Windows下开发。
ps:我将我的图像转换为OpenCV Mat以用于下一部分代码

0pizxfdo

0pizxfdo1#

您可以使用winapiuser32 repo获取任何窗口截图。
错误,你可能已经使用onencv库,不工作在Windows上.
这是我的示例代码。假设我们有一个名为“Chrome”的窗口

use winapi::um::winuser::{FindWindowA, GetWindowRect, GetDC, ReleaseDC};
use winapi::shared::windef::RECT;
use std::ptr::null_mut;

fn main() {
    let window_title = "Chrome";
    let hwnd = unsafe { FindWindowA(null_mut(), window_title.as_ptr() as *const i8) };
    let mut rect = RECT::default();
    unsafe {
        GetWindowRect(hwnd, &mut rect);
        let width = rect.right - rect.left;
        let height = rect.bottom - rect.top;
        let hdc = GetDC(hwnd);
        let mut buf: Vec<u32> = vec![0; (width * height) as usize];
        let pitch = width * std::mem::size_of::<u32>() as i32;
        winapi::um::wingdi::BitBlt(hdc, 0, 0, width, height, hdc, 0, 0, winapi::um::wingdi::SRCCOPY);
        winapi::um::wingdi::GetDIBits(hdc, null_mut(), 0, height as u32, buf.as_mut_ptr() as *mut _, 
            &mut winapi::um::wingdi::BITMAPINFO {
                bmiHeader: winapi::um::wingdi::BITMAPINFOHEADER {
                    biSize: std::mem::size_of::<winapi::um::wingdi::BITMAPINFOHEADER>() as u32,
                    biWidth: width,
                    biHeight: height * -1,
                    biPlanes: 1,
                    biBitCount: 32,
                    ..Default::default()
                },
                ..Default::default()
            }, winapi::um::wingdi::DIB_RGB_COLORS);
        ReleaseDC(hwnd, hdc);
    }
}

你可以通过输入cargo run来运行它。

相关问题