4.8 KiB
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. |
|
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 ScreenofCtrl + 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,UnhookWindowsHookExbij 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
BeginInvokestarten, 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.CopyFromScreenop de fysieke rechthoek, omzetten naar een bevrorenBitmapSource(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.
StartNewSnipopent de rechthoekselectie in plaats vanms-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