Figuring which printer name corresponds to which device ID

前端 未结 5 1248
没有蜡笔的小新
没有蜡笔的小新 2020-12-10 04:59

My goal is to open a printer connected via USB using the CreateFile (and then issue some WriteFiles and ReadFiles).

If the pri

5条回答
  •  青春惊慌失措
    2020-12-10 05:39

    Try this (Python code):

    import _winreg
    
    HKLM = _winreg.HKEY_LOCAL_MACHINE
    
    #------------------------------------------------------------------------------
    def getDevicePath(printerName):
        key = _winreg.OpenKey(HKLM,
            r"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Print\Printers\%s" \
            % printerName)
    
        value =_winreg.QueryValueEx(key, "Port")[0]
        assert value.startswith("USB"), \
               "Port does not start with 'USB': %s" % value
    
        printerPortNumber = int(value.replace(u"USB", u""))
    
        key = _winreg.OpenKey(HKLM,
                r"SYSTEM\CurrentControlSet\Control\DeviceClasses" \
                r"\{28d78fad-5a12-11d1-ae5b-0000f803a8c2}")
    
        idx = 0
        devicePath = None
        while True:
            try:
                subKeyName = _winreg.EnumKey(key, idx)
                subKey = _winreg.OpenKey(key, subKeyName)
    
                try:
                    subSubKey = _winreg.OpenKey(subKey, r"#\Device Parameters")
                    baseName = _winreg.QueryValueEx(subSubKey, "Base Name")[0]
                    portNumber = _winreg.QueryValueEx(subSubKey, "Port Number")[0]
                    if baseName == "USB" and portNumber == printerPortNumber:
                        devicePath = subKeyName.replace("##?#USB", r"\\?\usb")
                        break
    
                except WindowsError:
                    continue
    
                finally:
                    idx += 1
    
            except WindowsError:
                break
    
        return devicePath
    

提交回复
热议问题