Что нового

[Автоматизация] Как назначить принтер по умолчанию?

Vlasssov

Осваивающий
Сообщения
428
Репутация
25
Одна из автоматизируемых программ, отправляет на печать используя ТОЛЬКО принтер по умолчанию и диалог выбора принтеров в самой программе отсутствует. Очень хочется сделать нужный принтер принтером по умолчанию, а потом вернуть все обратно.
 

gilgul

Новичок
Сообщения
6
Репутация
1
rundll32 printui.dll,PrintUIEntry /y /n "имя принтера" - назначает нужный принтер по умолчанию
 

Neldezheil

B like Bee
Сообщения
27
Репутация
3
делаем 2 *.bat файла
в одном вставляем rundll32 printui.dll,PrintUIEntry /y /n "имя принтера для проги"
в другой - rundll32 printui.dll,PrintUIEntry /y /n "имя первоначального принтера"
затем в скрипте пишем
Код:
run("1.bat")
sleep xxxx ;задаем паузу для прожмакивания печати в проге,
;можно также автоматизировать путем отправки в прогу 
;hotkey для печати или нажимания кнопочки "печатать"
run("2.bat")


можно попробовать сделать через функцию _RunDos( $command), но, ругается на неверные параметры в вызове rundll32.exe
 

snoitaleR

AutoIT Гуру
Сообщения
854
Репутация
223
У меня вот так сработало...

Код:
ShellExecute("rundll32","printui.dll,PrintUIEntry /y /n PRINTER")
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 713
_WinAPI_SetDefaultPrinter() из WinAPIEx.au3 (проще уже некуда).
 

madmasles

Модератор
Глобальный модератор
Сообщения
7 790
Репутация
2 319
Vlasssov
Код:
#Include <WinAPIEx.au3>
#Include <WinAPI.au3>

$sPrinterOld = _WinAPI_GetDefaultPrinter()
$sPrinterNew = "Ваш новый принтер"
MsgBox(0, "", $sPrinterOLD)
_WinAPI_SetDefaultPrinter($sPrinterNew)
MsgBox(0, "", _WinAPI_GetDefaultPrinter())
_WinAPI_SetDefaultPrinter($sPrinterOLD)
MsgBox(0, "", _WinAPI_GetDefaultPrinter())

Yashied
,
Возможности Вашей библиотеки огромны. :thumbs_up:
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4 020
Репутация
622
OffTopic:
madmasles [?]
Yashied, Возможности Вашей библиотеки огромны.
я бы сказал, просто бездонная бочка какая-то ;D
но, не умаляя труд Yashied'a, в этом есть огромная заслуга ребят с мелкомягкого. как ни крути, это все заложено в самой винде :graduated:
 
Автор
Vlasssov

Vlasssov

Осваивающий
Сообщения
428
Репутация
25
snoitaleR сказал(а):
У меня вот так сработало...

Код:
ShellExecute("rundll32","printui.dll,PrintUIEntry /y /n PRINTER")
А вот по поиску эта функция не выводится... :'(
 

AlexVong

Новичок
Сообщения
112
Репутация
1
А можно сделать чтобы выводился список всех установленных в системе принтеров, и установить определенный из них по умолчанию?
 

WSWR

AutoIT Гуру
Сообщения
941
Репутация
361
AlexVong
http://autoit-script.ru/index.php?topic=7460.0
 

AlexVong

Новичок
Сообщения
112
Репутация
1
Нашел еще один пример:

Код:
#NoTrayIcon

$sPrinter = _GetDefaultPrinter()
ConsoleWrite("Default printer: " & $sPrinter & @CRLF)

$hPrinter = _OpenPrinter($sPrinter)
ConsoleWrite("Printer handle: " & $hPrinter & @CRLF)



; GUI...

$hGui = GUICreate("winspool.drv", 400, 200)
$hButton = GUICtrlCreateButton("Printer Properties Window", 50, 50, 140, 30)
GUISetState(@SW_SHOW)



While 1

    Switch GUIGetMsg()
        Case - 3
            ExitLoop
        Case $hButton
            _PrinterPropertiesWindow($hPrinter, $hGui)
    EndSwitch

WEnd

ConsoleWrite("Close printer: " & _ClosePrinter($hPrinter) & @CRLF)



;Functions...

Func _PrinterPropertiesWindow($hPrinter, $hOwner = 0)

    Local $a_iCall = DllCall("winspool.drv", "int", "PrinterProperties", "hwnd", $hOwner, "hwnd", $hPrinter)

    If @error Or Not $a_iCall[0] Then
        Return SetError(1, 0, "")
    EndIf

    Return SetError(0, 0, 1)

EndFunc   ;==>_PrinterPropertiesWindow



Func _OpenPrinter($sPrinterName)

    Local $a_iCall = DllCall("winspool.drv", "int", "OpenPrinterW", "wstr", $sPrinterName, "hwnd*", 0, "ptr", 0)

    If @error Or Not $a_iCall[0] Then
        Return SetError(1, 0, "")
    EndIf

    Return SetError(0, 0, $a_iCall[2])

EndFunc   ;==>_OpenPrinter



Func _ClosePrinter($hPrinter)

    Local $a_iCall = DllCall("winspool.drv", "int", "ClosePrinter", "hwnd", $hPrinter)

    If @error Or Not $a_iCall[0] Then
        Return SetError(1, 0, "")
    EndIf

    Return SetError(0, 0, 1)

EndFunc   ;==>_ClosePrinter



Func _GetDefaultPrinter()

    Local $a_iCall = DllCall("winspool.drv", "int", "GetDefaultPrinterW", "wstr", "", "dword*", 0)

    If @error Or $a_iCall[0] Then
        Return SetError(1, 0, "")
    EndIf

    Local $iBufferSize = $a_iCall[2]

    $a_iCall = DllCall("winspool.drv", "int", "GetDefaultPrinterW", "wstr", "", "dword*", $iBufferSize)

    If @error Or Not $a_iCall[0] Then
        Return SetError(1, 0, "")
    EndIf

    Return SetError(0, 0, $a_iCall[1])

EndFunc   ;==>_GetDefaultPrinter


Вот только как сделать чтобы после нажатия на кнопку не только менялся принтер по умолчанию, а также выполнялся мой код?
 
Верх