一键导入
windows-gui-manual-testing
Verify Windows desktop GUI (Qt/Avalonia/WinUI/WebView) with screenshots, video, or live inspection.
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
菜单
Verify Windows desktop GUI (Qt/Avalonia/WinUI/WebView) with screenshots, video, or live inspection.
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
基于 SOC 职业分类
Review keyboard, focus, semantics, contrast, and assistive tech.
Gate an approved phase or control-plane change: maintainability, cohesion, complexity, drift.
Advise on tradeoffs, ambiguity, cross-cutting concerns; never approve gates.
Run eligible review/QA via external provider; keep provenance.
Run eligible worker roles via external provider; keep provenance.
Coordinate approved delivery across stages, artifacts, gates, recovery, risks.
| name | windows-gui-manual-testing |
| description | Verify Windows desktop GUI (Qt/Avalonia/WinUI/WebView) with screenshots, video, or live inspection. |
Use this skill to inspect Windows desktop UI behavior visually and report concrete findings. Focus on reproducible evidence: screenshots, extracted video frames, exact control names, theme/state context, and before/after comparisons.
This is a narrow evidence-based verification specialist for Windows desktop UI, including Qt, Avalonia, WinUI/WPF, WebView/native-child, and other native or hosted Windows surfaces. Return one visual findings package with concrete observations, not codebase exploration or implementation ownership.
Hard crop gate: before using any cropped screenshot, video, or extracted frame as full-window evidence, inspect a verification frame and prove it contains the entire target window. For normal overlapped windows, the top-right close button must be visible. If any edge is clipped or the close-button anchor is missing, discard the crop and use full-desktop evidence or recalculate the rectangle before proceeding.
$analyzing-video-bugs — frame extraction, scene-change detection, and dense sampling for any video file (user-provided or captured here in step 3). Always route video evidence through that skill rather than reading raw video.$bug-hunting — broader diagnostic-logging methodology for runtime bugs whose cause is not obvious from visual evidence alone. Use when visual inspection narrowed the symptom but the underlying gate/state needs runtime confirmation.Record the environment before drawing conclusions:
system, custom, CAD, dark/light)GetDpiForWindow, plus the target process's DPI-awareness mode from GetProcessDpiAwareness or DPI_AWARENESS_CONTEXTAnalysis -> Data -> Resampling -> ModeWhen the issue is about interaction timing, note the pointer location and whether the bug happens on first open only or on every open.
Use the lightest artifact that can prove the problem:
If the user gives a local image path, Read the frame image (Read tool on Claude Code; view_image on Codex).
If the user gives a local video path, extract frames first, then inspect representative frames instead of guessing from the video description.
When the bug is animation-, timing-, or sequence-dependent, video evidence is required. The video may come from one of two sources:
The user records and shares the file themselves. Skip directly to frame analysis via $analyzing-video-bugs using the provided path.
The agent captures the video itself when no recording exists. Probe the installed ffmpeg build first with ffmpeg -hide_banner -filters | Select-String ddagrab (or grep ddagrab). Prefer the Desktop Duplication / Direct3D 11 ddagrab filter when present for hardware-composited Direct3D, OpenGL, WebView2, and Qt Rendering Hardware Interface surfaces; use the installed build's documented ddagrab input syntax. Keep gdigrab as the fallback and for window-title or region convenience.
# Full desktop, 30 fps, 10 seconds, H.264 mp4
ffmpeg -f gdigrab -draw_mouse 1 -framerate 30 -i desktop -t 10 -c:v libx264 -preset ultrafast -pix_fmt yuv420p .scratch/capture.mp4
# One-frame artifacts: use 60 fps and keep the clip short
ffmpeg -f gdigrab -draw_mouse 1 -framerate 60 -i desktop -t 9 -c:v libx264 -preset ultrafast -pix_fmt yuv420p .scratch/capture.mp4
# Specific window by title (window must be visible and named):
ffmpeg -f gdigrab -draw_mouse 0 -framerate 30 -i title="ExactWindowTitle" -t 10 -c:v libx264 -preset ultrafast -pix_fmt yuv420p .scratch/capture.mp4
# Region of screen:
ffmpeg -f gdigrab -draw_mouse 0 -framerate 30 -offset_x 100 -offset_y 100 -video_size 1280x720 -i desktop -t 10 -c:v libx264 -preset ultrafast -pix_fmt yuv420p .scratch/capture.mp4
Correct full-window capture recipe:
GetWindowRect and the virtual-screen metrics (SM_XVIRTUALSCREEN, SM_YVIRTUALSCREEN, SM_CXVIRTUALSCREEN, SM_CYVIRTUALSCREEN). On Windows with DPI scaling or extended glass/shadow bounds, also call DwmGetWindowAttribute(..., DWMWA_EXTENDED_FRAME_BOUNDS, ...) and prefer the DWM extended-frame rectangle when GetWindowRect clips the right or bottom edge.-offset_x, -offset_y, and -video_size.UI Automation preflight:
BoundingRectangle, title, process id, and title-bar button controls before choosing a crop.GetWindowRect values can crop the right side.Notes:
-draw_mouse 0 or 1 deliberately and record the choice. Hover-state evidence may need the cursor position, but the cursor can also occlude the control under test.GetWindowRect extends off the visible desktop, or if the right/bottom side of the app is outside the monitor, first move/resize/maximize the window fully into the visible desktop or capture the full desktop instead. Do not treat a partial crop as evidence for full-window behavior..scratch/ (gitignored). Frames extracted from captures live in .scratch/video-frames/ per $analyzing-video-bugs conventions.EnumWindows + GetWindowText + GetWindowRect; do not trust Get-Process.MainWindowTitle as the only locator. In PowerShell use a variable like $procId, not $pid, because $PID is read-only.GetWindowRect as virtual-screen coordinates. Compare the crop rectangle against the virtual-screen bounds, not just the primary monitor. If any side is clipped or ambiguous, move the window into a known visible rectangle before recording.ffmpeg gdigrab is unavailable (non-Windows host, restricted environment, no ffmpeg in PATH), ask the user to record with the OS's built-in tool (Game Bar via Win+G on Windows, QuickTime on macOS, GNOME Screencast on Linux) and provide the file path.Once a video file exists on disk, hand it off to $analyzing-video-bugs for the systematic ffprobe → coarse extraction → scene-change detection → dense sampling → native-resolution verification pipeline. Do not read raw video files; do not extract frames ad hoc here when the specialized skill already owns that workflow.
For combo boxes and popup lists, check these phases explicitly:
Look for:
If menus behave correctly but combo boxes do not, treat them as separate popup paths and do not assume a style-only bug.
When a control “moves under the mouse”, inspect neighboring labels and summaries, not just the clicked widget.
Specifically check for:
When stabilizing text, prefer preserving readable content over blindly truncating it. If a compact one-line summary is needed, keep the full text in a tooltip or a dedicated detail surface.
For theme-dependent bugs, check at least:
systemIf the project has an additional theme family such as CAD, check that too. A fix that only improves one theme but leaves another on a different popup path is incomplete.
For before/after or cross-theme no-change claims, use the pixel-diff method in step 8; side-by-side inspection alone cannot support a no-visual-regression PASS.
Return one findings package with the tested control path; environment (app/build, theme, actual DPI and DPI-awareness mode, window state); evidence type; concrete observations; structural-vs-cosmetic classification; theme-specificity; residual risk; and a final gate decision of PASS, REVISE, or BLOCKED. Report findings as concrete UI observations, not guesses:
popup path, relayout, text wrap, stale style path) or merely visualPrefer short cause statements like:
Popup opens in two geometry stages.Summary label changes height when the combo opens, moving the next control.System theme is still using the custom combo popup path.On REVISE or BLOCKED, file each finding in work-items/bugs/<date>-<slug>.md using the qa-engineer-owned format with found-by: windows-gui-manual-testing before returning the verdict. Cite volatile machine-local evidence by .scratch/ path and frame timestamp, but make the bug's repro steps, control path, theme, actual DPI, DPI-awareness mode, and window state sufficient to re-derive that evidence.
After a GUI fix, re-check the exact failure path first, then verify nearby regressions:
For dropdown fixes, always verify both:
For still-image before/after, theme, or no-change claims, produce a machine diff such as magick compare -metric AE before.png after.png diff.png or an ffmpeg difference blend. Mask only named legitimately volatile regions such as clocks, carets, or cursors, and report the changed-pixel count and affected regions. An eyeball-only comparison cannot establish a no-visual-regression PASS.