mirror of
https://github.com/python/cpython.git
synced 2025-11-10 10:32:04 +00:00
gh-118293: Suppress mouse cursor feedback when launching Windows processes with multiprocessing (GH-118315)
This commit is contained in:
parent
f5b7e397c0
commit
133c1a7cdb
5 changed files with 71 additions and 1 deletions
|
|
@ -1066,6 +1066,22 @@ The :mod:`subprocess` module exposes the following constants.
|
||||||
Specifies that the :attr:`STARTUPINFO.wShowWindow` attribute contains
|
Specifies that the :attr:`STARTUPINFO.wShowWindow` attribute contains
|
||||||
additional information.
|
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
|
.. data:: CREATE_NEW_CONSOLE
|
||||||
|
|
||||||
The new process has a new console, instead of inheriting its parent's
|
The new process has a new console, instead of inheriting its parent's
|
||||||
|
|
|
||||||
|
|
@ -3,6 +3,7 @@
|
||||||
import signal
|
import signal
|
||||||
import sys
|
import sys
|
||||||
import _winapi
|
import _winapi
|
||||||
|
from subprocess import STARTUPINFO, STARTF_FORCEOFFFEEDBACK
|
||||||
|
|
||||||
from .context import reduction, get_spawning_popen, set_spawning_popen
|
from .context import reduction, get_spawning_popen, set_spawning_popen
|
||||||
from . import spawn
|
from . import spawn
|
||||||
|
|
@ -74,7 +75,8 @@ def __init__(self, process_obj):
|
||||||
try:
|
try:
|
||||||
hp, ht, pid, tid = _winapi.CreateProcess(
|
hp, ht, pid, tid = _winapi.CreateProcess(
|
||||||
python_exe, cmd,
|
python_exe, cmd,
|
||||||
None, None, False, 0, env, None, None)
|
None, None, False, 0, env, None,
|
||||||
|
STARTUPINFO(dwFlags=STARTF_FORCEOFFFEEDBACK))
|
||||||
_winapi.CloseHandle(ht)
|
_winapi.CloseHandle(ht)
|
||||||
except:
|
except:
|
||||||
_winapi.CloseHandle(rhandle)
|
_winapi.CloseHandle(rhandle)
|
||||||
|
|
|
||||||
|
|
@ -83,6 +83,7 @@
|
||||||
STD_INPUT_HANDLE, STD_OUTPUT_HANDLE,
|
STD_INPUT_HANDLE, STD_OUTPUT_HANDLE,
|
||||||
STD_ERROR_HANDLE, SW_HIDE,
|
STD_ERROR_HANDLE, SW_HIDE,
|
||||||
STARTF_USESTDHANDLES, STARTF_USESHOWWINDOW,
|
STARTF_USESTDHANDLES, STARTF_USESHOWWINDOW,
|
||||||
|
STARTF_FORCEONFEEDBACK, STARTF_FORCEOFFFEEDBACK,
|
||||||
ABOVE_NORMAL_PRIORITY_CLASS, BELOW_NORMAL_PRIORITY_CLASS,
|
ABOVE_NORMAL_PRIORITY_CLASS, BELOW_NORMAL_PRIORITY_CLASS,
|
||||||
HIGH_PRIORITY_CLASS, IDLE_PRIORITY_CLASS,
|
HIGH_PRIORITY_CLASS, IDLE_PRIORITY_CLASS,
|
||||||
NORMAL_PRIORITY_CLASS, REALTIME_PRIORITY_CLASS,
|
NORMAL_PRIORITY_CLASS, REALTIME_PRIORITY_CLASS,
|
||||||
|
|
@ -93,6 +94,7 @@
|
||||||
"STD_INPUT_HANDLE", "STD_OUTPUT_HANDLE",
|
"STD_INPUT_HANDLE", "STD_OUTPUT_HANDLE",
|
||||||
"STD_ERROR_HANDLE", "SW_HIDE",
|
"STD_ERROR_HANDLE", "SW_HIDE",
|
||||||
"STARTF_USESTDHANDLES", "STARTF_USESHOWWINDOW",
|
"STARTF_USESTDHANDLES", "STARTF_USESHOWWINDOW",
|
||||||
|
"STARTF_FORCEONFEEDBACK", "STARTF_FORCEOFFFEEDBACK",
|
||||||
"STARTUPINFO",
|
"STARTUPINFO",
|
||||||
"ABOVE_NORMAL_PRIORITY_CLASS", "BELOW_NORMAL_PRIORITY_CLASS",
|
"ABOVE_NORMAL_PRIORITY_CLASS", "BELOW_NORMAL_PRIORITY_CLASS",
|
||||||
"HIGH_PRIORITY_CLASS", "IDLE_PRIORITY_CLASS",
|
"HIGH_PRIORITY_CLASS", "IDLE_PRIORITY_CLASS",
|
||||||
|
|
|
||||||
|
|
@ -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.
|
||||||
|
|
@ -72,9 +72,45 @@
|
||||||
#ifndef STARTF_USESHOWWINDOW
|
#ifndef STARTF_USESHOWWINDOW
|
||||||
#define STARTF_USESHOWWINDOW 0x00000001
|
#define STARTF_USESHOWWINDOW 0x00000001
|
||||||
#endif
|
#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
|
#ifndef STARTF_USESTDHANDLES
|
||||||
#define STARTF_USESTDHANDLES 0x00000100
|
#define STARTF_USESTDHANDLES 0x00000100
|
||||||
#endif
|
#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 {
|
typedef struct {
|
||||||
PyTypeObject *overlapped_type;
|
PyTypeObject *overlapped_type;
|
||||||
|
|
@ -3061,7 +3097,19 @@ static int winapi_exec(PyObject *m)
|
||||||
WINAPI_CONSTANT(F_DWORD, SEC_RESERVE);
|
WINAPI_CONSTANT(F_DWORD, SEC_RESERVE);
|
||||||
WINAPI_CONSTANT(F_DWORD, SEC_WRITECOMBINE);
|
WINAPI_CONSTANT(F_DWORD, SEC_WRITECOMBINE);
|
||||||
WINAPI_CONSTANT(F_DWORD, STARTF_USESHOWWINDOW);
|
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_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_INPUT_HANDLE);
|
||||||
WINAPI_CONSTANT(F_DWORD, STD_OUTPUT_HANDLE);
|
WINAPI_CONSTANT(F_DWORD, STD_OUTPUT_HANDLE);
|
||||||
WINAPI_CONSTANT(F_DWORD, STD_ERROR_HANDLE);
|
WINAPI_CONSTANT(F_DWORD, STD_ERROR_HANDLE);
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue