powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Изменение настроек принтера "по умолчанию"
13 сообщений из 13, страница 1 из 1
Изменение настроек принтера "по умолчанию"
    #33010086
IMOL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Подскажите, как можно при старте программы автоматически, без вызова диалоговых окон, у принтера "по умолчанию" установить (изменить) необходимый формат бумаги и лоток.
...
Рейтинг: 0 / 0
Изменение настроек принтера "по умолчанию"
    #33012797
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
См. объект Printer
...
Рейтинг: 0 / 0
Изменение настроек принтера "по умолчанию"
    #33013949
IMOL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Наверное мой вопрос немного некорректен. Мне необходимо, чтобы у "принтера по умолчанию" реально изменялся формат бумаги. Т.е, чтобы после завершения работы программы на принтере был установлен заданный формат. Да, программа работает под Win 2000.
...
Рейтинг: 0 / 0
Изменение настроек принтера "по умолчанию"
    #33014091
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В таком случае пошарь в реестре на предмет ключей, в которых хранятся настройки.
...
Рейтинг: 0 / 0
Изменение настроек принтера "по умолчанию"
    #33019712
kLeon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Совет насчет "пошарить в реестре" неудачен. Все настройки принтера хронятся в глобальной бинарной структуре DEVMODE. Шарить в ней - гиблое дело. Сам хотел бы найти способ. С DEVMODE работает функция PrintDlg. Попробуй освоить, может что и выйдет.
...
Рейтинг: 0 / 0
Изменение настроек принтера "по умолчанию"
    #33020116
IMOL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Самое веселое, что я "шарюсь" в реестре по настоящее время с нулевым результатом.
...
Рейтинг: 0 / 0
Изменение настроек принтера "по умолчанию"
    #33020802
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 kLeon:
То есть содержимое DEVMODE содержится в реестре в формате DWORD?
...
Рейтинг: 0 / 0
Изменение настроек принтера "по умолчанию"
    #33022437
IMOL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Переменная DevMode представляет собой структуру объемом 1172 байта (по крайней мере в моем реестре). При этом у некоторых принтеров эта переменная отсутствует.
...
Рейтинг: 0 / 0
Изменение настроек принтера "по умолчанию"
    #33022841
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
большинство принтеров позволяют выставлять размер бумаги непосредственно только перед печатью через соответствующий диалог настроек драйвера принтера, который может быть вызван, как было указано ранее, через вызов API PrintDlg с использованием DEVMODE
И эта настройка будет активно, как правило, в течении работы программы, которая вызвала данный диалог.
Не всегда можно установить настройки ориентации страницы для дефолтного принтера для всей системы вцелом. См. документацию по своему принтеру.
...
Рейтинг: 0 / 0
Изменение настроек принтера "по умолчанию"
    #33022900
Фотография PA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот простая тестовая программулька для установки размера бумаги дефолтного принтера:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
Sub SetPaperSize()
    Dim dm As DEVMODE
    Dim pDef As PRINTER_DEFAULTS
    Dim result As Long
    Dim strPrinter As String
    Dim hPrinter As Long
    Dim buffSize As Long
    Dim devmode_data() As Byte
    Dim pcbNeeded As Long
    Dim pInfo As PRINTER_INFO_2
    Dim printerinfo_data() As Byte
    Dim nJunk As Long
    
    strPrinter = Printer.DeviceName
    pDef.DesiredAccess = PRINTER_ALL_ACCESS
    result = OpenPrinter(strPrinter, hPrinter, pDef)
    If CBool(result) And CBool(hPrinter) Then
        GetPrinter hPrinter,  2 &,  0 &,  0 &, pcbNeeded
        ReDim printerinfo_data(pcbNeeded -  1 )
        GetPrinter hPrinter,  2 &, printerinfo_data( 0 ), pcbNeeded, pcbNeeded
        CopyMemory pInfo, printerinfo_data( 0 ), Len(pInfo)
        CopyMemory dm, ByVal pInfo.pDevmode, Len(dm)
        If CBool(dm.dmFields And DM_PAPERSIZE) Then
            dm.dmPaperSize = GetPaperSizeValue(Combo1.Text)
            CopyMemory ByVal pInfo.pDevmode, dm, Len(dm)
            If CBool(SetPrinter(hPrinter,  2 &, pInfo,  0 &)) Then
                MsgBox "[" & Combo1.Text & "]   - OK", vbInformation, Me.Caption
            End If
        End If
    End If
    If CBool(hPrinter) Then ClosePrinter hPrinter
End Sub
...
Рейтинг: 0 / 0
Изменение настроек принтера "по умолчанию"
    #33029034
kLeon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Выполнение функции
CopyMemory pInfo, printerinfo_data(0), Len(pInfo)
приводит к ошибке "Out of memory". Похоже из-за значения printerinfo_data(0). По описанию это переменная Sourse объявленной функции. Вообще-то идеология понятна. Далее попробую вытащить DevMode или функцией PrintDlg или с помощью объекта Printer. Кстати, передача параметра по значению (ByVal) функции CopyMemory также вызывает ошибку, нужно использовать ByRef (или вообще не указывать, так как ByRef принимается по умолчанию).
...
Рейтинг: 0 / 0
Изменение настроек принтера "по умолчанию"
    #33033596
