From aacb8a47a57ad2e61a42e005b50a5aadad58e6d2 Mon Sep 17 00:00:00 2001 From: Max Whale Date: Thu, 14 May 2026 12:37:22 +0200 Subject: [PATCH 1/2] [pywin32] add missing pywintypes types This commit contains the following changes: - Add the missing `DEVMODEType` and `DEVMODEWType` types, these are both aliases to the `PyDEVMODEW` class. - Merge the `PyDEVMODE` and `PyDEVMODEW` classes, these are the same class in reality. - Fix the type of `TimeType.format` to include the default value for the `format` parameter. --- stubs/pywin32/_win32typing.pyi | 96 +++----------------------- stubs/pywin32/win32/lib/pywintypes.pyi | 21 ++---- stubs/pywin32/win32/win32api.pyi | 4 +- stubs/pywin32/win32/win32gui.pyi | 4 +- stubs/pywin32/win32/win32print.pyi | 6 +- 5 files changed, 23 insertions(+), 108 deletions(-) diff --git a/stubs/pywin32/_win32typing.pyi b/stubs/pywin32/_win32typing.pyi index bdcc4cd282ec..69b962e0b6e9 100644 --- a/stubs/pywin32/_win32typing.pyi +++ b/stubs/pywin32/_win32typing.pyi @@ -2,7 +2,7 @@ from _typeshed import Incomplete, Unused from collections.abc import Iterable, Sequence from typing import Literal, NoReturn, SupportsIndex, TypeAlias, final, overload -from typing_extensions import Self, deprecated, disjoint_base +from typing_extensions import Never, Self, deprecated, disjoint_base from win32.lib.pywintypes import TimeType @@ -166,7 +166,7 @@ class PRINTER_DEFAULTS: @property def pDatatype(self) -> str: ... @property - def pDevMode(self) -> PyDEVMODE: ... + def pDevMode(self) -> PyDEVMODEW: ... @property def DesiredAccess(self): ... @@ -682,91 +682,10 @@ class PyDCB: @property def fDummy2(self) -> int: ... -class PyDEVMODE: - @property - def SpecVersion(self) -> int: ... - @property - def DriverVersion(self) -> int: ... - @property - def Size(self) -> int: ... - @property - def DriverExtra(self) -> int: ... - @property - def Fields(self) -> int: ... - @property - def Orientation(self) -> int: ... - @property - def PaperSize(self) -> int: ... - @property - def PaperLength(self) -> int: ... - @property - def PaperWidth(self) -> int: ... - @property - def Position_x(self) -> int: ... - @property - def Position_y(self) -> int: ... - @property - def DisplayOrientation(self) -> int: ... - @property - def DisplayFixedOutput(self) -> int: ... - @property - def Scale(self) -> int: ... - @property - def Copies(self) -> int: ... - @property - def DefaultSource(self) -> int: ... - @property - def PrintQuality(self) -> int: ... - @property - def Color(self) -> int: ... - @property - def Duplex(self) -> int: ... - @property - def YResolution(self) -> int: ... - @property - def TTOption(self) -> int: ... - @property - def Collate(self) -> int: ... - @property - def LogPixels(self) -> int: ... - @property - def BitsPerPel(self) -> int: ... - @property - def PelsWidth(self) -> int: ... - @property - def PelsHeight(self) -> int: ... - @property - def DisplayFlags(self) -> int: ... - @property - def DisplayFrequency(self) -> int: ... - @property - def ICMMethod(self) -> int: ... - @property - def ICMIntent(self) -> int: ... - @property - def MediaType(self) -> int: ... - @property - def DitherType(self) -> int: ... - @property - def Reserved1(self) -> int: ... - @property - def Reserved2(self) -> int: ... - @property - def Nup(self) -> int: ... - @property - def PanningWidth(self) -> int: ... - @property - def PanningHeight(self) -> int: ... - @property - def DeviceName(self) -> str: ... - @property - def FormName(self) -> str: ... - @property - def DriverData(self) -> Incomplete | None: ... - def Clear(self) -> None: ... - +@disjoint_base class PyDEVMODEW: - def __init__(self, DriverExtra: int = ...) -> None: ... + def __new__(self, DriverExtra: int = 0) -> Self: ... + def Clear(self) -> None: ... SpecVersion: int DriverVersion: int @property @@ -909,12 +828,15 @@ class PyGROUP_USERS_INFO_1: class PyGdiHANDLE: ... class PyGetSignerCertificate: ... -class PyHANDLE: +@disjoint_base +class PyHANDLE: # type: ignore[type-var] + def __new__(cls, *args: Never) -> NoReturn: ... @property def handle(self) -> int: ... def Close(self) -> None: ... def close(self) -> None: ... def Detach(self) -> Self: ... + def __int__(self) -> int: ... @final class PyHDESK: diff --git a/stubs/pywin32/win32/lib/pywintypes.pyi b/stubs/pywin32/win32/lib/pywintypes.pyi index 726f7b48ab31..39bd03bcef47 100644 --- a/stubs/pywin32/win32/lib/pywintypes.pyi +++ b/stubs/pywin32/win32/lib/pywintypes.pyi @@ -3,8 +3,8 @@ from _typeshed import Incomplete from collections.abc import Sequence from datetime import datetime -from typing import ClassVar, Final, NoReturn, SupportsInt, overload -from typing_extensions import Never, deprecated, disjoint_base +from typing import ClassVar, Final, SupportsInt, overload +from typing_extensions import deprecated import _win32typing @@ -16,20 +16,13 @@ class error(Exception): class com_error(Exception): ... -@disjoint_base -class HANDLEType: # type: ignore[type-var] - def __new__(cls, *args: Never) -> NoReturn: ... - @property - def handle(self) -> int: ... - def Close(self) -> None: ... - def close(self) -> None: ... - def Detach(self) -> None: ... - def __int__(self) -> int: ... - class TimeType(datetime): # aka: PyTime, PyDateTime __name__: ClassVar[str] = "datetime" - Format = datetime.strftime + def Format(self, format: str = "%c") -> str: ... +HANDLEType = _win32typing.PyHANDLE +DEVMODEType = _win32typing.PyDEVMODEW +DEVMODEWType = _win32typing.PyDEVMODEW IIDType = _win32typing.PyIID def DosDateTimeToTime(FatDate: int, FatTime: int, /) -> TimeType: ... @@ -43,7 +36,7 @@ def ACL(bufSize: int = ..., /) -> _win32typing.PyACL: ... def SID(buffer, idAuthority, subAuthorities, bufSize=..., /) -> _win32typing.PySID: ... def SECURITY_ATTRIBUTES() -> _win32typing.PySECURITY_ATTRIBUTES: ... def SECURITY_DESCRIPTOR() -> _win32typing.PySECURITY_DESCRIPTOR: ... -def HANDLE() -> HANDLEType: ... +def HANDLE() -> _win32typing.PyHANDLE: ... def HKEY() -> _win32typing.PyHKEY: ... def WAVEFORMATEX() -> _win32typing.PyWAVEFORMATEX: ... @overload diff --git a/stubs/pywin32/win32/win32api.pyi b/stubs/pywin32/win32/win32api.pyi index e06fea623e44..2542db23e2b4 100644 --- a/stubs/pywin32/win32/win32api.pyi +++ b/stubs/pywin32/win32/win32api.pyi @@ -70,8 +70,8 @@ def InitiateSystemShutdown(computerName: str, message: str, timeOut, bForceClose def Apply(exceptionHandler, func, args, /): ... def Beep(freq, dur, /) -> None: ... def BeginUpdateResource(filename: str, delete, /) -> int: ... -def ChangeDisplaySettings(DevMode: _win32typing.PyDEVMODE, Flags, /): ... -def ChangeDisplaySettingsEx(DeviceName: str | None = ..., DevMode: _win32typing.PyDEVMODE | None = ..., Flags=...) -> int: ... +def ChangeDisplaySettings(DevMode: _win32typing.PyDEVMODEW, Flags, /): ... +def ChangeDisplaySettingsEx(DeviceName: str | None = ..., DevMode: _win32typing.PyDEVMODEW | None = ..., Flags=...) -> int: ... def ClipCursor(arg: tuple[Incomplete, Incomplete, Incomplete, Incomplete], /) -> None: ... def CloseHandle(handle: int, /) -> None: ... def CopyFile(src, dest: str, bFailOnExist: int = ..., /) -> None: ... diff --git a/stubs/pywin32/win32/win32gui.pyi b/stubs/pywin32/win32/win32gui.pyi index 7c30058dbc3c..a002f39f78f2 100644 --- a/stubs/pywin32/win32/win32gui.pyi +++ b/stubs/pywin32/win32/win32gui.pyi @@ -49,7 +49,7 @@ def PostMessage( ) -> None: ... def PostThreadMessage(threadId, message, wparam, lparam, /) -> None: ... def ReplyMessage(result, /): ... -def ResetDC(hdc: int, devmode: _win32typing.PyDEVMODE | _win32typing.PyDEVMODEW, /) -> int: ... +def ResetDC(hdc: int, devmode: _win32typing.PyDEVMODEW, /) -> int: ... def RegisterWindowMessage(name: str, /): ... def DefWindowProc( hwnd: int | None, message: int, wparam: ReadableBuffer | float | None, lparam: ReadableBuffer | float | None, / @@ -418,7 +418,7 @@ def GetClassName(hwnd: _win32typing.PyHANDLE | int | None, /) -> str | None: ... def RealGetWindowClass(hwnd: _win32typing.PyHANDLE | int | None, /) -> str | None: ... def WindowFromPoint(point: tuple[int, int], /) -> int: ... def ChildWindowFromPoint(hwndParent: int, point: tuple[Incomplete, Incomplete], /): ... -def CreateDC(Driver: str, Device: str, InitData: _win32typing.PyDEVMODE, /): ... +def CreateDC(Driver: str, Device: str, InitData: _win32typing.PyDEVMODEW, /): ... def GetSaveFileNameW( hwndOwner: int | None = ..., hInstance: int | None = ..., diff --git a/stubs/pywin32/win32/win32print.pyi b/stubs/pywin32/win32/win32print.pyi index 828d92a7178b..95a3a6896fce 100644 --- a/stubs/pywin32/win32/win32print.pyi +++ b/stubs/pywin32/win32/win32print.pyi @@ -34,8 +34,8 @@ def DocumentProperties( HWnd: int, hPrinter: _win32typing.PyPrinterHANDLE, DeviceName: str, - DevModeOutput: _win32typing.PyDEVMODE, - DevModeInput: _win32typing.PyDEVMODE, + DevModeOutput: _win32typing.PyDEVMODEW, + DevModeInput: _win32typing.PyDEVMODEW, Mode, /, ): ... @@ -49,7 +49,7 @@ def GetForm(hprinter: _win32typing.PyPrinterHANDLE, FormName: str, /) -> None: . def SetForm(hprinter: _win32typing.PyPrinterHANDLE, FormName: str, Form, /) -> None: ... def AddJob(hprinter: _win32typing.PyPrinterHANDLE, /) -> None: ... def ScheduleJob(hprinter: _win32typing.PyPrinterHANDLE, JobId, /) -> None: ... -def DeviceCapabilities(Device: str, Port: str, Capability, DEVMODE: _win32typing.PyDEVMODE | None = ..., /) -> None: ... +def DeviceCapabilities(Device: str, Port: str, Capability, DEVMODE: _win32typing.PyDEVMODEW | None = ..., /) -> None: ... def GetDeviceCaps(hdc: int, Index, /): ... def EnumMonitors(Name: str, Level, /) -> tuple[Incomplete, ...]: ... def EnumPorts(Name: str, Level, /) -> tuple[Incomplete, ...]: ... From d905216f3b985c0f6e3e8b0814e5f2f2c8daf021 Mon Sep 17 00:00:00 2001 From: Max Whale Date: Thu, 14 May 2026 12:38:01 +0200 Subject: [PATCH 2/2] [pywin32] replace Incomplete win32print types This commit audits all the types in the win32print module, replacing all `Incomplete` types with an appropriate `TypedDict`, and using overloads to reference the correct version of the type. The types for the win32print module should now be complete and accurate as far as I can tell. --- stubs/pywin32/_win32typing.pyi | 209 +++++++++++++++++++++++--- stubs/pywin32/win32/win32print.pyi | 226 ++++++++++++++++++++++++----- 2 files changed, 378 insertions(+), 57 deletions(-) diff --git a/stubs/pywin32/_win32typing.pyi b/stubs/pywin32/_win32typing.pyi index 69b962e0b6e9..11b9a507f0fc 100644 --- a/stubs/pywin32/_win32typing.pyi +++ b/stubs/pywin32/_win32typing.pyi @@ -1,8 +1,8 @@ # Not available at runtime. Contains type definitions that are otherwise not exposed and not part of a specific module. from _typeshed import Incomplete, Unused from collections.abc import Iterable, Sequence -from typing import Literal, NoReturn, SupportsIndex, TypeAlias, final, overload -from typing_extensions import Never, Self, deprecated, disjoint_base +from typing import Literal, NoReturn, SupportsIndex, TypeAlias, TypedDict, final, overload +from typing_extensions import Never, Required, Self, deprecated, disjoint_base from win32.lib.pywintypes import TimeType @@ -116,15 +116,33 @@ class DOCINFO: class ExportCallback: ... -class FORM_INFO_1: - @property - def Flags(self): ... - @property - def Name(self) -> str: ... - @property - def Size(self): ... - @property - def ImageableArea(self): ... +class PrinterExtents(TypedDict): + Length: int + Width: int + +class PrinterDpi(TypedDict): + xdpi: int + ydpi: int + +class PrinterPaperSize(TypedDict): + x: int + y: int + +class SIZEL(TypedDict): + cx: int + cy: int + +class RECTL(TypedDict): + bottom: int + left: int + right: int + top: int + +class FORM_INFO_1(TypedDict): + Flags: int + Name: str + Size: SIZEL + ImageableArea: RECTL class ImportCallback: ... @@ -162,13 +180,166 @@ class NCB: @property def Post(self): ... -class PRINTER_DEFAULTS: - @property - def pDatatype(self) -> str: ... - @property - def pDevMode(self) -> PyDEVMODEW: ... - @property - def DesiredAccess(self): ... +class PRINTER_DEFAULTS(TypedDict, total=False): + pDataType: str | None + pDevMode: PyDEVMODEW | None + DesiredAccess: Required[int] + +class PRINTER_INFO_1(TypedDict): + Flags: int + pDescription: str + pName: str + pComment: str + +PRINTER_INFO_1_TUPLE: TypeAlias = tuple[int, str, str, str] + +class PRINTER_INFO_2(TypedDict): + Attributes: int + AveragePPM: int + DefaultPriority: int + Priority: int + StartTime: int + Status: int + UntilTime: int + cJobs: int + pComment: str | None + pDatatype: str | None + pDevMode: PyDEVMODEW | None + pDriverName: str + pLocation: str | None + pParameters: str | None + pPortName: str + pPrintProcessor: str + pPrinterName: str + pSecurityDescriptor: PySECURITY_DESCRIPTOR | None + pSepFile: str | None + pServerName: str | None + pShareName: str | None + +PRINTER_INFO_2_TUPLE: TypeAlias = tuple[ + str | None, # pServerName + str, # pPrinterName + str, # pShareName + str, # pPortName + str, # pDriverName + str, # pComment + str, # pLocation + None, # (always None) + str, # pSepFile + str, # pPrintProcessor + str, # pDatatype + str, # pParameters + None, # (always None) + int, # Attributes + int, # Priority + int, # DefaultPriority + int, # StartTime + int, # UntilTime + int, # Status + int, # cJobs + int, # AveragePPM +] + +class PRINTER_INFO_3(TypedDict): + pSecurityDescriptor: PySECURITY_DESCRIPTOR + +class PRINTER_INFO_4(TypedDict): + Attributes: int + pPrinterName: str + pServerName: str | None + +class PRINTER_INFO_5(TypedDict): + Attributes: int + DeviceNotSelectedTimeout: int + TransmissionRetryTimeout: int + pPortName: str + pPrinterName: str + +class PRINTER_INFO_6(TypedDict): + Status: int + +class PRINTER_INFO_7(TypedDict): + Action: int + ObjectGUID: str | None + +class PRINTER_INFO_8_9(TypedDict): + pDevMode: PyDEVMODEW | None + +class JOB_INFO_1(TypedDict): + JobId: int + pPrinterName: str + pMachineName: str + pUserName: str + pDocument: str + pDatatype: str + pStatus: str | None + Status: int + Priority: int + Position: int + TotalPages: int + PagesPrinted: int + Submitted: TimeType + +class JOB_INFO_2(JOB_INFO_1): + pNotifyName: str + pPrintProcessor: str + pParameters: str + pDriverName: str + pDevMode: PyDEVMODEW + pSecurityDescriptor: PySECURITY_DESCRIPTOR | None + StartTime: int + UntilTime: int + Size: int + Time: int + +class JOB_INFO_3(TypedDict): + JobId: int + NextJobId: int + Reserved: int + +class DRIVER_INFO_1(TypedDict): + Name: str + +MONITOR_INFO_1: TypeAlias = DRIVER_INFO_1 +PORT_INFO_1: TypeAlias = DRIVER_INFO_1 + +class MONITOR_INFO_2(MONITOR_INFO_1): + DLLName: str + Environment: str + +class PORT_INFO_2(PORT_INFO_1): + Description: str + MonitorName: str + PortType: int + Reserved: int + +class DRIVER_INFO_2(DRIVER_INFO_1): + ConfigFile: str + DataFile: str + DriverPath: str + Environment: str + Version: int + +class DRIVER_INFO_3(DRIVER_INFO_2): + DefaultDataType: str | None + DependentFiles: list[str] + HelpFile: str | None + MonitorName: str | None + +class DRIVER_INFO_4(DRIVER_INFO_3): + PreviousNames: str | None + +class DRIVER_INFO_5(DRIVER_INFO_2): + ConfigVersion: int + DriverAttributes: int + DriverVersion: int + +class DRIVER_INFO_6(DRIVER_INFO_4): + MfgName: str + OEMUrl: str | None + Provider: str + DriverDate: TimeType + DriverVersion: int class PyACL: def Initialize(self) -> None: ... @@ -1169,7 +1340,7 @@ class PyPROFILEINFO: class PyPerfMonManager: def Close(self) -> None: ... -class PyPrinterHANDLE: ... +class PyPrinterHANDLE(PyHANDLE): ... class PyRECT: ... class PyResourceId: ... class PySCROLLINFO: ... diff --git a/stubs/pywin32/win32/win32print.pyi b/stubs/pywin32/win32/win32print.pyi index 95a3a6896fce..5a074ed5bfb1 100644 --- a/stubs/pywin32/win32/win32print.pyi +++ b/stubs/pywin32/win32/win32print.pyi @@ -1,65 +1,215 @@ -from _typeshed import Incomplete -from typing import Literal +from typing import Final, Literal, overload import _win32typing -def OpenPrinter(printer: str, Defaults: Incomplete | None = ..., /) -> _win32typing.PyPrinterHANDLE: ... -def GetPrinter(hPrinter: _win32typing.PyPrinterHANDLE, Level: int = ..., /): ... -def SetPrinter(hPrinter: _win32typing.PyPrinterHANDLE, Level, pPrinter, Command, /) -> None: ... +def OpenPrinter(printer: str, Defaults: _win32typing.PRINTER_DEFAULTS | None = None, /) -> _win32typing.PyPrinterHANDLE: ... +@overload +def GetPrinter(hPrinter: _win32typing.PyPrinterHANDLE, /) -> _win32typing.PRINTER_INFO_2_TUPLE: ... +@overload +def GetPrinter(hPrinter: _win32typing.PyPrinterHANDLE, Level: Literal[1], /) -> _win32typing.PRINTER_INFO_1: ... +@overload +def GetPrinter(hPrinter: _win32typing.PyPrinterHANDLE, Level: Literal[2], /) -> _win32typing.PRINTER_INFO_2: ... +@overload +def GetPrinter(hPrinter: _win32typing.PyPrinterHANDLE, Level: Literal[3], /) -> _win32typing.PRINTER_INFO_3: ... +@overload +def GetPrinter(hPrinter: _win32typing.PyPrinterHANDLE, Level: Literal[4], /) -> _win32typing.PRINTER_INFO_4: ... +@overload +def GetPrinter(hPrinter: _win32typing.PyPrinterHANDLE, Level: Literal[5], /) -> _win32typing.PRINTER_INFO_5: ... +@overload +def GetPrinter(hPrinter: _win32typing.PyPrinterHANDLE, Level: Literal[6], /) -> _win32typing.PRINTER_INFO_6: ... +@overload +def GetPrinter(hPrinter: _win32typing.PyPrinterHANDLE, Level: Literal[7], /) -> _win32typing.PRINTER_INFO_7: ... +@overload +def GetPrinter(hPrinter: _win32typing.PyPrinterHANDLE, Level: Literal[8, 9], /) -> _win32typing.PRINTER_INFO_8_9: ... +@overload +def SetPrinter(hPrinter: _win32typing.PyPrinterHANDLE, Level: Literal[0], pPrinter: int | None, Command: int, /) -> None: ... +@overload +def SetPrinter( + hPrinter: _win32typing.PyPrinterHANDLE, Level: Literal[2], pPrinter: _win32typing.PRINTER_INFO_2, Command: Literal[0], / +) -> None: ... +@overload +def SetPrinter( + hPrinter: _win32typing.PyPrinterHANDLE, Level: Literal[3], pPrinter: _win32typing.PRINTER_INFO_3, Command: Literal[0], / +) -> None: ... +@overload +def SetPrinter( + hPrinter: _win32typing.PyPrinterHANDLE, Level: Literal[4], pPrinter: _win32typing.PRINTER_INFO_4, Command: Literal[0], / +) -> None: ... +@overload +def SetPrinter( + hPrinter: _win32typing.PyPrinterHANDLE, Level: Literal[5], pPrinter: _win32typing.PRINTER_INFO_5, Command: Literal[0], / +) -> None: ... +@overload +def SetPrinter( + hPrinter: _win32typing.PyPrinterHANDLE, Level: Literal[6], pPrinter: _win32typing.PRINTER_INFO_6, Command: Literal[0], / +) -> None: ... +@overload +def SetPrinter( + hPrinter: _win32typing.PyPrinterHANDLE, Level: Literal[7], pPrinter: _win32typing.PRINTER_INFO_7, Command: Literal[0], / +) -> None: ... +@overload +def SetPrinter( + hPrinter: _win32typing.PyPrinterHANDLE, Level: Literal[8, 9], pPrinter: _win32typing.PRINTER_INFO_8_9, Command: Literal[0], / +) -> None: ... def ClosePrinter(hPrinter: _win32typing.PyPrinterHANDLE, /) -> None: ... -def AddPrinterConnection(printer: str, /): ... -def DeletePrinterConnection(printer: str, /): ... -def EnumPrinters(flags, name: str | None = ..., level: int = ..., /): ... +def AddPrinterConnection(printer: str, /) -> None: ... +def DeletePrinterConnection(printer: str, /) -> None: ... +@overload +def EnumPrinters( + flags: int, name: str | None = None, level: Literal[1] = 1, / +) -> tuple[_win32typing.PRINTER_INFO_1_TUPLE, ...]: ... +@overload +def EnumPrinters(flags: int, name: str | None, level: Literal[2], /) -> tuple[_win32typing.PRINTER_INFO_2, ...]: ... +@overload +def EnumPrinters(flags: int, name: str | None, level: Literal[4], /) -> tuple[_win32typing.PRINTER_INFO_4, ...]: ... +@overload +def EnumPrinters(flags: int, name: str | None, level: Literal[5], /) -> tuple[_win32typing.PRINTER_INFO_5, ...]: ... def GetDefaultPrinter() -> str: ... def GetDefaultPrinterW() -> str: ... -def SetDefaultPrinter(printer: str, /): ... -def SetDefaultPrinterW(Printer: str, /): ... +def SetDefaultPrinter(printer: str, /) -> None: ... +def SetDefaultPrinterW(Printer: str | None, /) -> None: ... def StartDocPrinter( - hprinter: _win32typing.PyPrinterHANDLE | int, level: Literal[1], tuple: tuple[str, str, str | None], / + hprinter: _win32typing.PyPrinterHANDLE, level: Literal[1], tuple: tuple[str, str | None, str | None], / ) -> int: ... -def EndDocPrinter(hPrinter: _win32typing.PyPrinterHANDLE, /): ... +def EndDocPrinter(hPrinter: _win32typing.PyPrinterHANDLE, /) -> None: ... def AbortPrinter(hPrinter: _win32typing.PyPrinterHANDLE, /) -> None: ... def StartPagePrinter(hprinter: _win32typing.PyPrinterHANDLE, /) -> None: ... def EndPagePrinter(hprinter: _win32typing.PyPrinterHANDLE, /) -> None: ... -def StartDoc(hdc: int, docinfo, /): ... +def StartDoc(hdc: int, docinfo: tuple[str, str | None, str | None, int], /) -> int: ... def EndDoc(hdc: int, /) -> None: ... def AbortDoc(hdc: int, /) -> None: ... def StartPage(hdc: int, /) -> None: ... def EndPage(hdc: int, /) -> None: ... -def WritePrinter(hprinter: int | _win32typing.PyPrinterHANDLE, buf: bytes | bytearray | memoryview, /) -> int: ... -def EnumJobs(hPrinter: _win32typing.PyPrinterHANDLE, FirstJob, NoJobs, Level=..., /): ... -def GetJob(hPrinter: _win32typing.PyPrinterHANDLE, JobID, Level: int = ..., /): ... -def SetJob(hPrinter: _win32typing.PyPrinterHANDLE, JobID, Level, JobInfo, Command, /): ... +def WritePrinter(hprinter: _win32typing.PyPrinterHANDLE, buf: bytes | bytearray | memoryview, /) -> int: ... +@overload +def EnumJobs( + hPrinter: _win32typing.PyPrinterHANDLE, FirstJob: int, NoJobs: int, Level: Literal[1] = 1, / +) -> tuple[_win32typing.JOB_INFO_1, ...]: ... +@overload +def EnumJobs( + hPrinter: _win32typing.PyPrinterHANDLE, FirstJob: int, NoJobs: int, Level: Literal[2], / +) -> tuple[_win32typing.JOB_INFO_2, ...]: ... +@overload +def EnumJobs( + hPrinter: _win32typing.PyPrinterHANDLE, FirstJob: int, NoJobs: int, Level: Literal[3], / +) -> tuple[_win32typing.JOB_INFO_3, ...]: ... +@overload +def GetJob(hPrinter: _win32typing.PyPrinterHANDLE, JobID: int, Level: Literal[1] = 1, /) -> _win32typing.JOB_INFO_1: ... +@overload +def GetJob(hPrinter: _win32typing.PyPrinterHANDLE, JobID: int, Level: Literal[2], /) -> _win32typing.JOB_INFO_2: ... +@overload +def GetJob(hPrinter: _win32typing.PyPrinterHANDLE, JobID: int, Level: Literal[3], /) -> _win32typing.JOB_INFO_3: ... +@overload +def SetJob(hPrinter: _win32typing.PyPrinterHANDLE, JobID: int, Level: Literal[0], JobInfo: None, Command: int, /) -> None: ... +@overload +def SetJob( + hPrinter: _win32typing.PyPrinterHANDLE, JobID: int, Level: Literal[1], JobInfo: _win32typing.JOB_INFO_1, Command: int, / +) -> None: ... +@overload +def SetJob( + hPrinter: _win32typing.PyPrinterHANDLE, JobID: int, Level: Literal[2], JobInfo: _win32typing.JOB_INFO_2, Command: int, / +) -> None: ... +@overload +def SetJob( + hPrinter: _win32typing.PyPrinterHANDLE, JobID: int, Level: Literal[3], JobInfo: _win32typing.JOB_INFO_3, Command: int, / +) -> None: ... def DocumentProperties( HWnd: int, hPrinter: _win32typing.PyPrinterHANDLE, DeviceName: str, DevModeOutput: _win32typing.PyDEVMODEW, DevModeInput: _win32typing.PyDEVMODEW, - Mode, + Mode: int, /, -): ... -def EnumPrintProcessors(Server: str | None = ..., Environment: str | None = ..., /) -> tuple[str, ...]: ... -def EnumPrintProcessorDatatypes(ServerName: str, PrintProcessorName: str, /) -> tuple[str, ...]: ... -def EnumPrinterDrivers(Server: str | None = ..., Environment: str | None = ..., Level=..., /) -> tuple[Incomplete, ...]: ... +) -> int: ... +def EnumPrintProcessors(Server: str | None = None, Environment: str | None = None, /) -> tuple[str, ...]: ... +def EnumPrintProcessorDatatypes(ServerName: str | None, PrintProcessorName: str, /) -> tuple[str, ...]: ... +@overload +def EnumPrinterDrivers( + Server: str | None = None, Environment: str | None = None, Level: Literal[1] = 1, / +) -> tuple[_win32typing.DRIVER_INFO_1, ...]: ... +@overload +def EnumPrinterDrivers( + Server: str | None, Environment: str | None, Level: Literal[2], / +) -> tuple[_win32typing.DRIVER_INFO_2, ...]: ... +@overload +def EnumPrinterDrivers( + Server: str | None, Environment: str | None, Level: Literal[3], / +) -> tuple[_win32typing.DRIVER_INFO_3, ...]: ... +@overload +def EnumPrinterDrivers( + Server: str | None, Environment: str | None, Level: Literal[4], / +) -> tuple[_win32typing.DRIVER_INFO_4, ...]: ... +@overload +def EnumPrinterDrivers( + Server: str | None, Environment: str | None, Level: Literal[5], / +) -> tuple[_win32typing.DRIVER_INFO_5, ...]: ... +@overload +def EnumPrinterDrivers( + Server: str | None, Environment: str | None, Level: Literal[6], / +) -> tuple[_win32typing.DRIVER_INFO_6, ...]: ... def EnumForms(hprinter: _win32typing.PyPrinterHANDLE, /) -> tuple[_win32typing.FORM_INFO_1, ...]: ... -def AddForm(hprinter: _win32typing.PyPrinterHANDLE, Form, /) -> None: ... +def AddForm(hprinter: _win32typing.PyPrinterHANDLE, Form: _win32typing.FORM_INFO_1, /) -> None: ... def DeleteForm(hprinter: _win32typing.PyPrinterHANDLE, FormName: str, /) -> None: ... -def GetForm(hprinter: _win32typing.PyPrinterHANDLE, FormName: str, /) -> None: ... -def SetForm(hprinter: _win32typing.PyPrinterHANDLE, FormName: str, Form, /) -> None: ... -def AddJob(hprinter: _win32typing.PyPrinterHANDLE, /) -> None: ... -def ScheduleJob(hprinter: _win32typing.PyPrinterHANDLE, JobId, /) -> None: ... -def DeviceCapabilities(Device: str, Port: str, Capability, DEVMODE: _win32typing.PyDEVMODEW | None = ..., /) -> None: ... -def GetDeviceCaps(hdc: int, Index, /): ... -def EnumMonitors(Name: str, Level, /) -> tuple[Incomplete, ...]: ... -def EnumPorts(Name: str, Level, /) -> tuple[Incomplete, ...]: ... -def GetPrintProcessorDirectory(Name: str, Environment: str, /) -> str: ... -def GetPrinterDriverDirectory(Name: str, Environment: str, /) -> str: ... -def AddPrinter(Name: str, Level, pPrinter, /) -> _win32typing.PyPrinterHANDLE: ... +def GetForm(hprinter: _win32typing.PyPrinterHANDLE, FormName: str, /) -> _win32typing.FORM_INFO_1: ... +def SetForm(hprinter: _win32typing.PyPrinterHANDLE, FormName: str, Form: _win32typing.FORM_INFO_1, /) -> None: ... +def AddJob(hprinter: _win32typing.PyPrinterHANDLE, /) -> tuple[str, int]: ... +def ScheduleJob(hprinter: _win32typing.PyPrinterHANDLE, JobId: int, /) -> None: ... +@overload +# DC_MINEXTENT, DC_MAXEXTENT +def DeviceCapabilities( # type: ignore[overload-overlap] + Device: str, Port: str, Capability: Literal[4, 5], DEVMODE: _win32typing.PyDEVMODEW | None = None, / +) -> _win32typing.PrinterExtents: ... +@overload +# DC_ENUMRESOLUTIONS +def DeviceCapabilities( # type: ignore[overload-overlap] + Device: str, Port: str, Capability: Literal[13], DEVMODE: _win32typing.PyDEVMODEW | None = None, / +) -> tuple[_win32typing.PrinterDpi, ...]: ... +@overload +# DC_PAPERS, DC_BINS, DC_NUP, DC_MEDIATYPES +def DeviceCapabilities( # type: ignore[overload-overlap] + Device: str, Port: str, Capability: Literal[2, 6, 33, 35], DEVMODE: _win32typing.PyDEVMODEW | None = None, / +) -> tuple[int, ...]: ... +@overload +# DC_BINNAMES, DC_FILEDEPENDENCIES, DC_PAPERNAMES, DC_PERSONALITY, DC_MEDIAREADY, DC_MEDIATYPENAMES +def DeviceCapabilities( # type: ignore[overload-overlap] + Device: str, Port: str, Capability: Literal[12, 14, 16, 25, 29, 34], DEVMODE: _win32typing.PyDEVMODEW | None = None, / +) -> tuple[str, ...]: ... +@overload +# DC_PAPERSIZE +def DeviceCapabilities( # type: ignore[overload-overlap] + Device: str, Port: str, Capability: Literal[3], DEVMODE: _win32typing.PyDEVMODEW | None = None, / +) -> tuple[_win32typing.PrinterPaperSize, ...]: ... +@overload +# DC_FIELDS, DC_DUPLEX, DC_SIZE, DC_EXTRA, DC_VERSION, DC_DRIVER, DC_TRUETYPE, DC_ORIENTATION, DC_COPIES +# DC_COLLATE, DC_PRINTRATE, DC_PRINTRATEUNIT, DC_PRINTERMEM, DC_STAPLE, DC_PRINTRATEPPM, DC_COLORDEVICE +def DeviceCapabilities( # type: ignore[overload-overlap] + Device: str, + Port: str, + Capability: Literal[1, 7, 8, 9, 10, 11, 15, 17, 18, 22, 26, 27, 28, 30, 31, 32], + DEVMODE: _win32typing.PyDEVMODEW | None = None, + /, +) -> int: ... +@overload +def DeviceCapabilities(Device: str, Port: str, Capability: int, DEVMODE: _win32typing.PyDEVMODEW | None = None, /) -> int: ... +def GetDeviceCaps(hdc: int | _win32typing.PyHANDLE, Index: int, /) -> int: ... +@overload +def EnumMonitors(Name: str | None, Level: Literal[1], /) -> tuple[_win32typing.MONITOR_INFO_1, ...]: ... +@overload +def EnumMonitors(Name: str | None, Level: Literal[2], /) -> tuple[_win32typing.MONITOR_INFO_2, ...]: ... +@overload +def EnumPorts(Name: str | None, Level: Literal[1], /) -> tuple[_win32typing.PORT_INFO_1, ...]: ... +@overload +def EnumPorts(Name: str | None, Level: Literal[2], /) -> tuple[_win32typing.PORT_INFO_2, ...]: ... +def GetPrintProcessorDirectory(Name: str | None = None, Environment: str | None = None, /) -> str: ... +def GetPrinterDriverDirectory(Name: str | None = None, Environment: str | None = None, /) -> str: ... +def AddPrinter(Name: str | None, Level: Literal[2], pPrinter: _win32typing.PRINTER_INFO_2, /) -> _win32typing.PyPrinterHANDLE: ... def DeletePrinter(hPrinter: _win32typing.PyPrinterHANDLE, /) -> None: ... -def DeletePrinterDriver(Server: str, Environment: str, DriverName: str, /) -> None: ... -def DeletePrinterDriverEx(Server: str, Environment: str, DriverName: str, DeleteFlag, VersionFlag, /) -> None: ... -def FlushPrinter(Printer: _win32typing.PyPrinterHANDLE, Buf, Sleep, /): ... +def DeletePrinterDriver(Server: str | None, Environment: str | None, DriverName: str, /) -> None: ... +def DeletePrinterDriverEx( + Server: str | None, Environment: str | None, DriverName: str, DeleteFlag: int, VersionFlag: Literal[0, 1, 2, 3], / +) -> None: ... +def FlushPrinter(Printer: _win32typing.PyPrinterHANDLE, Buf: bytes, Sleep: int, /) -> int: ... DEF_PRIORITY: int DI_APPBANDING: int @@ -165,7 +315,7 @@ PRINTER_ENUM_NETWORK: int PRINTER_ENUM_REMOTE: int PRINTER_ENUM_SHARED: int PRINTER_EXECUTE: int -PRINTER_INFO_1: int +PRINTER_INFO_1: Final = 1 PRINTER_READ: int PRINTER_STATUS_BUSY: int PRINTER_STATUS_DOOR_OPEN: int