Skip to content

Commit 133c1a7

Browse files
authored
gh-118293: Suppress mouse cursor feedback when launching Windows processes with multiprocessing (GH-118315)
1 parent f5b7e39 commit 133c1a7

File tree

5 files changed

+71
-1
lines changed

5 files changed

+71
-1
lines changed

Doc/library/subprocess.rst

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1066,6 +1066,22 @@ The :mod:`subprocess` module exposes the following constants.
10661066
Specifies that the :attr:`STARTUPINFO.wShowWindow` attribute contains
10671067
additional information.
10681068

1069+
.. data:: STARTF_FORCEONFEEDBACK
1070+
1071+
A :attr:`STARTUPINFO.dwFlags` parameter to specify that the
1072+
*Working in Background* mouse cursor will be displayed while a
1073+
process is launching. This is the default behavior for GUI
1074+
processes.
1075+
1076+
.. versionadded:: 3.13
1077+
1078+
.. data:: STARTF_FORCEOFFFEEDBACK
1079+
1080+
A :attr:`STARTUPINFO.dwFlags` parameter to specify that the mouse
1081+
cursor will not be changed when launching a process.
1082+
1083+
.. versionadded:: 3.13
1084+
10691085
.. data:: CREATE_NEW_CONSOLE
10701086

10711087
The new process has a new console, instead of inheriting its parent's

Lib/multiprocessing/popen_spawn_win32.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import signal
44
import sys
55
import _winapi
6+
from subprocess import STARTUPINFO, STARTF_FORCEOFFFEEDBACK
67

78
from .context import reduction, get_spawning_popen, set_spawning_popen
89
from . import spawn
@@ -74,7 +75,8 @@ def __init__(self, process_obj):
7475
try:
7576
hp, ht, pid, tid = _winapi.CreateProcess(
7677
python_exe, cmd,
77-
None, None, False, 0, env, None, None)
78+
None, None, False, 0, env, None,
79+
STARTUPINFO(dwFlags=STARTF_FORCEOFFFEEDBACK))
7880
_winapi.CloseHandle(ht)
7981
except:
8082
_winapi.CloseHandle(rhandle)

Lib/subprocess.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,7 @@
8383
STD_INPUT_HANDLE, STD_OUTPUT_HANDLE,
8484
STD_ERROR_HANDLE, SW_HIDE,
8585
STARTF_USESTDHANDLES, STARTF_USESHOWWINDOW,
86+
STARTF_FORCEONFEEDBACK, STARTF_FORCEOFFFEEDBACK,
8687
ABOVE_NORMAL_PRIORITY_CLASS, BELOW_NORMAL_PRIORITY_CLASS,
8788
HIGH_PRIORITY_CLASS, IDLE_PRIORITY_CLASS,
8889
NORMAL_PRIORITY_CLASS, REALTIME_PRIORITY_CLASS,
@@ -93,6 +94,7 @@
9394
"STD_INPUT_HANDLE", "STD_OUTPUT_HANDLE",
9495
"STD_ERROR_HANDLE", "SW_HIDE",
9596
"STARTF_USESTDHANDLES", "STARTF_USESHOWWINDOW",
97+
"STARTF_FORCEONFEEDBACK", "STARTF_FORCEOFFFEEDBACK",
9698
"STARTUPINFO",
9799
"ABOVE_NORMAL_PRIORITY_CLASS", "BELOW_NORMAL_PRIORITY_CLASS",
98100
"HIGH_PRIORITY_CLASS", "IDLE_PRIORITY_CLASS",
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
The ``multiprocessing`` module now passes the ``STARTF_FORCEOFFFEEDBACK``
2+
flag when spawning processes to tell Windows not to change the mouse cursor.

