Skip to content

Commit

Permalink
gh-118293: Suppress mouse cursor feedback when launching Windows proc…
Browse files Browse the repository at this point in the history
…esses with multiprocessing (GH-118315)
  • Loading branch information
tunedal committed Apr 28, 2024
1 parent f5b7e39 commit 133c1a7
Show file tree
Hide file tree
Showing 5 changed files with 71 additions and 1 deletion.
16 changes: 16 additions & 0 deletions Doc/library/subprocess.rst
Expand Up @@ -1066,6 +1066,22 @@ The :mod:`subprocess` module exposes the following constants.
Specifies that the :attr:`STARTUPINFO.wShowWindow` attribute contains
additional information.

.. data:: STARTF_FORCEONFEEDBACK

A :attr:`STARTUPINFO.dwFlags` parameter to specify that the
*Working in Background* mouse cursor will be displayed while a
process is launching. This is the default behavior for GUI
processes.

.. versionadded:: 3.13

.. data:: STARTF_FORCEOFFFEEDBACK

A :attr:`STARTUPINFO.dwFlags` parameter to specify that the mouse
cursor will not be changed when launching a process.

.. versionadded:: 3.13

.. data:: CREATE_NEW_CONSOLE

The new process has a new console, instead of inheriting its parent's
Expand Down
4 changes: 3 additions & 1 deletion Lib/multiprocessing/popen_spawn_win32.py
Expand Up @@ -3,6 +3,7 @@
import signal
import sys
import _winapi
from subprocess import STARTUPINFO, STARTF_FORCEOFFFEEDBACK

from .context import reduction, get_spawning_popen, set_spawning_popen
from . import spawn
Expand Down Expand Up @@ -74,7 +75,8 @@ def __init__(self, process_obj):
try:
hp, ht, pid, tid = _winapi.CreateProcess(
python_exe, cmd,
None, None, False, 0, env, None, None)
None, None, False, 0, env, None,
STARTUPINFO(dwFlags=STARTF_FORCEOFFFEEDBACK))
_winapi.CloseHandle(ht)
except:
_winapi.CloseHandle(rhandle)
Expand Down
2 changes: 2 additions & 0 deletions Lib/subprocess.py
Expand Up @@ -83,6 +83,7 @@
STD_INPUT_HANDLE, STD_OUTPUT_HANDLE,
STD_ERROR_HANDLE, SW_HIDE,
STARTF_USESTDHANDLES, STARTF_USESHOWWINDOW,
STARTF_FORCEONFEEDBACK, STARTF_FORCEOFFFEEDBACK,
ABOVE_NORMAL_PRIORITY_CLASS, BELOW_NORMAL_PRIORITY_CLASS,
HIGH_PRIORITY_CLASS, IDLE_PRIORITY_CLASS,
NORMAL_PRIORITY_CLASS, REALTIME_PRIORITY_CLASS,
Expand All @@ -93,6 +94,7 @@
"STD_INPUT_HANDLE", "STD_OUTPUT_HANDLE",
"STD_ERROR_HANDLE", "SW_HIDE",
"STARTF_USESTDHANDLES", "STARTF_USESHOWWINDOW",
"STARTF_FORCEONFEEDBACK", "STARTF_FORCEOFFFEEDBACK",
"STARTUPINFO",
"ABOVE_NORMAL_PRIORITY_CLASS", "BELOW_NORMAL_PRIORITY_CLASS",
"HIGH_PRIORITY_CLASS", "IDLE_PRIORITY_CLASS",
Expand Down
@@ -0,0 +1,2 @@
The ``multiprocessing`` module now passes the ``STARTF_FORCEOFFFEEDBACK``
flag when spawning processes to tell Windows not to change the mouse cursor.
48 changes: 48 additions & 0 deletions Modules/_winapi.c
Expand Up @@ -72,9 +72,45 @@
#ifndef STARTF_USESHOWWINDOW
#define STARTF_USESHOWWINDOW 0x00000001
#endif
#ifndef STARTF_USESIZE
#define STARTF_USESIZE 0x00000002
#endif
#ifndef STARTF_USEPOSITION
#define STARTF_USEPOSITION 0x00000004
#endif
#ifndef STARTF_USECOUNTCHARS
#define STARTF_USECOUNTCHARS 0x00000008
#endif
#ifndef STARTF_USEFILLATTRIBUTE
#define STARTF_USEFILLATTRIBUTE 0x00000010
#endif
#ifndef STARTF_RUNFULLSCREEN
#define STARTF_RUNFULLSCREEN 0x00000020
#endif
#ifndef STARTF_FORCEONFEEDBACK
#define STARTF_FORCEONFEEDBACK 0x00000040
#endif
#ifndef STARTF_FORCEOFFFEEDBACK
#define STARTF_FORCEOFFFEEDBACK 0x00000080
#endif
#ifndef STARTF_USESTDHANDLES
#define STARTF_USESTDHANDLES 0x00000100
#endif
#ifndef STARTF_USEHOTKEY
#define STARTF_USEHOTKEY 0x00000200
#endif
#ifndef STARTF_TITLEISLINKNAME
#define STARTF_TITLEISLINKNAME 0x00000800
#endif
#ifndef STARTF_TITLEISAPPID
#define STARTF_TITLEISAPPID 0x00001000
#endif
#ifndef STARTF_PREVENTPINNING
#define STARTF_PREVENTPINNING 0x00002000
#endif
#ifndef STARTF_UNTRUSTEDSOURCE
#define STARTF_UNTRUSTEDSOURCE 0x00008000
#endif

typedef struct {
PyTypeObject *overlapped_type;
Expand Down Expand Up @@ -3061,7 +3097,19 @@ static int winapi_exec(PyObject *m)
WINAPI_CONSTANT(F_DWORD, SEC_RESERVE);
WINAPI_CONSTANT(F_DWORD, SEC_WRITECOMBINE);
WINAPI_CONSTANT(F_DWORD, STARTF_USESHOWWINDOW);
WINAPI_CONSTANT(F_DWORD, STARTF_USESIZE);
WINAPI_CONSTANT(F_DWORD, STARTF_USEPOSITION);
WINAPI_CONSTANT(F_DWORD, STARTF_USECOUNTCHARS);
WINAPI_CONSTANT(F_DWORD, STARTF_USEFILLATTRIBUTE);
WINAPI_CONSTANT(F_DWORD, STARTF_RUNFULLSCREEN);
WINAPI_CONSTANT(F_DWORD, STARTF_FORCEONFEEDBACK);
WINAPI_CONSTANT(F_DWORD, STARTF_FORCEOFFFEEDBACK);
WINAPI_CONSTANT(F_DWORD, STARTF_USESTDHANDLES);
WINAPI_CONSTANT(F_DWORD, STARTF_USEHOTKEY);
WINAPI_CONSTANT(F_DWORD, STARTF_TITLEISLINKNAME);
WINAPI_CONSTANT(F_DWORD, STARTF_TITLEISAPPID);
WINAPI_CONSTANT(F_DWORD, STARTF_PREVENTPINNING);
WINAPI_CONSTANT(F_DWORD, STARTF_UNTRUSTEDSOURCE);
WINAPI_CONSTANT(F_DWORD, STD_INPUT_HANDLE);
WINAPI_CONSTANT(F_DWORD, STD_OUTPUT_HANDLE);
WINAPI_CONSTANT(F_DWORD, STD_ERROR_HANDLE);
Expand Down

0 comments on commit 133c1a7

Please sign in to comment.