v1.3.2 — your window is not ours to make disappear
The window you were in is not ours to make disappear
Reported from real use: "when it takes control my active window goes to the background, and now and then it was even closed."
Three tools can make a window vanish — close_window closes it, claim_window moves it past every monitor, window state:minimized hides it — and none of them knew which window the person was sitting in. A window_title that matched theirs instead of ours was the whole distance between working and lost work. A fourth path was not a tool at all: Alt+F4 or Ctrl+W sent without a ref, landing on whatever happened to hold the keyboard.
The takeover already saves that window, because it has to put it back at the end. The same handle is now used for the opposite purpose: it is the one window those tools refuse to touch.
Refuse rather than warn — a warning arrives after the window is gone.
| now | |
|---|---|
| Closing, parking or minimising your window | refused. Naming that exact window_handle and confirm:true still gets through, so "close my Notepad" works. What is closed off is the accidental path |
An ambiguous window_title before something destructive |
refused, not guessed — three windows containing "Chrome" come back as three candidates with their handles |
Alt+F4 / Ctrl+W without a ref |
refused. Every other stray keystroke can be deleted again; these cannot |
| Your window did not come back to the front | said out loud on the next call, with the handle, the title and what to do |
| Watch mode | explains itself once. It skips the restore on purpose; somebody who switched it on last week only sees their window ending up behind |
The restore also gets three attempts now instead of two. A block often ends on a timer, with no reply to attach a failure to — which is how a foreground that never came back stayed invisible.
tests/test_user_window.py replays all four paths, and just as importantly the cases where nothing may be refused: another window, a named handle with confirm, outside a block. A guard that blocks correct work gets switched off, and then it is not there on the day it matters.
This is enforced by the extension, in every chat, with every client — not by instructions and not by the person.
Two downloads — take the one for your AI
| Download | For | How |
|---|---|---|
pc-screen-control.mcpb |
Claude Desktop | Settings → Extensions → Advanced → Install extension |
pc-screen-control-gpt.zip |
ChatGPT desktop, Codex, Cursor, VS Code, Cline, Zed | Extract, double-click INSTALL-FOR-GPT.bat, restart |
Same server.py, same bundled libraries, same 34 tools. Only the wrapper differs.
Install
Claude: remove the old version first (Settings → Extensions), quit Claude completely including the tray icon, install the .mcpb, start twice. Run self_test — it should report 1.3.2, all green.
ChatGPT / Codex: extract the zip, double-click INSTALL-FOR-GPT.bat, restart ChatGPT.
Needs Windows and Python 3.9+ with "Add python.exe to PATH" ticked.
Verify the downloads (optional)
pc-screen-control.mcpb
SHA-256: c961cd105f79c5ef7df004fa2973752066f169f9e688f9072e1d1fa0b842e1c8
Size: 7760433 bytes
pc-screen-control-gpt.zip
SHA-256: 41ae77de72b83b35ef44a6bf1a97554e638398e1f39dabb56b396c42a1fe510e
Size: 7666876 bytes