Modules/_winapi.c

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,9 +72,45 @@
7272
#ifndef STARTF_USESHOWWINDOW
7373
#define STARTF_USESHOWWINDOW 0x00000001
7474
#endif
75+
#ifndef STARTF_USESIZE
76+
#define STARTF_USESIZE 0x00000002
77+
#endif
78+
#ifndef STARTF_USEPOSITION
79+
#define STARTF_USEPOSITION 0x00000004
80+
#endif
81+
#ifndef STARTF_USECOUNTCHARS
82+
#define STARTF_USECOUNTCHARS 0x00000008
83+
#endif
84+
#ifndef STARTF_USEFILLATTRIBUTE
85+
#define STARTF_USEFILLATTRIBUTE 0x00000010
86+
#endif
87+
#ifndef STARTF_RUNFULLSCREEN
88+
#define STARTF_RUNFULLSCREEN 0x00000020
89+
#endif
90+
#ifndef STARTF_FORCEONFEEDBACK
91+
#define STARTF_FORCEONFEEDBACK 0x00000040
92+
#endif
93+
#ifndef STARTF_FORCEOFFFEEDBACK
94+
#define STARTF_FORCEOFFFEEDBACK 0x00000080
95+
#endif
7596
#ifndef STARTF_USESTDHANDLES
7697
#define STARTF_USESTDHANDLES 0x00000100
7798
#endif
99+
#ifndef STARTF_USEHOTKEY
100+
#define STARTF_USEHOTKEY 0x00000200
101+
#endif
102+
#ifndef STARTF_TITLEISLINKNAME
103+
#define STARTF_TITLEISLINKNAME 0x00000800
104+
#endif
105+
#ifndef STARTF_TITLEISAPPID
106+
#define STARTF_TITLEISAPPID 0x00001000
107+
#endif
108+
#ifndef STARTF_PREVENTPINNING
109+
#define STARTF_PREVENTPINNING 0x00002000
110+
#endif
111+
#ifndef STARTF_UNTRUSTEDSOURCE
112+
#define STARTF_UNTRUSTEDSOURCE 0x00008000
113+
#endif
78114

79115
typedef struct {
80116
PyTypeObject *overlapped_type;
@@ -3061,7 +3097,19 @@ static int winapi_exec(PyObject *m)
30613097
WINAPI_CONSTANT(F_DWORD, SEC_RESERVE);
30623098
WINAPI_CONSTANT(F_DWORD, SEC_WRITECOMBINE);
30633099
WINAPI_CONSTANT(F_DWORD, STARTF_USESHOWWINDOW);
3100+
WINAPI_CONSTANT(F_DWORD, STARTF_USESIZE);
3101+
WINAPI_CONSTANT(F_DWORD, STARTF_USEPOSITION);
3102+
WINAPI_CONSTANT(F_DWORD, STARTF_USECOUNTCHARS);
3103+
WINAPI_CONSTANT(F_DWORD, STARTF_USEFILLATTRIBUTE);
3104+
WINAPI_CONSTANT(F_DWORD, STARTF_RUNFULLSCREEN);
3105+
WINAPI_CONSTANT(F_DWORD, STARTF_FORCEONFEEDBACK);
3106+
WINAPI_CONSTANT(F_DWORD, STARTF_FORCEOFFFEEDBACK);
30643107
WINAPI_CONSTANT(F_DWORD, STARTF_USESTDHANDLES);
3108+
WINAPI_CONSTANT(F_DWORD, STARTF_USEHOTKEY);
3109+
WINAPI_CONSTANT(F_DWORD, STARTF_TITLEISLINKNAME);
3110+
WINAPI_CONSTANT(F_DWORD, STARTF_TITLEISAPPID);
3111+
WINAPI_CONSTANT(F_DWORD, STARTF_PREVENTPINNING);
3112+
WINAPI_CONSTANT(F_DWORD, STARTF_UNTRUSTEDSOURCE);
30653113
WINAPI_CONSTANT(F_DWORD, STD_INPUT_HANDLE);
30663114
WINAPI_CONSTANT(F_DWORD, STD_OUTPUT_HANDLE);
30673115
WINAPI_CONSTANT(F_DWORD, STD_ERROR_HANDLE);

0 commit comments

Comments
 (0)