From ed0fe6d34803c96cec1d1ad453829c3d387c9c36 Mon Sep 17 00:00:00 2001 From: Avasam Date: Wed, 16 Apr 2025 11:40:19 -0400 Subject: [PATCH 1/5] pywin32: Add win32gui._TrackMouseEvent --- stubs/pywin32/win32/win32gui.pyi | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/stubs/pywin32/win32/win32gui.pyi b/stubs/pywin32/win32/win32gui.pyi index 99e95b327887..aac2f46c604e 100644 --- a/stubs/pywin32/win32/win32gui.pyi +++ b/stubs/pywin32/win32/win32gui.pyi @@ -406,6 +406,10 @@ def IsChild(hWndParent: int, hWnd: int, /) -> int: ... def ReleaseCapture() -> None: ... def GetCapture(): ... def SetCapture() -> None: ... + +# Exists and is documented as a wrapper around TrackMouseEvent +# See https://learn.microsoft.com/en-us/windows/win32/api/commctrl/nf-commctrl-_trackmouseevent +def _TrackMouseEvent(tme: tuple[int, int, int], /) -> _win32typing.TRACKMOUSEEVENT: ... def ReleaseDC(hWnd: int | _win32typing.PyHANDLE | None, hDC: int | _win32typing.PyHANDLE | None, /) -> Literal[0, 1]: ... def CreateCaret(hWnd: int, hBitmap: _win32typing.PyGdiHANDLE, nWidth, nHeight, /) -> None: ... def DestroyCaret() -> None: ... From 4018dbdd7aad8726cdfeac40dc98e85404565613 Mon Sep 17 00:00:00 2001 From: Avasam Date: Wed, 16 Apr 2025 20:43:46 -0400 Subject: [PATCH 2/5] Add missing arg to `win32api.SetLastError` --- stubs/pywin32/win32/win32api.pyi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/stubs/pywin32/win32/win32api.pyi b/stubs/pywin32/win32/win32api.pyi index 28941dbdbb90..771f68e60b20 100644 --- a/stubs/pywin32/win32/win32api.pyi +++ b/stubs/pywin32/win32/win32api.pyi @@ -268,7 +268,7 @@ def SetCursorPos(arg: tuple[Incomplete, Incomplete], /) -> None: ... def SetDllDirectory(PathName: str, /) -> None: ... def SetErrorMode(errorMode, /): ... def SetFileAttributes(pathName: str, attrs, /): ... -def SetLastError(): ... +def SetLastError(errVal: int, /): ... def SetSysColors(Elements, RgbValues, /) -> None: ... def SetLocalTime(SystemTime: TimeType, /) -> None: ... def SetSystemTime(year, month, dayOfWeek, day, hour, minute, second, millseconds, /): ... From c10cfbb18a27be21c7b7528013bb650883fbdf2f Mon Sep 17 00:00:00 2001 From: Avasam Date: Wed, 16 Apr 2025 20:45:29 -0400 Subject: [PATCH 3/5] Revert "Add missing arg to `win32api.SetLastError`" This reverts commit 4018dbdd7aad8726cdfeac40dc98e85404565613. --- stubs/pywin32/win32/win32api.pyi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/stubs/pywin32/win32/win32api.pyi b/stubs/pywin32/win32/win32api.pyi index 771f68e60b20..28941dbdbb90 100644 --- a/stubs/pywin32/win32/win32api.pyi +++ b/stubs/pywin32/win32/win32api.pyi @@ -268,7 +268,7 @@ def SetCursorPos(arg: tuple[Incomplete, Incomplete], /) -> None: ... def SetDllDirectory(PathName: str, /) -> None: ... def SetErrorMode(errorMode, /): ... def SetFileAttributes(pathName: str, attrs, /): ... -def SetLastError(errVal: int, /): ... +def SetLastError(): ... def SetSysColors(Elements, RgbValues, /) -> None: ... def SetLocalTime(SystemTime: TimeType, /) -> None: ... def SetSystemTime(year, month, dayOfWeek, day, hour, minute, second, millseconds, /): ... From 65714a1162466fe14425c115337ea6dbce5a07af Mon Sep 17 00:00:00 2001 From: Avasam Date: Sun, 21 Dec 2025 18:32:24 -0500 Subject: [PATCH 4/5] Fix type errors in pywin32 using types-pywin32 --- stubs/pywin32/_win32typing.pyi | 7 +++++-- stubs/pywin32/pythonwin/win32ui.pyi | 2 +- stubs/pywin32/win32/win32api.pyi | 3 +++ stubs/pywin32/win32/win32event.pyi | 2 +- stubs/pywin32/win32/win32pdh.pyi | 2 +- stubs/pywin32/win32comext/shell/shell.pyi | 11 +++++++++-- 6 files changed, 20 insertions(+), 7 deletions(-) diff --git a/stubs/pywin32/_win32typing.pyi b/stubs/pywin32/_win32typing.pyi index 38d9d578b468..d4562d5c9789 100644 --- a/stubs/pywin32/_win32typing.pyi +++ b/stubs/pywin32/_win32typing.pyi @@ -921,6 +921,9 @@ class PyHANDLE: def Close(self) -> None: ... def close(self) -> None: ... def Detach(self) -> Self: ... + def __bool__(self) -> bool: ... + def __int__(self) -> int: ... + # PyHANDLE sets a lot more dunder methods, only to make them all raise with `TypeError: bad operand type` @final class PyHDESK: @@ -5138,7 +5141,7 @@ class PyCDocTemplate: ) -> None: ... def SetContainerInfo(self, _id, /) -> None: ... def SetDocStrings(self, docStrings: str, /) -> None: ... - def OpenDocumentFile(self, filename: str, bMakeVisible: int = ..., /) -> None: ... + def OpenDocumentFile(self, filename: str, bMakeVisible: int = ..., /) -> PyCDocument | None: ... class PyCDockContext: @property @@ -5868,7 +5871,7 @@ class PyCWinApp: def LoadOEMCursor(self, cursorId, /): ... def LoadIcon(self, idResource: int, /) -> int: ... def LoadStandardIcon(self, resourceName: PyResourceId, /): ... - def OpenDocumentFile(self, fileName: str, /) -> None: ... + def OpenDocumentFile(self, fileName: str, /) -> PyCDocument | None: ... def OnFileNew(self) -> None: ... def OnFileOpen(self) -> None: ... def RemoveDocTemplate(self, template: PyCDocTemplate | DocTemplate, /) -> None: ... diff --git a/stubs/pywin32/pythonwin/win32ui.pyi b/stubs/pywin32/pythonwin/win32ui.pyi index b9ea26ca26e6..dcb45cdc686a 100644 --- a/stubs/pywin32/pythonwin/win32ui.pyi +++ b/stubs/pywin32/pythonwin/win32ui.pyi @@ -97,7 +97,7 @@ def FullPath(path: str, /) -> str: ... def GetActiveWindow() -> _win32typing.PyCWnd: ... def GetApp() -> _win32typing.PyCWinApp: ... def GetAppName(): ... -def GetAppRegistryKey() -> None: ... +def GetAppRegistryKey() -> _win32typing.PyHKEY: ... def GetBytes(address, size, /) -> str: ... def GetCommandLine() -> str: ... def GetDeviceCaps(hdc, index, /): ... diff --git a/stubs/pywin32/win32/win32api.pyi b/stubs/pywin32/win32/win32api.pyi index 1577e5e95c6d..887d5f4e9460 100644 --- a/stubs/pywin32/win32/win32api.pyi +++ b/stubs/pywin32/win32/win32api.pyi @@ -77,6 +77,9 @@ def CloseHandle(handle: int, /) -> None: ... def CopyFile(src, dest: str, bFailOnExist: int = ..., /) -> None: ... def DebugBreak() -> None: ... def DeleteFile(fileName: str, /) -> None: ... +@overload +def DragQueryFile(hDrop, fileNum: Literal[-1] = -1, /) -> int: ... +@overload def DragQueryFile(hDrop, fileNum: int = ..., /) -> str: ... def DragFinish(hDrop, /) -> None: ... def DuplicateHandle( diff --git a/stubs/pywin32/win32/win32event.pyi b/stubs/pywin32/win32/win32event.pyi index c00d5e37e999..4725f8552c12 100644 --- a/stubs/pywin32/win32/win32event.pyi +++ b/stubs/pywin32/win32/win32event.pyi @@ -11,7 +11,7 @@ def CreateEvent( Name: str | None, /, ) -> int: ... -def CreateMutex(MutexAttributes: _win32typing.PySECURITY_ATTRIBUTES, InitialOwner, Name: str, /) -> int: ... +def CreateMutex(MutexAttributes: _win32typing.PySECURITY_ATTRIBUTES, InitialOwner, Name: str, /) -> _win32typing.PyHANDLE: ... def CreateSemaphore( SemaphoreAttributes: _win32typing.PySECURITY_ATTRIBUTES, InitialCount, MaximumCount, SemaphoreName, / ) -> int: ... diff --git a/stubs/pywin32/win32/win32pdh.pyi b/stubs/pywin32/win32/win32pdh.pyi index f6948b3c1bea..120565ae1a43 100644 --- a/stubs/pywin32/win32/win32pdh.pyi +++ b/stubs/pywin32/win32/win32pdh.pyi @@ -11,7 +11,7 @@ def OpenQuery(DataSource: Incomplete | None = ..., userData: int = ..., /): ... def CloseQuery(handle, /) -> None: ... def MakeCounterPath( elements: tuple[Incomplete, Incomplete, Incomplete, Incomplete, Incomplete, Incomplete], flags=..., / -) -> None: ... +) -> str: ... def GetCounterInfo(handle, bRetrieveExplainText, /) -> None: ... def GetFormattedCounterValue(handle, _format, /) -> tuple[Incomplete, Incomplete]: ... def CollectQueryData(hQuery, /) -> None: ... diff --git a/stubs/pywin32/win32comext/shell/shell.pyi b/stubs/pywin32/win32comext/shell/shell.pyi index 8b63eda438ff..2dc9f8f764b9 100644 --- a/stubs/pywin32/win32comext/shell/shell.pyi +++ b/stubs/pywin32/win32comext/shell/shell.pyi @@ -1,4 +1,5 @@ from _typeshed import Incomplete +from typing import Literal, overload from typing_extensions import TypeAlias import _win32typing @@ -8,8 +9,14 @@ error: TypeAlias = com_error # noqa: Y042 def AssocCreate() -> _win32typing.PyIQueryAssociations: ... def AssocCreateForClasses() -> _win32typing.PyIUnknown: ... -def DragQueryFile(hglobal: int, index, /) -> str: ... -def DragQueryFileW(hglobal: int, index, /) -> str: ... +@overload +def DragQueryFile(hglobal: int | _win32typing.PyHANDLE | None, index: Literal[-1] = -1, /) -> int: ... +@overload +def DragQueryFile(hglobal: int | _win32typing.PyHANDLE | None, index: int, /) -> str: ... +@overload +def DragQueryFileW(hglobal: int | _win32typing.PyHANDLE | None, index: Literal[-1] = -1, /) -> int: ... +@overload +def DragQueryFileW(hglobal: int | _win32typing.PyHANDLE | None, index: int, /) -> str: ... def DragQueryPoint(hglobal: int, /) -> tuple[Incomplete, Incomplete, Incomplete]: ... def IsUserAnAdmin() -> bool: ... def SHCreateDataObject( From 57734832c1d452da7018a1ed992ba688e00502c0 Mon Sep 17 00:00:00 2001 From: Avasam Date: Sun, 21 Dec 2025 18:51:54 -0500 Subject: [PATCH 5/5] Add type: ignore[overload-overlap] --- stubs/pywin32/win32/win32api.pyi | 4 ++-- stubs/pywin32/win32comext/shell/shell.pyi | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/stubs/pywin32/win32/win32api.pyi b/stubs/pywin32/win32/win32api.pyi index 887d5f4e9460..d90fb1ca1b3d 100644 --- a/stubs/pywin32/win32/win32api.pyi +++ b/stubs/pywin32/win32/win32api.pyi @@ -78,9 +78,9 @@ def CopyFile(src, dest: str, bFailOnExist: int = ..., /) -> None: ... def DebugBreak() -> None: ... def DeleteFile(fileName: str, /) -> None: ... @overload -def DragQueryFile(hDrop, fileNum: Literal[-1] = -1, /) -> int: ... +def DragQueryFile(hDrop, fileNum: Literal[-1] = -1, /) -> int: ... # type: ignore[overload-overlap] @overload -def DragQueryFile(hDrop, fileNum: int = ..., /) -> str: ... +def DragQueryFile(hDrop, fileNum: int, /) -> str: ... def DragFinish(hDrop, /) -> None: ... def DuplicateHandle( hSourceProcess: int, hSource: int, hTargetProcessHandle: int, desiredAccess: int, bInheritHandle: int, options: int, / diff --git a/stubs/pywin32/win32comext/shell/shell.pyi b/stubs/pywin32/win32comext/shell/shell.pyi index 2dc9f8f764b9..e853238fb05c 100644 --- a/stubs/pywin32/win32comext/shell/shell.pyi +++ b/stubs/pywin32/win32comext/shell/shell.pyi @@ -10,11 +10,11 @@ error: TypeAlias = com_error # noqa: Y042 def AssocCreate() -> _win32typing.PyIQueryAssociations: ... def AssocCreateForClasses() -> _win32typing.PyIUnknown: ... @overload -def DragQueryFile(hglobal: int | _win32typing.PyHANDLE | None, index: Literal[-1] = -1, /) -> int: ... +def DragQueryFile(hglobal: int | _win32typing.PyHANDLE | None, index: Literal[-1] = -1, /) -> int: ... # type: ignore[overload-overlap] @overload def DragQueryFile(hglobal: int | _win32typing.PyHANDLE | None, index: int, /) -> str: ... @overload -def DragQueryFileW(hglobal: int | _win32typing.PyHANDLE | None, index: Literal[-1] = -1, /) -> int: ... +def DragQueryFileW(hglobal: int | _win32typing.PyHANDLE | None, index: Literal[-1] = -1, /) -> int: ... # type: ignore[overload-overlap] @overload def DragQueryFileW(hglobal: int | _win32typing.PyHANDLE | None, index: int, /) -> str: ... def DragQueryPoint(hglobal: int, /) -> tuple[Incomplete, Incomplete, Incomplete]: ...