@@ -172,7 +172,64 @@ implementation
172172 UTexture,
173173 UTime,
174174 ULanguage,
175- UPathUtils;
175+ UPathUtils
176+ { $IFDEF MSWINDOWS}
177+ ,Windows
178+ { $ENDIF}
179+ ;
180+
181+ { $IFDEF MSWINDOWS}
182+ const
183+ PRINTSCREEN_HOTKEY_ID = 1 ;
184+ { $IFNDEF MOD_NOREPEAT}
185+ MOD_NOREPEAT = $4000 ;
186+ { $ENDIF}
187+
188+ var
189+ PrintScreenHotKeyRegistered: boolean = false;
190+ PrintScreenHookInstalled: boolean = false;
191+
192+ procedure HandlePrintScreenHotKey (Data: Pointer);
193+ begin
194+ if Assigned(Display) then
195+ Display.SaveScreenShot;
196+ end ;
197+
198+ procedure PrintScreenWindowsMessageHook (userdata, hWnd: Pointer; mesage: UInt32; wParam: UInt64; lParam: SInt64); cdecl;
199+ begin
200+ if (mesage = WM_HOTKEY) and (wParam = PRINTSCREEN_HOTKEY_ID) then
201+ begin
202+ MainThreadExec(@HandlePrintScreenHotKey, nil );
203+ end ;
204+ end ;
205+
206+ procedure RegisterPrintScreenHotKey ;
207+ begin
208+ if not PrintScreenHookInstalled then
209+ begin
210+ SDL_SetWindowsMessageHook(@PrintScreenWindowsMessageHook, nil );
211+ PrintScreenHookInstalled := true;
212+ end ;
213+
214+ if not PrintScreenHotKeyRegistered then
215+ PrintScreenHotKeyRegistered := RegisterHotKey(0 , PRINTSCREEN_HOTKEY_ID, MOD_NOREPEAT, VK_SNAPSHOT);
216+ end ;
217+
218+ procedure UnregisterPrintScreenHotKey ;
219+ begin
220+ if PrintScreenHotKeyRegistered then
221+ begin
222+ UnregisterHotKey(0 , PRINTSCREEN_HOTKEY_ID);
223+ PrintScreenHotKeyRegistered := false;
224+ end ;
225+
226+ if PrintScreenHookInstalled then
227+ begin
228+ SDL_SetWindowsMessageHook(nil , nil );
229+ PrintScreenHookInstalled := false;
230+ end ;
231+ end ;
232+ { $ENDIF}
176233
177234constructor TDisplay.Create;
178235begin
@@ -210,10 +267,17 @@ constructor TDisplay.Create;
210267 Cursor_Fade := false;
211268 Cursor_HiddenByScreen := true;
212269 Cursor_Update := false;
270+
271+ { $IFDEF MSWINDOWS}
272+ RegisterPrintScreenHotKey;
273+ { $ENDIF}
213274end ;
214275
215276destructor TDisplay.Destroy;
216277begin
278+ { $IFDEF MSWINDOWS}
279+ UnregisterPrintScreenHotKey;
280+ { $ENDIF}
217281 glDeleteTextures(2 , @FadeTex);
218282 inherited Destroy;
219283end ;
0 commit comments