IMOL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я тоже "уперся" в CopyMemory. И хотя в конце концов она заработала, настройки принтера "по умолчанию" не изменились. Интересно, что не так сделал? Так как у меня на всех компьютерах только WIN 2000, поэтому я сделал следующее. Информация о принтере по умолчанию хранится в реестре в разделе HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\Windows в переменной Device. Настройки всех принтеров хранятся в разделах HKEY_CURRENT_USER\Printers\DevModePerUser (для локальных) и в HKEY_CURRENT_USER\Printers\Connections\.... (для сетевых). В первом случае имя переменной с настройками совпадает с именем Devic'а, а во втором имеет название "DevMode". Структура этой переменной (REG_BINARY) такая же как и

Private Type DEVMODE
dmDeviceName As String
dmSpecVersion As Integer
dmDriverVersion As Integer
dmSize As Integer
dmDriverExtra As Integer
dmFields As Long
dmOrientation As Integer
dmPaperSize As Integer
dmPaperLength As Integer
dmPaperWidth As Integer
dmScale As Integer
dmCopies As Integer
dmDefaultSource As Integer
dmPrintQuality As Integer
dmColor As Integer
dmDuplex As Integer
dmYResolution As Integer
dmTTOption As Integer
dmCollate As Integer
dmFormName As String * CCHFORMNAME
dmUnusedPadding As Integer
dmBitsPerPel As Integer
dmPelsWidth As Long
dmPelsHeight As Long
dmDisplayFlags As Long
dmDisplayFrequency As Long
End Type,

по крайней мере у меня :)

Таким образом необходимый мне параметр - формат и лоток числятся на позициях 79-80 и 89-90. После замены этих параметров "загоняю их" обратно в реестр. После этого все "перегружаем" функцией SendMessage. В общем все работает.


Текст программы (прошу прощение за небрежность) приблизительно следующий (без "перегрузки" после изменения реестра)


Const HKEY_CURRENT_USER = &H80000001
Const KEY_ALL_ACCESS = &H3F
Const REG_SZ = 1
Const REG_BINARY = 3


Private Declare Function RegOpenKeyEx Lib "advapi32.dll" _
Alias "RegOpenKeyExA" (ByVal hKey As Long, ByVal lpSubKey As String, _
ByVal ulOptions As Long, ByVal samDesired As Long, phkResult As Long) As Long

Private Declare Function RegSetValueEx Lib "advapi32.dll" _
Alias "RegSetValueExA" (ByVal hKey As Long, ByVal lpValueName As String, _
ByVal Reserved As Long, ByVal dwType As Long, ByVal lpData As String, _
ByVal cbData As Long) As Long

Private Declare Function RegQueryValueEx Lib "advapi32.dll" _
Alias "RegQueryValueExA" (ByVal hKey As Long, ByVal lpValueName As String, _
ByVal lpReserved As Long, lpType As Long, lpData As Any, _
LpcbData As Long) As Long

Private Declare Function RegCloseKey Lib "advapi32.dll" _
(ByVal hKey As Long) As Long


Function GetRegString(hKey As Long, strSubKey As String, _
strValueName As String) As String
Dim strSetting As String
Dim lngDataLen As Long
Dim hSubKey As Long

If RegOpenKeyEx(hKey, strSubKey, 0, KEY_ALL_ACCESS, hSubKey) = 0 Then
strSetting = Space(1180)
lngDataLen = Len(strSetting)
If RegQueryValueEx(hSubKey, strValueName, ByVal 0, _
REG_BINARY, ByVal strSetting, lngDataLen) = 0 Then
If lngDataLen > 1 Then
GetRegString = Left(strSetting, lngDataLen)
End If
End If
RegCloseKey hSubKey
End If
End Function

Public Sub SetRegString(hKey As Long, strSubKey As String, _
ByVal strValueName As String, strSetting As String, Reg As Long)
Dim hNewHandle As Long
Dim lpdwDisposition As Long

If RegOpenKeyEx(hKey, strSubKey, 0, KEY_ALL_ACCESS, hSubKey) = 0 Then
If RegSetValueEx(hSubKey, strValueName, 0, Reg, _
ByVal strSetting, Len(strSetting)) <> 0 Then "....."
End If
Else
"......"
End If
RegCloseKey hNewHandle
End Sub


Sub Main()

Dim a As String
Dim Razdel As String
Dim NameParametr As String

' определяем принтер по умолчанию (сетевой или локальный)

If Mid(PrinterName, 1, 1) = "\" Then
Razdel = "Printers\Connections\" + Replace(PrinterName, "\", ",", 1)
NameParametr = "DevMode"
Else
Razdel = "Printers\DevModePerUser"
NameParametr = PrinterName
End If


'считываем настройки принтера

a = GetRegString(HKEY_CURRENT_USER, Razdel, NameParametr, REG_BINARY)

' длина переменной настроек у меня 1172 байта

' устанавливаем необходимые параметры (коды форматов для каждого принтера свои)

If Format = "A4" Then a = Mid(a, 1, 78) + Chr(KodA4) + Mid(a, 80, 1093)
If Format = "A6" Then a = Mid(a, 1, 78) + Chr(KodA6) + Mid(a, 80, 1093)

' и т.д. можно менять и другие параметры

SetRegString HKEY_CURRENT_USER, Razdel, NameParametr, a, REG_BINARY


' Дальше SendMessage (если надо, конечно :)) )

End Sub


Большое спасибо всем оветившим за помощь.
...
Рейтинг: 0 / 0
Изменение настроек принтера "по умолчанию"
    #33033627
IMOL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да, у сетевых принтеров, у которых на локальном компьютере настройки ни разу не менялись переменная DevMode в реестре отсутствует (до первого "сохранения").
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Изменение настроек принтера "по умолчанию"
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]