https://github.com/h04x/win-screenshot
Take a screenshot of a specific window or entire screen on Windows platform
https://github.com/h04x/win-screenshot
capture display screen screenshot window windows
Last synced: 9 days ago
JSON representation
Take a screenshot of a specific window or entire screen on Windows platform
- Host: GitHub
- URL: https://github.com/h04x/win-screenshot
- Owner: h04x
- License: apache-2.0
- Created: 2022-05-12T18:04:03.000Z (over 3 years ago)
- Default Branch: main
- Last Pushed: 2025-11-22T08:04:34.000Z (about 2 months ago)
- Last Synced: 2025-11-22T10:19:59.332Z (about 2 months ago)
- Topics: capture, display, screen, screenshot, window, windows
- Language: Rust
- Homepage: https://crates.io/crates/win-screenshot
- Size: 71.3 KB
- Stars: 43
- Watchers: 1
- Forks: 4
- Open Issues: 1
-
Metadata Files:
- Readme: README.md
- License: LICENSE-APACHE
Awesome Lists containing this project
README
# win-screenshot
Take a screenshot of a specific window or entire screen on Windows platform
## Known Issues
`capture_window()` draws black border for some windows
If you call `capture_window()` and got `0x80070578 "invalid window handle"` make sure captured window is not minimized
## Minimum requirements
`capture_window()` uses undocumented `PW_RENDERFULLCONTENT` which first appeared in Windows 8.1
## Examples
```rust
use image::{DynamicImage, RgbaImage};
use regex::Regex;
use win_screenshot::prelude::*;
fn main() {
// Capture entire screen
let buf = capture_display().unwrap();
// Capture window by known id
let buf = capture_window(11996706).unwrap();
// Capture window if you know the exact name
let hwnd = find_window("Notepad").unwrap();
let buf = capture_window(hwnd).unwrap();
// If you don't know the exact name, try to find it
let re = Regex::new(r"Steam").unwrap();
let hwnd = window_list()
.unwrap()
.iter()
.find(|i| re.is_match(&i.window_name))
.unwrap()
.hwnd;
let buf = capture_window(hwnd).unwrap();
// convert to image and save
let img = DynamicImage::ImageRgba8(
RgbaImage::from_raw(buf.width, buf.height, buf.pixels).unwrap());
img.to_rgb8().save("screenshot.jpg").unwrap();
// Fine tuning
// BitBlt dramatically faster, often fails
// (e.g. firefox, steam, 3d accelerated windows)
let using = Using::BitBlt;
// PrintWindow much slower, much more reliable
let using = Using::PrintWindow;
// Capture client area of window
let area = Area::ClientOnly;
// Capture whole window (not supported with BitBlt)
let area = Area::Full;
// Build-in crop, faster on large windows
let crop_xy = None; //Some([100, 100]);
let crop_wh = None; //Some([300, 300]);
let buf = capture_window_ex(hwnd, using, area, crop_xy, crop_wh).unwrap();
}
```