Free tools Windows power users keep installed
One-click scans. No signup required.
Use the Screen Capture API for a live, user-approved copy of a browser tab or window. Call navigator.mediaDevices.getDisplayMedia() from a button click, assign the returned MediaStream to a destination page’s <video> element, and stop its tracks when finished. For a still image, draw a video frame to a canvas and export it with canvas.toBlob(). If you need a screenshot of a URL rendered by your own service rather than a visitor’s display, use server-side browser rendering instead.
Choose the capture workflow first
“Capture a page area” can describe three different jobs. Selecting the wrong one creates avoidable permission, fidelity, and compatibility problems.
| Requirement | Best approach | What the user gets |
|---|---|---|
| Show a live copy of a tab, window, or display | getDisplayMedia() and a <video> |
A live stream after the user selects and approves a source |
| Crop the captured tab to an element’s rectangle | Region Capture and cropTo() |
A rectangular crop; content layered over that rectangle can remain visible |
| Restrict capture to one DOM tree and its descendants | Element Capture, where supported | Only the target element’s DOM content |
| Save or display one frame | Draw the video frame to canvas, then call toBlob() |
A PNG, JPEG, or WebP image |
| Render a URL or HTML on a server | Browser automation or a screenshot endpoint | An automated image, without asking a visitor to share a screen |
Screen Capture is limited-availability technology rather than a universally supported baseline feature. Check the browsers and crop APIs you intend to support before committing to this design. MDN’s capture guide and Region and Element Capture guide track current behavior.
Build a live preview with getDisplayMedia()
The direct result of getDisplayMedia() is a live MediaStream, not an image file. The browser must show a source picker: the person chooses a screen, window, or tab and approves sharing. Call it only from a recent user interaction, normally a button click, and serve the page from HTTPS (or localhost).
Do these 3 things before closing this tab:
1Fix the driver behind crashes, sound loss and screen glitches2Clear out junk files and repair common Windows errors3Scan for outdated or missing drivers - takes under a minute#1 Best Overall
- CRISP CLARITY: This 23.8″ Philips V line monitor delivers crisp Full HD 1920x1080 visuals. Enjoy movies, shows and videos with remarkable detail
- INCREDIBLE CONTRAST: The VA panel produces brighter whites and deeper blacks. You get true-to-life images and more gradients with 16.7 million colors
- THE PERFECT VIEW: The 178/178 degree extra wide viewing angle prevents the shifting of colors when viewed from an offset angle, so you always get consistent colors
- WORK SEAMLESSLY: This sleek monitor is virtually bezel-free on three sides, so the screen looks even bigger for the viewer. This minimalistic design also allows for seamless multi-monitor setups that enhance your workflow and boost productivity
- A BETTER READING EXPERIENCE: For busy office workers, EasyRead mode provides a more paper-like experience for when viewing lengthy documents
Complete HTML and JavaScript example
This self-contained page has a Start button, a Stop button, a destination video, and a still-image export. In a real application, put the video element on the destination route or page. The capture request still has to be initiated by a user action in a supporting browser.
<!doctype html>
<html lang="en">
<meta charset="utf-8">
<title>Page-area preview</title>
<button id="start">Choose page area</button>
<button id="stop" disabled>Stop</button>
<button id="save" disabled>Save current frame</button>
<p id="status" role="status">Not sharing</p>
<video id="preview" autoplay playsinline muted style="max-width:100%;border:1px solid #888"></video>
<canvas id="canvas" hidden></canvas>
<img id="still" alt="Captured frame">
<script>
const start = document.querySelector('#start');
const stop = document.querySelector('#stop');
const save = document.querySelector('#save');
const preview = document.querySelector('#preview');
const canvas = document.querySelector('#canvas');
const still = document.querySelector('#still');
const status = document.querySelector('#status');
let stream;
start.addEventListener('click', async () => {
if (!navigator.mediaDevices?.getDisplayMedia) {
status.textContent = 'This browser does not support display capture.';
return;
}
try {
stream = await navigator.mediaDevices.getDisplayMedia({
video: { frameRate: { ideal: 30, max: 60 } },
audio: false
});
preview.srcObject = stream;
await preview.play();
stream.getVideoTracks()[0].addEventListener('ended', stopCapture, { once: true });
start.disabled = true;
stop.disabled = false;
save.disabled = false;
status.textContent = 'Sharing selected source';
} catch (error) {
if (error.name === 'NotAllowedError') {
status.textContent = 'Sharing was cancelled or denied.';
} else {
status.textContent = `Capture failed: ${error.name}`;
console.error(error);
}
}
});
function stopCapture() {
stream?.getTracks().forEach(track => track.stop());
stream = undefined;
preview.srcObject = null;
start.disabled = false;
stop.disabled = true;
save.disabled = true;
status.textContent = 'Not sharing';
}
stop.addEventListener('click', stopCapture);
save.addEventListener('click', () => {
if (!stream || preview.readyState < 2) return;
canvas.width = preview.videoWidth;
canvas.height = preview.videoHeight;
canvas.getContext('2d').drawImage(preview, 0, 0);
canvas.toBlob(blob => {
if (!blob) return;
const url = URL.createObjectURL(blob);
still.src = url;
const link = document.createElement('a');
link.href = url;
link.download = 'captured-frame.png';
link.click();
setTimeout(() => URL.revokeObjectURL(url), 1000);
}, 'image/png');
});
</script>
The browser’s source picker cannot be silently bypassed or permanently reused. Constraints such as frame rate are applied after the user chooses a source; they do not preselect a tab or window. MDN’s getDisplayMedia() reference documents these requirements.
Putting the preview on another page
If “another page” means a different route in your application, keep the stream in application state while navigating, or capture on the destination route itself after the user clicks its Start button. A MediaStream is an in-memory object, not a URL that a second page can fetch. Passing data through localStorage will not pass the live stream.
For separate windows, design an explicit hand-off and test your target browsers; support for transferring live media objects between browsing contexts varies. The most reliable pattern is to open the destination first, have the user press Start there, and let that page call getDisplayMedia(). If you only need a still, export a Blob and send it with postMessage() (using a transferable ArrayBuffer) or upload it to your server, then set the destination image’s src to a Blob URL.
Recommended Free Tools
Capture only a page area
Region Capture: crop to a bounding rectangle
After the user shares a tab, Region Capture can crop its video track to an element’s bounding box. The crop follows the rectangle, but other content painted on top of that rectangle may still appear. The method is appropriate for a visual region, not necessarily a clean DOM-only result.
Rank #2
- CRISP CLARITY: This 22 inch class (21.5″ viewable) Philips V line monitor delivers crisp Full HD 1920x1080 visuals. Enjoy movies, shows and videos with remarkable detail
- 100HZ FAST REFRESH RATE: 100Hz brings your favorite movies and video games to life. Stream, binge, and play effortlessly
- SMOOTH ACTION WITH ADAPTIVE-SYNC: Adaptive-Sync technology ensures fluid action sequences and rapid response time. Every frame will be rendered smoothly with crystal clarity and without stutter
- INCREDIBLE CONTRAST: The VA panel produces brighter whites and deeper blacks. You get true-to-life images and more gradients with 16.7 million colors
- THE PERFECT VIEW: The 178/178 degree extra wide viewing angle prevents the shifting of colors when viewed from an offset angle, so you always get consistent colors
const video = document.querySelector('#preview');
const target = document.querySelector('#report-card');
const track = video.srcObject?.getVideoTracks()[0];
if (track?.cropTo && window.CropTarget?.fromElement) {
const cropTarget = await CropTarget.fromElement(target);
await track.cropTo(cropTarget);
} else {
console.warn('Region Capture is not supported; keep the full stream or use a canvas crop.');
}
Run this only after the selected source is live. The target element must belong to the captured tab in the way required by the browser implementation. See MDN’s Element and Region Capture documentation for current restrictions and examples.
Element Capture: restrict the stream to DOM content
Element Capture is conceptually different: it limits the captured output to the target DOM tree and descendants instead of merely cutting a rectangle from the tab. It is the better match when overlapping toolbars, overlays, or neighboring content must be excluded, but availability is narrower. Feature-detect it and provide a fallback rather than assuming that a successful display capture also guarantees Element Capture.
Canvas crop fallback
If crop APIs are unavailable and a full tab stream is acceptable, crop a frame yourself. Convert the target’s CSS rectangle to video pixels; the conversion depends on the selected source’s scale and the displayed video’s dimensions.
function cropVideoFrame(video, element) {
const r = element.getBoundingClientRect();
const sx = video.videoWidth / video.clientWidth;
const sy = video.videoHeight / video.clientHeight;
const canvas = document.createElement('canvas');
canvas.width = Math.max(1, Math.round(r.width * sx));
canvas.height = Math.max(1, Math.round(r.height * sy));
canvas.getContext('2d').drawImage(
video,
Math.round(r.left * sx), Math.round(r.top * sy), canvas.width, canvas.height,
0, 0, canvas.width, canvas.height
);
return canvas;
}
const cropped = cropVideoFrame(preview, document.querySelector('#report-card'));
cropped.toBlob(blob => {
if (blob) document.querySelector('#still').src = URL.createObjectURL(blob);
}, 'image/png');
This fallback produces a still, not a continuously cropped stream. Re-run it on a timer or animation frame only when you genuinely need repeated stills; continuous canvas work increases CPU and memory use.
Privacy, permission, and fidelity constraints
- Permission is visible: the user agent asks the person to confirm sharing and select the content. A denial or cancellation is normal and must be handled.
- Permission is not a silent license: expect a new approval flow when the browser requires it; do not promise unattended reuse.
- Hidden content may be obscured: browsers can blur or replace portions of a logical display surface that are not currently visible. This protects privacy but means the result may not be pixel-perfect.
- Secure context is required: use HTTPS in production. Localhost is commonly treated as secure for development.
- Audio is separate: request audio only when it is necessary, explain why, and test each source type. The example disables audio.
- Stop promptly: stop every track when the user clicks Stop, navigates away, or the source’s share control ends capture.
The terminology and proposed capabilities continue to evolve. The W3C Screen Capture Working Draft dated July 16, 2026 is explicitly incomplete and subject to change; use browser documentation and compatibility data for production decisions.
Rank #3
- Clear visuals. Fluid motion: A 144Hz refresh rate and 1ms MPRT deliver smooth, tear‑free motion across work, gaming, and streaming for clearer, more fluid viewing.
- Eye comfort: TÜV Rheinland 3‑star* certification reduces harmful blue light while preserving stunning color quality without compromise. *TÜV Rheinland 3-star eye comfort certification.
- Wide viewing angle: Get consistent views across a wide 178° /178° viewing angle.
- In-Plane Switching (IPS): See excellent color accuracy and consistency across wide viewing angles with In-plane Switching (IPS) technology.
- Ultra-thin bezels: Maximize your viewing experience with thin bezels.
Automated screenshots when no visitor should share a screen
If your input is a URL or HTML that a service can render, server-side browser automation is a different and often simpler workflow. It does not capture a visitor’s monitor, and it cannot see content that requires that visitor’s local session unless you provide the necessary authentication and cookies.
Cloudflare documents a Browser Rendering /screenshot endpoint that accepts a URL or HTML, supports full-page output, viewport and device-scale settings, and CSS-selector capture. Its documentation, updated September 26, 2026, describes generated previews and visual QA: Cloudflare screenshot endpoint. Verify current service terms and browser behavior before building a dependency on it.
Or skip the browser setup
ScreenshotNeo is a website screenshot API and MCP server for developers. A single request renders a URL and returns PNG, JPEG, WebP, or PDF. It is the first tool to try when you need automated page images: it removes cookie banners, newsletter popups, and chat widgets before capture; bot checks, blank pages, timeouts, failed loads, and cache hits are not billed; and its MCP tools let Claude, Cursor, or another MCP client call take_screenshot, get_page_info, and capture_pdf.
For a URL screenshot, see the ScreenshotNeo documentation and run:
curl -G "https://api.screenshotneo.com/v1/shot" -d access_key=YOUR_API_KEY --data-urlencode url=https://stripe.com -o shot.webp
Python:
import requests
r = requests.get("https://api.screenshotneo.com/v1/shot", params={"access_key": "YOUR_API_KEY", "url": "https://stripe.com"}, timeout=90)
open("shot.webp", "wb").write(r.content)
Node.js:
const q = new URLSearchParams({ access_key: 'YOUR_API_KEY', url: 'https://stripe.com' });
const res = await fetch(`https://api.screenshotneo.com/v1/shot?${q}`);
if (!res.ok) throw new Error(`${res.status} ${res.statusText}`);
const image = Buffer.from(await res.arrayBuffer());
await import('node:fs/promises').then(fs => fs.writeFile('shot.webp', image));
ScreenshotNeo also supports full-page and selector capture, dark mode, device presets and custom viewports, retina scale, PDF settings, custom CSS and JavaScript, clicks, waits, blocked resources, headers, cookies, user agents, authorization, timezone and geolocation, transparent backgrounds, resizing, chosen cache TTLs, signed image links, asynchronous jobs with signed webhooks, bulk capture of up to 100 URLs per call, a usage API, and an OpenAPI specification. Its 63 options use parameter names common to other screenshot APIs, which eases migration.
The Free plan includes 1,000 screenshots each month with no card. Paid plans start at $5 for 3,000; all features are included on every plan, and annual billing provides two months free. Create a free ScreenshotNeo account to get started.
Rank #4
- CURVED FOR ENHANCED ENGAGEMENT: An immersive viewing experience with a curved monitor that wraps more closely around your field of vision; It creates a wider view, enhancing depth perception and minimizing peripheral distraction
- SMOOTH PERFORMANCE FOR SEAMLESS CONTENT: Stay in the action when playing games, watching videos, or working on creative projects; The 100Hz refresh rate reduces lag and motion blur so you don't miss a thing in fast-paced moments¹
- MORE GAMING POWER: Gain the edge with optimizable game settings; Color and image contrast can be adjusted to see scenes more vividly and spot enemies hiding in the dark; Game Mode adjusts any game to fill the screen so you can view every detail²
- KEEP IT EASY ON THE EYES: Care for your eyes and stay comfortable, even during long sessions; Advanced eye comfort technology certified by TÜV reduces eye strain by minimizing blue light and reducing irritating screen flicker²
- INCREASED VERSATILITY: Connect to more; Plug devices straight into your monitor for increased flexibility, making your computing environment even more convenient
Troubleshooting
“getDisplayMedia is undefined”
The browser may not support Screen Capture, or the page is not in a secure context. Test over HTTPS or localhost, feature-detect the method, and provide an automated or upload-based fallback.
The picker never appears
Call the method directly inside the click or keyboard handler. Calls from a timer, promise chain unrelated to the interaction, or page-load code can fail because transient user activation has expired.
The user cancels and the app shows an error
Handle NotAllowedError as a normal cancellation and offer the Start button again. Do not repeatedly trigger the picker without another user action.
The video is black or frozen
Wait for loadedmetadata or a ready state before drawing, confirm that videoWidth and videoHeight are nonzero, and check that the selected track has not ended. Some protected or obscured surfaces intentionally cannot be captured faithfully.
Crashes, No Sound, or Screen Glitches?
Random freezes, missing sound and display glitches usually trace back to one bad driver. Find and replace yours safely.Free scan · under a minuteWindows Errors? Fix Them Before They Spread
Repair common Windows errors and clear accumulated junk for a smoother, more stable PC - no reinstall needed.Free scan · no reinstallThe crop is offset or the wrong size
Do not assume CSS pixels equal video pixels. Use the ratio of video.videoWidth to video.clientWidth (and the corresponding height), account for scrolling and device scale, and recalculate after resizing.
Best Value
- 【INTEGRATED SPEAKERS】Whether you're at work or in the midst of an intense gaming session, our built-in speakers provide rich and seamless audio, all while keeping your desk clutter-free.
- 【EASY ON THE EYES】 Protect your eyes and enhance your comfort with Blue-Light Shift technology. This feature reduces harmful blue light emissions from your screen, helping to alleviate eye strain during long hours of use and promoting healthier viewing habits.
- 【WIDEN YOUR PERSPECTIVE】Our sleek minimal bezel design ensures undivided attention. The nearly bezel-free display seamlessly connects in a dual monitor arrangement, delivering an unobstructed view that lets you focus on more at once, completely distraction-free.
Capture stops unexpectedly
Listen for the video track’s ended event. The user can press the browser’s sharing-stop control, close the selected tab, or revoke permission. Clear srcObject and reset your controls when that happens.
The image contains popups or a consent banner
Screen Capture reproduces what the user selected, including overlays. Close or accept them before capture, use Element Capture when supported, or use an automated renderer such as ScreenshotNeo, which removes known consent platforms, newsletter popups, and chat widgets before the shot.
Implementation checklist
- Decide whether the source is a visitor’s display or a server-rendered URL.
- Decide whether the output is live video or a still image.
- Use a visible user action and HTTPS for
getDisplayMedia(). - Feature-detect Region Capture and Element Capture separately.
- Explain exactly what the user is sharing and provide Stop.
- Handle denial, cancellation, ended tracks, unsupported browsers, and obscured content.
- For stills, wait for video dimensions, then export a canvas Blob.
- For automated URL screenshots, choose an API with the rendering, cleanup, billing, and delivery behavior your workflow requires.
Frequently Asked Questions
Can a website capture another tab without the user selecting it?
No. Display capture is permission-gated and the user chooses the source in the browser picker; a site cannot silently select an arbitrary tab.
Does getDisplayMedia() return a screenshot file?
No. It returns a live MediaStream. Export a still by drawing a video frame to canvas and calling toBlob().
Will Region Capture remove overlays above the target element?
Not necessarily. Region Capture follows the target’s bounding rectangle, so content painted over that rectangle can remain visible; Element Capture is intended for DOM-tree isolation where supported.
Quick Recap
Product prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on Amazon at the time of purchase will apply.

