Files
kniip/.cursor/plans/print_screen_sneltoets_27245656.plan.md
T
2026-11-07 12:19:45 +01:00

4.8 KiB
Raw Blame History

name, overview, todos, isProject
name overview todos isProject
Print Screen sneltoets Knip+ krijgt een instelbare sneltoets waarbij Print Screen gewoon gekozen kan worden. Die toets opent een eigen rechthoekselectie over het scherm; na loslaten gaat het knipsel naar de bestaande editor.
id content status
hotkey-model HotkeyGesture op AppSettings, standaard Print Screen, JSON blijft werken completed
id content status
global-hook WH_KEYBOARD_LL-haak die Print Screen ziet, inslikt en de actie op de UI-thread start completed
id content status
settings-ui Instellingenkaart om de toets te kiezen, inclusief Print Screen, Esc en wissen completed
id content status
region-overlay Per-monitor rechthoekselectie en CopyFromScreen naar de editor completed
id content status
wire-up StartNewSnip, systeemvak en opslaan van instellingen op de haak aansluiten completed
false

Print Screen als sneltoets voor eigen knipsel

Knip+ start nu het Windows Knipprogramma via ms-screenclip: (App.xaml.cs StartNewSnip). Er is geen sneltoets, en een gewone WPF-KeyDown ziet Print Screen niet: Windows eet die toets op voordat het venster hem krijgt. Daarom komt er een globale low-level toetsaanslaghaak, plus een selectievenster.

De schermafbeelding (opname, actief venster, GIF) is alleen het voorbeeld van de toets. Alleen rechthoekselectie komt erbij; ScreenRecorderLib blijft ongebruikt.

Sneltoets vastleggen

Nieuw type HotkeyGesture (Ctrl, Alt, Shift, Win + virtuele toets) op AppSettings, opgeslagen via de bestaande JSON-store. Standaard: Print Screen zonder modifiers (VK_SNAPSHOT = 0x2C). Ontbreekt het veld in een bestaand settings.json, dan geldt diezelfde standaard.

In SettingsWindow.xaml een kaart Sneltoets:

  • Knop met de huidige combinatie, bijvoorbeeld Print Screen of Ctrl + Shift + P.
  • Klikken zet de knop in luisterstand: de volgende toets (geen losse Ctrl/Alt/Shift/Win) wordt de sneltoets.
  • Print Screen komt binnen via dezelfde haak, niet via WPF, zodat de knop hem echt kan tonen.
  • Esc annuleert het kiezen. Delete of Backspace maakt de sneltoets leeg.
  • Korte toelichting: als Print Screen is gekozen, vangt Knip+ die toets af. Het Windows-knipprogramma opent dan niet óók.

Globale haak

Nieuwe GlobalHotkeyHook in src/KnipPlus/Infrastructure/, P/Invoke in NativeMethods.cs:

  • SetWindowsHookEx(WH_KEYBOARD_LL) op de UI-thread, delegate vastgehouden tegen GC, UnhookWindowsHookEx bij afsluiten.
  • Alleen key-down (WM_KEYDOWN / WM_SYSKEYDOWN), geen key-up.
  • Modifiers via GetAsyncKeyState (inclusief linker en rechter Windows-toets).
  • Bij een match: toets inslikken (niet doorgeven) en de actie met BeginInvoke starten, zodat de haak niet blokkeert.
  • Tijdens het kiezen van een sneltoets slikt de haak die toets ook in, maar start geen knipsel.

RegisterHotKey is hier niet genoeg: Windows heeft Print Screen vaak al geregistreerd, en dan faalt de registratie stil.

Rechthoekselectie

Nieuw overlayvenster per monitor (src/KnipPlus/Capture/RegionCaptureWindow.xaml). De app is al PerMonitorV2 (app.manifest).

  • Randloos, altijd bovenop, niet in de taakbalk, donkere laag over Screen.Bounds.
  • Positie en grootte in fysieke pixels via SetWindowPos, daarna de WPF-grootte uit de DPI van dát scherm, zodat een scherm op 150% niet verschuift.
  • Slepen tekent de rechthoek (uitsparing in de dimlaag plus maatlabel). Loslaten met een minimale grootte (ongeveer 3×3 px) maakt het knipsel.
  • Esc of rechtermuisknop annuleert.
  • Pixels via Graphics.CopyFromScreen op de fysieke rechthoek, omzetten naar een bevroren BitmapSource (96 DPI, Bgra32) met het bestaande patroon in PixelUtil. Het klembord blijft onaangeroerd, zodat de klembordbewaking het knipsel niet nog eens aanbiedt.

Daarna direct OpenEditor. Geen toast: de gebruiker heeft zelf geknipt.

Aansluiting

In App.xaml.cs:

  • Haak starten na het laden van de instellingen, en opnieuw zetten bij Opslaan.
  • StartNewSnip opent de rechthoekselectie in plaats van ms-screenclip:. Daarmee gebruiken de knop Nieuw en Ctrl+N in de editor dezelfde selectie.
  • Zolang de selectie open is, negeert de haak een tweede druk.

In TrayIcon.cs een menu-item Rechthoek knippen, zodat het ook zonder toets kan.

flowchart LR
    Hook[GlobalHotkeyHook]
    Settings[Instellingen]
    Overlay[RegionCaptureWindow]
    Editor[EditorWindow]
    Settings -->|opslaan| Hook
    Hook -->|"Print Screen of gekozen toets"| Overlay
    Tray[Systeemvak en Nieuw] --> Overlay
    Overlay -->|BitmapSource| Editor