Skip to content

Commit 35a032d

Browse files
Merge pull request #1194 from dgruss/screenshots
Bugfix: prevent Windows from making a screenshot while we make a screenshot
2 parents f8a45d7 + c390a3e commit 35a032d

1 file changed

Lines changed: 65 additions & 1 deletion

File tree

src/menu/UDisplay.pas

Lines changed: 65 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -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

177234
constructor TDisplay.Create;
178235
begin
@@ -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}
213274
end;
214275

215276
destructor TDisplay.Destroy;
216277
begin
278+
{$IFDEF MSWINDOWS}
279+
UnregisterPrintScreenHotKey;
280+
{$ENDIF}
217281
glDeleteTextures(2, @FadeTex);
218282
inherited Destroy;
219283
end;

0 commit comments

Comments
 (0)