au3 创建打印机

发布时间:2019-09-03 08:55:16编辑:auto阅读(2017)

     #include <GUIConstants.au3>

    Opt("traymenumode", 1)
    TraySetClick(8)
    Opt("TrayAutoPause", 0)
    Opt("trayOnEventMode", 1)

    $g_szVersion = "打印机添加助手 Beta 1.0 作者:xrbenbeba"
    If WinExists($g_szVersion, "当前打印机列表") Then Exit
    AutoItWinSetTitle($g_szVersion)

    ;定义常量
    $TRAY_EVENT_PRIMARYDOUBLE = -13
    $TRAY_DISABLE = 128
    $TRAY_ENABLE = 64
    $LBS_STANDARD = 0xA00003
    $BS_FLAT = 0x8000
    $WS_CHILD = 0x40000000

    $mainwindow = GUICreate("打印机添加助手 Beta 1.0 作者:xrbenbeba ", 500, 370, @DesktopWidth / 2 - 500 / 2, @DesktopHeight / 2 - 370 / 2)


    ;创建GUI
    ;GUI当前打印机列表
    ;MsgBox(0, "注意", "1.此软件仅用于当前工作环境." & @CRLF & "2.此软件不作于商业用途以及其他不良行为." & @CRLF & "3.此软件仅用于添加标准TCP/IP端口的打印机." & @CRLF & "5.此软件不提供删除打印机的功能." & @CRLF & "6.未经制作者允许,不要传播和修改此软件." & @CRLF & "7.如有建议和问题请联系我们.")

    $InputInfo = "请正确输入机器名或IP!"
    $strComputer = InputBox("请输入", "提示:" & @CRLF & @CRLF & "1.请正确输入需要管理的机器的IP或者机" & @CRLF & "  器名." & @CRLF & @CRLF & "2.不要输入127.0.0.1的IP这样会导致出现" & @CRLF & "  无法正常选择驱动的错误!" & @CRLF & @CRLF & "3.如果不输入或者为空默认为本机." & @CRLF & @CRLF & "4.取消则退出.", $InputInfo, "", -1, 235)
    If @error = 0 Then
     If $strComputer = "" Or $strComputer = $InputInfo Then
      $objSWbemServices = ObjGet("winmgmts:\\.\root\cimv2") ;获取默认机器名
      $colSWbemObjectSet = $objSWbemServices.ExecQuery("Select * from Win32_ComputerSystem")
      For $objSWbemObject In $colSWbemObjectSet
       $strComputer = $objSWbemObject.Name
      Next
     EndIf
    Else
     Exit
    EndIf

    FileCopy(@HomeDrive & "\WINDOWS\inf\ntprint.inf", @ScriptDir & "\ntprint.ini", 1)
    $group1 = GUICtrlCreateGroup("当前打印机列表:", 10, 15, 255, 165)
    $List1 = GUICtrlCreateList("", 92, 35, 161, 135, $LBS_STANDARD)
    _PrinterCount()

    $DelPrinter = GUICtrlCreateButton("删    除", 20, 35, 68, 30, $BS_FLAT)
    $Findconfig = GUICtrlCreateButton("察看配置", 20, 68, 68, 30, $BS_FLAT)
    $CancelAllJobs = GUICtrlCreateButton("清除作业", 20, 101, 68, 30, $BS_FLAT)
    $Refresh = GUICtrlCreateButton("刷新列表", 20, 134, 68, 30, $BS_FLAT)

    ;GUI当前打印机器信息
    $group2 = GUICtrlCreateGroup("当前打印机器信息", 280, 15, 210, 165)
    GUICtrlCreateLabel("打印机IP:", 295, 35, 60, 15)
    $currentPrinterName = GUICtrlCreateInput("", 355, 32, 125, 20)
    GUICtrlCreateLabel("驱动型号:", 295, 63, 60, 15)
    $DriverName = GUICtrlCreateInput("", 355, 60, 125, 20)
    GUICtrlCreateLabel("是否默认:", 295, 91, 60, 15)
    $IsDefultPrinter = GUICtrlCreateInput("", 355, 88, 125, 20)
    GUICtrlCreateLabel("接口类型:", 295, 119, 60, 15)
    $InterfaceType = GUICtrlCreateInput("", 355, 115, 125, 20)
    $PrintTestPage = GUICtrlCreateButton("打印测试页", 295, 147, 68, 28, $BS_FLAT)
    $ResetIP = GUICtrlCreateButton("重置IP", 410, 147, 68, 28, $BS_FLAT)
    GUICtrlCreateGroup("", -99, -99, 1, 1)

    ;GUI添加打印机
    $group3 = GUICtrlCreateGroup("添加打印机", 10, 190, 255, 165)
    GUICtrlCreateLabel("打印机名:", 40, 220, 60, 15)
    $PrinterName = GUICtrlCreateInput("", 115, 215, 125, 20)
    GUICtrlCreateLabel("打印机IP:", 40, 245, 60, 15)
    $PrinterIP = GUICtrlCreateInput("", 115, 240, 125, 20)
    GUICtrlCreateLabel("驱动型号:", 40, 270, 60, 15)
    $HP = GUICtrlCreateRadio("HP", 115, 270, 50, 20)
    GUICtrlSetState(-1, $GUI_CHECKED)
    $Xerox = GUICtrlCreateRadio("Xerox", 190, 270, 50, 20)
    $FujiXerox = GUICtrlCreateRadio("Fuji Xerox", 115, 290, 60, 20)
    $AddPrinter = GUICtrlCreateButton("添加", 25, 320, 60, 30, $BS_FLAT)
    $Other = GUICtrlCreateButton("添加向导", 105, 320, 60, 30, $BS_FLAT)
    $Reset = GUICtrlCreateButton("清空", 185, 320, 60, 30, $BS_FLAT)
    GUICtrlCreateGroup("", -99, -99, 1, 1)

    ;GUI打印机驱动
    $group4 = GUICtrlCreateGroup("请选择打印机驱动", 280, 190, 210, 165)
    $List2 = GUICtrlCreateList("", 285, 215, 200, 95, $LBS_STANDARD)
    _ReadIniHP()

    GUICtrlCreateLabel("联系我们:", 290, 315, 195, 15)
    $label_url = GUICtrlCreateLabel("", 290, 330, 175, 20)
    GUICtrlSetFont(-1, 9, -1, 4)
    GUICtrlSetCursor(-1, 0)
    GUICtrlCreateGroup("", -99, -99, 1, 1)
    GUISetState(@SW_SHOW)


    ;建立托盘信息
    TraySetToolTip("打印机添加助手 Beta 1.0 作者:xrbenbeba")
    $Helpitem = TrayCreateItem("帮助")
    TrayItemSetOnEvent($Helpitem, "_Helpitem")
    TrayCreateItem("")
    $aboutitem = TrayCreateItem("关于")
    TrayItemSetOnEvent($aboutitem, "_Aboutitem")
    TrayCreateItem("")
    $exititem = TrayCreateItem("退出")
    TrayItemSetOnEvent($exititem, "_Exit")
    TraySetOnEvent($TRAY_EVENT_PRIMARYDOUBLE, "_Restore")
    TraySetState()


    $mouseon = 0 ;鼠标经过控件的标记
    While 1
     $nMsg = GUIGetMsg()
     Switch $nMsg
      Case $GUI_EVENT_CLOSE ;关闭程序
       DllCall("user32.dll", "int", "AnimateWindow", "hwnd", $mainwindow, "int", 500, "long", 0x00090000)
       Exit
       
      Case $DelPrinter ;删除
       $SetDefultPrinterName = "'" & GUICtrlRead($List1) & "'"
       _DelPrinter($SetDefultPrinterName)
       _PrinterCount()
      Case $Findconfig ;察看配置
       $SetDefultPrinterName = "'" & GUICtrlRead($List1) & "'"
       _FindConfig($SetDefultPrinterName)
      Case $ResetIP
       ;_SetIP()
       $strComputerNew = InputBox("请输入", "提示:" & @CRLF & @CRLF & "1.请正确输入需要管理的机器的IP或者机" & @CRLF & "  器名." & @CRLF & @CRLF & "2.不要输入127.0.0.1的IP这样会导致出现" & @CRLF & " 无法正常选择驱动的错误!" & @CRLF & @CRLF & "3.如果不输入或为空,默认为本机." & @CRLF & @CRLF & "4.取消不改变当前设置.", $InputInfo, "", -1, 235)
       If @error = 0 Then
        $strComputer = $strComputerNew
        If $strComputerNew = "" Or $strComputerNew = $InputInfo Then
         $objSWbemServices = ObjGet("winmgmts:\\.\root\cimv2") ;获取默认机器名
         $colSWbemObjectSet = $objSWbemServices.ExecQuery("Select * from Win32_ComputerSystem")
         For $objSWbemObject In $colSWbemObjectSet
          $strComputer = $objSWbemObject.Name
         Next
        EndIf
       EndIf
       _PrinterCount()
      Case $CancelAllJobs ;清除所有作业
       $SetDefultPrinterName = "'" & GUICtrlRead($List1) & "'"
       _CancelAllJobs($SetDefultPrinterName)
      Case $Reset ;重置(清空输入)
       GUICtrlSetData($PrinterName, "")
       GUICtrlSetData($PrinterIP, "")
      Case $HP
       _ReadIniHP()
      Case $Xerox
       _ReadIniXerox()
      Case $FujiXerox
       _ReadIniFujiXerox()
      Case $Other
       GUICtrlSetData($PrinterName, "")
       GUICtrlSetData($PrinterIP, "")
       _AddOther()
       _PrinterCount()
      Case $AddPrinter ;添加打印机
       $SetPrinterDriver = GUICtrlRead($List2)
       $SetPrinterName = GUICtrlRead($PrinterName)
       $SetPrinterIP = GUICtrlRead($PrinterIP)
       If $SetPrinterDriver <> "" And $SetPrinterName <> "" And $SetPrinterIP <> "" Then
        $Flag = MsgBox(1, "提示", "打印机名为:" & $SetPrinterName & @CRLF & "打印机IP为:" & $SetPrinterIP & @CRLF & "打印驱动为:" & $SetPrinterDriver & @CRLF & @CRLF & "确认添加?")
        If $Flag = 1 Then
         _AddPrinter()
         _PrinterCount()
        EndIf
       Else
        MsgBox(0, "警告", "IP,名称,驱动不能为空!" & @CRLF & "请重新输入!")
       EndIf
      Case $Refresh
       _PrinterCount()
      Case $PrintTestPage
       $SetDefultPrinterName = "'" & GUICtrlRead($List1) & "'"
       _PrintTestPage($SetDefultPrinterName)
     EndSwitch
     
     $mousepos = GUIGetCursorInfo($mainwindow)
     If $mousepos[4] == $label_url Then
      If $mouseon Then
       $mouseon = 0
       GUICtrlSetPos($label_url, 292, 328, 175, 20)
       GUICtrlSetColor($label_url, 0x0000FF)
      EndIf
      If $mousepos[2] Then
       RunWait(@ComSpec & ' /c Adviceforyou.msg', "", @SW_HIDE)
       Sleep(100)
      EndIf
     Else
      If Not $mouseon Then
       $mouseon = 1
       GUICtrlSetPos($label_url, 290, 330, 175, 20)
       GUICtrlSetColor($label_url, 0x000000)
      EndIf
     EndIf
    WEnd


    Func _DelPrinter($SetDefultPrinterName)
     $objWMIService = ObjGet("winmgmts:\\" & $strComputer & "\root\CIMV2")
     $colItems = $objWMIService.ExecQuery("SELECT * FROM Win32_Printer Where DeviceID = " & $SetDefultPrinterName)
     For $objNetAdapter In $colItems
      $objNetAdapter.Delete_
      MsgBox(0, "提示", "删除成功!")
     Next
    EndFunc   ;==>_DelPrinter

    Func _FindConfig($SetDefultPrinterName)
     $objWMIService = ObjGet("winmgmts:\\" & $strComputer & "\root\CIMV2")
     $colItems = $objWMIService.ExecQuery("SELECT * FROM Win32_Printer Where DeviceID = " & $SetDefultPrinterName)
     For $objNetAdapter In $colItems
      GUICtrlSetData($DriverName, $objNetAdapter.DriverName)
      If $objNetAdapter.Default = 0 Then
       GUICtrlSetData($IsDefultPrinter, "True")
      Else
       GUICtrlSetData($IsDefultPrinter, "False")
      EndIf
      If $InterfaceType = $objNetAdapter.Network Then
       GUICtrlSetData($InterfaceType, "Network Printer")
      Else
       GUICtrlSetData($InterfaceType, "Local Standard Interface")
      EndIf
      If StringUpper(StringLeft($objNetAdapter.PortName, 3)) = "IP_" Then
       GUICtrlSetData($currentPrinterName, StringTrimLeft($objNetAdapter.PortName, 3))
      Else
       GUICtrlSetData($currentPrinterName, "Local Printer")
      EndIf
     Next
    EndFunc   ;==>_FindConfig

    Func _CancelAllJobs($SetDefultPrinterName)
     $objWMIService = ObjGet("winmgmts:\\" & $strComputer & "\root\CIMV2")
     $colItems = $objWMIService.ExecQuery("SELECT * FROM Win32_Printer Where DeviceID = " & $SetDefultPrinterName)
     For $objNetAdapter In $colItems
      $objNetAdapter.CancelAllJobs()
      MsgBox(0, "提示", "清除作业成功")
     Next
    EndFunc   ;==>_CancelAllJobs

    Func _ReadIniHP()
     GUICtrlSetData($List2, "")
     $SectionNames = IniReadSection(@ScriptDir & "\ntprint.ini", "HP")
     If @error Then
      MsgBox(0, "", "发生错误,缺少标准的INI文件.")
     Else
      For $i = 1 To $SectionNames[0][0]
       $Temp1 = StringTrimLeft($SectionNames[$i][0], 1)
       $Temp2 = StringTrimRight($Temp1, 1)
       $Temp3 = StringUpper($Temp2)
       If StringLeft($Temp3, 11) = "HP LASERJET" And Not StringIsAlpha(StringMid($Temp3, 13, 1)) And StringMid($Temp3, 13, 1) <> "" Then
        GUICtrlSetData($List2, $Temp3)
       EndIf
      Next
     EndIf
    EndFunc   ;==>_ReadIniHP

    Func _ReadIniXerox()
     GUICtrlSetData($List2, "")
     $SectionNames = IniReadSection(@ScriptDir & "\ntprint.ini", "Xerox")
     If @error Then
      MsgBox(0, "", "发生错误,缺少标准的INI文件.")
     Else
      For $i = 1 To $SectionNames[0][0]
       $Temp1 = StringTrimLeft($SectionNames[$i][0], 1)
       $Temp2 = StringTrimRight($Temp1, 1)
       $Temp3 = StringUpper($Temp2)
       GUICtrlSetData($List2, $Temp3)
      Next
     EndIf
    EndFunc   ;==>_ReadIniXerox

    Func _ReadIniFujiXerox()
     GUICtrlSetData($List2, "")
     $SectionNames = IniReadSection(@ScriptDir & "\ntprint.ini", "Fuji_Xerox")
     If @error Then
      MsgBox(0, "", "发生错误,缺少标准的INI文件.")
     Else
      For $i = 1 To $SectionNames[0][0]
       $Temp1 = StringTrimLeft($SectionNames[$i][0], 1)
       $Temp2 = StringTrimRight($Temp1, 1)
       $Temp3 = StringUpper($Temp2)
       GUICtrlSetData($List2, $Temp3)
      Next
     EndIf
    EndFunc   ;==>_ReadIniFujiXerox

    Func _PrinterCount()
     GUICtrlSetData($List1, "")
     $objWMIService = ObjGet("winmgmts:\\" & $strComputer & "\root\CIMV2")
     $colItems = $objWMIService.ExecQuery("SELECT * FROM Win32_Printer")
     For $objNetAdapter In $colItems
      GUICtrlSetData($List1, $objNetAdapter.DeviceID)
     Next
    EndFunc   ;==>_PrinterCount
    Func _AddPrinter()
     ProgressOn("处理中,请稍候...", "", "", -1, -1, 2 + 16)
     ProgressSet(0, "已完成 0%", "正在创建变量...")
     Sleep(300)
     $Patch = "\\" & $strComputer & "\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Monitors\Standard TCP/IP Port\Ports\"
     $Patch001 = "\\" & $strComputer & "\HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Print\Monitors\Standard TCP/IP Port\Ports\"
     $i = 1
     $s = ""
     ProgressSet(10, "已完成 10%", "正在检测端口信息...")
     Sleep(300)
     Do
      $Var = RegEnumKey($Patch, $i)
      $i = $i + 1
      $s = $s & $Var & "/"
      ProgressSet(10 + $i, "已完成 " & 10 + $i & "%", "正在检测端口信息...")
      Sleep(300)
     Until StringLeft($Var, 3) <> "IP_"

     $x = StringInStr($s, "IP_" & $SetPrinterIP)

     $PortName = "IP_" & $SetPrinterIP
     $NewPatch = $Patch & $PortName
     $NewPatch001 = $Patch001 & $PortName
     ProgressSet(30, "已完成 30%", "正在检测端口是否存在...")
     Sleep(300)
     If $x = 0 Then
      ProgressSet(40, "已完成 40%", "端口不存在,在正在创建端口...")
      Sleep(300)
      RegWrite($NewPatch)
      RegWrite($NewPatch, "Protocol", "REG_DWORD", "00000001")
      RegWrite($NewPatch, "Version", "REG_DWORD", "00000001")
      RegWrite($NewPatch, "HostName", "REG_SZ", "")
      RegWrite($NewPatch, "IPAddress", "REG_SZ", $SetPrinterIP)
      RegWrite($NewPatch, "HWAddress", "REG_SZ", "")
      RegWrite($NewPatch, "PortNumber", "REG_DWORD", "9100")
      RegWrite($NewPatch, "SNMP Community", "REG_SZ", "public")
      RegWrite($NewPatch, "SNMP Enabled", "REG_DWORD", "00000001")
      RegWrite($NewPatch, "SNMP Index", "REG_DWORD", "00000001")
      ProgressSet(60, "已完成 60%", "端口不存在,正在创建端口...")
      Sleep(300)
      RegWrite($NewPatch001)
      RegWrite($NewPatch001, "Protocol", "REG_DWORD", "00000001")
      RegWrite($NewPatch001, "Version", "REG_DWORD", "00000001")
      RegWrite($NewPatch001, "HostName", "REG_SZ", "")
      RegWrite($NewPatch001, "IPAddress", "REG_SZ", $SetPrinterIP)
      RegWrite($NewPatch001, "HWAddress", "REG_SZ", "")
      RegWrite($NewPatch001, "PortNumber", "REG_DWORD", "9100")
      RegWrite($NewPatch001, "SNMP Community", "REG_SZ", "public")
      RegWrite($NewPatch001, "SNMP Enabled", "REG_DWORD", "00000001")
      RegWrite($NewPatch001, "SNMP Index", "REG_DWORD", "00000001")
      ProgressSet(70, "已完成 70%", "正在停止打印服务...")
      RunWait(@ComSpec & " /c sc \\" & $strComputer & " stop spooler", "", @SW_HIDE)
      ProgressSet(75, "已完成 80%", "正在启动打印服务...")
      RunWait(@ComSpec & " /c sc \\" & $strComputer & " start spooler", "", @SW_HIDE)
      ProgressSet(80, "已完成 80%", "准备添加打印机...")
      Sleep(300)
     Else
      ProgressSet(60, "已完成 60%", "端口已经存在,准备添加打印机...")
      Sleep(300)
     EndIf
     ProgressSet(90, "已完成 90%", "正在添加打印机...")
     RunWait(@ComSpec & ' /c rundll32 printui.dll,PrintUIEntry /if /b "' & $SetPrinterName & '" /c \\'& $strComputer & ' /f %windir%\inf\ntprint.inf /r "' & $PortName & '" /m "' & $SetPrinterDriver & '"', "", @SW_HIDE)
     ;MsgBox (0,"注意","添加打印机完毕!")
     Sleep(300)
     ProgressSet(100, "已完成 100%", "添加打印机完毕!")
     ProgressOff()
     MsgBox(0, "", "添加完毕!")
    EndFunc   ;==>_AddPrinter

    Func _PrintTestPage($SetDefultPrinterName)
     $objWMIService = ObjGet("winmgmts:\\" & $strComputer & "\root\CIMV2")
     $colItems = $objWMIService.ExecQuery("SELECT * FROM Win32_Printer Where DeviceID = " & $SetDefultPrinterName)
     For $objNetAdapter In $colItems
      $objNetAdapter.PrintTestPage()
      MsgBox(0, "提示", "请检查是否打印成功!")
     Next
    EndFunc   ;==>_PrintTestPage


    Func _AddOther()
     RunWait(@ComSpec & " /c rundll32 printui.dll,PrintUIEntry /il /c \\" & $strComputer, "", @SW_HIDE)
    EndFunc   ;==>_AddOther

    Func _Exit() ;托盘退出事件
     DllCall("user32.dll", "int", "AnimateWindow", "hwnd", $mainwindow, "int", 500, "long", 0x00090000)
     Exit
    EndFunc   ;==>_Exit

    Func _Helpitem() ;托盘帮助事件
     ShellExecute(@ScriptDir & "\readme.txt", @SW_MAXIMIZE)
    EndFunc   ;==>_Helpitem

    Func _Aboutitem() ;托盘关于事件
     MsgBox(0, "关于", "xrbenbeba制作" & @CRLF & @CRLF & "")
    EndFunc   ;==>_Aboutitem

    Func _Restore() ;托盘双击事件
     WinSetState($mainwindow, "", @SW_SHOW)
     WinSetState($mainwindow, "", @SW_RESTORE)
    EndFunc   ;==>_Restore

     

关键字