Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Изменение настроек принтера "по умолчанию" / 13 сообщений из 13, страница 1 из 1
12.04.2005, 11:01:40
    #33010086
IMOL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изменение настроек принтера "по умолчанию"
Подскажите, как можно при старте программы автоматически, без вызова диалоговых окон, у принтера "по умолчанию" установить (изменить) необходимый формат бумаги и лоток.
...
Рейтинг: 0 / 0
13.04.2005, 11:41:15
    #33012797
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изменение настроек принтера "по умолчанию"
См. объект Printer
...
Рейтинг: 0 / 0
13.04.2005, 16:36:01
    #33013949
IMOL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изменение настроек принтера "по умолчанию"
Наверное мой вопрос немного некорректен. Мне необходимо, чтобы у "принтера по умолчанию" реально изменялся формат бумаги. Т.е, чтобы после завершения работы программы на принтере был установлен заданный формат. Да, программа работает под Win 2000.
...
Рейтинг: 0 / 0
13.04.2005, 17:09:33
    #33014091
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изменение настроек принтера "по умолчанию"
В таком случае пошарь в реестре на предмет ключей, в которых хранятся настройки.
...
Рейтинг: 0 / 0
16.04.2005, 21:21:31
    #33019712
kLeon
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изменение настроек принтера "по умолчанию"
Совет насчет "пошарить в реестре" неудачен. Все настройки принтера хронятся в глобальной бинарной структуре DEVMODE. Шарить в ней - гиблое дело. Сам хотел бы найти способ. С DEVMODE работает функция PrintDlg. Попробуй освоить, может что и выйдет.
...
Рейтинг: 0 / 0
17.04.2005, 22:06:37
    #33020116
IMOL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изменение настроек принтера "по умолчанию"
Самое веселое, что я "шарюсь" в реестре по настоящее время с нулевым результатом.
...
Рейтинг: 0 / 0
18.04.2005, 12:39:56
    #33020802
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изменение настроек принтера "по умолчанию"
2 kLeon:
То есть содержимое DEVMODE содержится в реестре в формате DWORD?
...
Рейтинг: 0 / 0
19.04.2005, 09:59:11
    #33022437
IMOL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изменение настроек принтера "по умолчанию"
Переменная DevMode представляет собой структуру объемом 1172 байта (по крайней мере в моем реестре). При этом у некоторых принтеров эта переменная отсутствует.
...
Рейтинг: 0 / 0
19.04.2005, 12:47:40
    #33022841
Konst_One
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изменение настроек принтера "по умолчанию"
большинство принтеров позволяют выставлять размер бумаги непосредственно только перед печатью через соответствующий диалог настроек драйвера принтера, который может быть вызван, как было указано ранее, через вызов API PrintDlg с использованием DEVMODE
И эта настройка будет активно, как правило, в течении работы программы, которая вызвала данный диалог.
Не всегда можно установить настройки ориентации страницы для дефолтного принтера для всей системы вцелом. См. документацию по своему принтеру.
...
Рейтинг: 0 / 0
19.04.2005, 13:02:16
    #33022900
PA
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
22.04.2005, 00:43:36
    #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
25.04.2005, 15:14:59
    #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
25.04.2005, 15:23:11
    #33033627
IMOL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изменение настроек принтера "по умолчанию"
Да, у сетевых принтеров, у которых на локальном компьютере настройки ни разу не менялись переменная DevMode в реестре отсутствует (до первого "сохранения").
...
Рейтинг: 0 / 0
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Изменение настроек принтера "по умолчанию" / 13 сообщений из 13, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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