Цитата(ggg__ggg @ 28.8.2008, 12:04) [snapback]286220[/snapback]
Есть такой ключик в реестре - HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\IniFileMapping. Он много чего интересного содержит, в том числе и про принтеры.
благодарю за ссылку на ключик - откопал статейку в масть (НО сложнее чем на WHS да строк в сто раз больше)
--------------------------------------------------------------------------------------------------------------------------------
Смена активного принтера в Windows 2000 средствами Visual Basic
Статьи → Программирование на VisualBasic
Проблему программного изменения активного принтера можно по праву отнести в раздел FAQ - часто задаваемых вопросов, настолько часто о ней задаются вопросы в форумах и почтовых конференциях. Данный материал, основанный на информации из Microsoft Knowlegde Base, детализирует решение этой проблемы для Windows NT/Windows 2000, а также для Win9x.
Традиционный подход к установке принтера "по умолчанию", который должен работать согласно документации, состоит в том, чтобы, перебирая коллекцию Printers, найти требуемый принтер и назначить его объекту Printer. На самом деле это не работает как заявлено. Название принтера изменится, но вывод будет производиться на первоначальное устройство, которое до этого использовалось по умолчанию.
В Win9x установленные принтеры перечислены в win.ini в разделе PrinterPorts, принтер по умолчанию указан в разделе Device. Поэтому различная документация просто предлагает изменить значения этого ключа. Но если вы посмотрите содержимое win.ini в системе WinNT/2000, то обнаружите, что файл не содержит никакой информации об установленных и активном принтерах.
По умолчанию, при использовании GetProfileString / WriteProfileString или GetPrivateProfileString / WritePrivateProfileString под WinNT/2000, API сначала смотрит значения системного реестра в секции:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\IniFileMapping
в поисках ini-файла. Если значение не было найдено, то используется "физический" ini-файл.
В случае, если подключ win.ini был найден в системном реестре под ключом, указанным выше, то далее проверяется значение PrinterPorts, которое указывает, где в реестре хранятся данные об установленных принтерах (например, "USR:Software\Microsoft\Windows NT\CurrentVersion\PrinterPorts").
Найдя данный ключ, вы увидите перечень принтеров, которые доступны на данном компьютере. Таким образом, используя функции работы с реестром можно получить данные о принтерах прямо отсюда, а не из обычного текстового файла конфигурации, как в Win9x. Обратите внимание, перед их использованием, что смена активного принтера произойдет во всей системе, а не только в вашем приложении. Поэтому после смены принтера было бы логичнее создать функцию, позволяющую восстановить первоначальные настройки системы перед завершением работы вашей программы.
Чтобы на деле увидеть как работать с описываемыми ключами, ниже приводится готовый пример. Создайте новый проект, добавьте на его форму список List1 и кнопку Command1. Затем запустите проект, откройте папку "Printers" (в русских версиях - "Принтеры") и нажимая на кнопку, смотрите как изменяется активный принтер.
Option Explicit
Private Const HWND_BROADCAST As Long = &HFFFF
Private Const WM_WININICHANGE As Long = &H1A
Private Declare Function GetProfileString Lib "kernel32" _
Alias "GetProfileStringA" _
(ByVal lpAppName As String, _
ByVal lpKeyName As String, _
ByVal lpDefault As String, _
ByVal lpReturnedString As String, _
ByVal nSize As Long) As Long
Private Declare Function WriteProfileString Lib "kernel32" _
Alias "WriteProfileStringA" _
(ByVal lpszSection As String, _
ByVal lpszKeyName As String, _
ByVal lpszString As String) As Long
Private Declare Function SendMessage Lib "user32" _
Alias "SendMessageA" _
(ByVal hwnd As Long, _
ByVal wMsg As Long, _
ByVal wParam As Long, _
lparam As Any) As Long
Private Sub Form_Load()
ProfileLoadWinIniList List1, "PrinterPorts"
Command1.Enabled = False
End Sub
Private Sub Command1_Click()
Call SetDefaultPrinterWinNT
End Sub
Private Sub List1_Click()
Command1.Enabled = List1.ListIndex > -1
End Sub
Private Sub SetDefaultPrinter(ByVal PrinterName As String, _
ByVal DriverName As String, _
ByVal PrinterPort As String)
Dim DeviceLine As String
'Строим строку для принтера
DeviceLine = PrinterName & "," & DriverName & "," & PrinterPort
'Сохранить информацию о новом принтере в секции
'[WINDOWS] файла WIN.INI для ключа DEVICE=
Call WriteProfileString("windows", "Device", DeviceLine)
'Заставить все приложения перезагрузить INI-файл
Call SendMessage(HWND_BROADCAST, WM_WININICHANGE, 0, ByVal "windows")
End Sub
Private Sub GetDriverAndPort(ByVal Buffer As String, _
DriverName As String, PrinterPort As String)
Dim posDriver As Long
Dim posPort As Long
DriverName = ""
PrinterPort = ""
'Имя драйвера идет вначале строки
posDriver = InStr(Buffer, ",")
If posDriver > 0 Then
'Получение имени драйвера
DriverName = Left(Buffer, posDriver - 1)
'Имя порта идет после запятой
posPort = InStr(posDriver + 1, Buffer, ",")
If posPort > 0 Then
'Получение имени порта
PrinterPort = Mid(Buffer, posDriver + 1, _
posPort - posDriver - 1)
End If
End If
End Sub
'Создаем listbox из данных win.ini
Public Function ProfileLoadWinIniList(lst As ListBox, _
lpSectionName As String) As Long
Dim success As Long
Dim nSize As Long
Dim lpKeyName As String
Dim ret As String
ret = Space$(8102)
nSize = Len(ret)
success = GetProfileString(lpSectionName, vbNullString, _
"", ret, nSize)
'Возращаемая строка является списком, разделенным
'нулевыми символами
If success Then
ret = Left$(ret, success)
Do Until ret = ""
lpKeyName = StripNulls(ret)
lst.AddItem lpKeyName
Loop
End If
'вернем число принтеров (кол-во элементов)
ProfileLoadWinIniList = lst.ListCount
End Function
Private Function StripNulls(startstr As String) As String
Dim pos As Long
pos = InStr(startstr$, Chr$(0))
If pos Then
StripNulls = Mid$(startstr, 1, pos - 1)
startstr = Mid$(startstr, pos + 1, Len(startstr))
End If
End Function
Private Sub SetDefaultPrinterWinNT()
Dim Buffer As String
Dim DeviceName As String
Dim DriverName As String
Dim PrinterPort As String
Dim PrinterName As String
Dim r As Long
If List1.ListIndex > -1 Then
'Получить информацию из файла WIN.INI о принтере,
'выделенном в списке.
Buffer = Space(1024)
PrinterName = List1.Text
Call GetProfileString("PrinterPorts", _
PrinterName, "", _
Buffer, Len(Buffer))
'Получить имя драйвера и порта
GetDriverAndPort Buffer, DriverName, PrinterPort
If DriverName "" And PrinterPort "" Then
SetDefaultPrinter List1.Text, DriverName, PrinterPort
End If
End If
End Sub
--------------------------------------------------------------------------------------------------------------------------------
взято тут