Add hint to optionally forcibly raise the window under MS Windows.

main
ulatekh 2022-01-07 08:54:08 -07:00 committed by Sam Lantinga
parent d7873e656b
commit 57bc90403e
2 changed files with 43 additions and 0 deletions

View File

@ -412,6 +412,19 @@ extern "C" {
*/ */
#define SDL_HINT_EVENT_LOGGING "SDL_EVENT_LOGGING" #define SDL_HINT_EVENT_LOGGING "SDL_EVENT_LOGGING"
/**
* \brief A variable controlling whether raising the window should be done more forcefully
*
* This variable can be set to the following values:
* "0" - No forcing (the default)
* "1" - Extra level of forcing
*
* At present, this is only an issue under MS Windows, which makes it nearly impossible to
* programmatically move a window to the foreground, for "security" reasons. See
* http://stackoverflow.com/a/34414846 for a discussion.
*/
#define SDL_HINT_FORCE_RAISEWINDOW "SDL_HINT_FORCE_RAISEWINDOW"
/** /**
* \brief A variable controlling how 3D acceleration is used to accelerate the SDL screen surface. * \brief A variable controlling how 3D acceleration is used to accelerate the SDL screen surface.
* *

View File

@ -573,8 +573,38 @@ WIN_HideWindow(_THIS, SDL_Window * window)
void void
WIN_RaiseWindow(_THIS, SDL_Window * window) WIN_RaiseWindow(_THIS, SDL_Window * window)
{ {
/* If desired, raise the window more forcefully.
* Technique taken from http://stackoverflow.com/questions/916259/ .
* Specifically, http://stackoverflow.com/a/34414846 .
*
* The issue is that Microsoft has gone through a lot of trouble to make it
* nearly impossible to programmatically move a window to the foreground,
* for "security" reasons. Apparently, the following song-and-dance gets
* around their objections. */
SDL_bool bForce = SDL_GetHintBoolean(SDL_HINT_FORCE_RAISEWINDOW, SDL_FALSE);
HWND hCurWnd = NULL;
DWORD dwMyID = 0u;
DWORD dwCurID = 0u;
HWND hwnd = ((SDL_WindowData *) window->driverdata)->hwnd; HWND hwnd = ((SDL_WindowData *) window->driverdata)->hwnd;
if(bForce)
{
hCurWnd = GetForegroundWindow();
dwMyID = GetCurrentThreadId();
dwCurID = GetWindowThreadProcessId(hCurWnd, NULL);
ShowWindow(hwnd, SW_RESTORE);
AttachThreadInput(dwCurID, dwMyID, TRUE);
SetWindowPos(hwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE);
SetWindowPos(hwnd, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE);
}
SetForegroundWindow(hwnd); SetForegroundWindow(hwnd);
if (bForce)
{
AttachThreadInput(dwCurID, dwMyID, FALSE);
SetFocus(hwnd);
SetActiveWindow(hwnd);
}
} }
void void