|
|
|
| Как проверить программно - локальный принтер уже включили или ещё нет?
==================================
Или помогите вот отсюда выдернуть нужные строки, если таковые имеются.
http://support.microsoft.com/kb/202480/ru | |
|
| |
|
|
|
| на нём лампочка зелёненькая должна загореться или надпись - рэди
ну или через принтерную апишную библятеку, например
Option Compare Database
Private Declare Function OpenPrinter Lib "winspool.drv" Alias "OpenPrinterA" (ByVal pPrinterName As String, phPrinter As Long, pDefault As Any) As Long
Private Declare Function ClosePrinter Lib "winspool.drv" (ByVal hPrinter As Long) As Long
Private Declare Function PrinterProperties Lib "winspool.drv" (ByVal hwnd As Long, ByVal hPrinter As Long) As Long
Public Function prnIsLoad()
Dim hPrinter As Long
OpenPrinter Printer.DeviceName, hPrinter, ByVal 0&
'PrinterProperties Me.hwnd, hPrinter
prnIsLoad = (hPrinter <> 0)
ClosePrinter hPrinter
End Function
|
| |
|
| |
|
|
|
|
| так по твоей ссылке всё тоже самое :)) даже лучше
чё ты! | |
|
| |
|
|
|
| там стока всего, шоя заплуталси........ | |
|
| |
|
|
|
| И кусок, что ты дал - чё та я не пойму - как проверить принтер включен или нет - лампочка горит или нет?
hPrinter <> 0 - всегда.
не зависимо включен принтер или нет. | |
|
| |
|
|
|
| я дал намёк на работать как с апи принетрным
у тебя в примере твоём по ссылке - всё есть
просто почитай
засунь весь код в модуль
посмотри процедуры и функции
все должно работать
там видел краем глаза шото типа Check статус принтера...
а в моем примере если есть принтер - он его открывает
попробуй взять другое название :)) получишь ноль
с віключением не єкспериментировал :) | |
|
| |
|
|
|
| спасибо!
Это всё относится к драйверу устройства.
А сам принтер - он не досягаем типа. | |
|
| |
|
|
|
| драйвер статус девайса возвращает, вопщето
ну, может что поменялось с тех времен | |
|
| |
|
|
|
|
Вощем надо делать примерно так:
Посылаем что то на печать.
оно помещается в очередь.(даже если принтер не включен)
Потом черес секунд несколько - надо глянуть - напечаталося или ещё нет.
И если нет - тада сказать (спросить) А У ВАС ВСЁ С БАШКОЙ В ПОРЯДКЕ? | |
|
| |
|
|
|
| 'Может отсюда можно что то выдернуть
Option Explicit
Option Base 0
Private Const PRINTER_ENUM_LOCAL = &H2 'Принтеры, установленные на данной машине
Private Type PRINTER_INFO_5 'Структура для InfoLevel=5
pPrinterName As String 'Имя принтера (имя иконки в панели "Принтеры")
pPortName As String '"<порт>:" или "\\<сетевой адрес>" устройства
dwAttrs As Long
dwDevNotSelectedTimeout As Long
dwTransmissRetryTimeout As Long
End Type
Private Declare Function StrCopy Lib "kernel32.dll" _
Alias "lstrcpyA" _
(ByVal lpStrDst As String, lpStrSrc As Any) As Long
Private Declare Function StrLen Lib "kernel32.dll" _
Alias "lstrlenA" (lpStrSrc As Any) As Long
Private Declare Function EnumPrinters Lib "winspool.drv" _
Alias "EnumPrintersA" _
(ByVal Flags As Long, ByVal lpsPrnName As String, _
ByVal InfoLevel As Long, _
pEnumArray As Any, ByVal pEnumArraySize As Long, _
pNeededBytes As Long, pReturnedCount As Long) As Long
Function ПринтерПоУмолчанию(МаскаИмени As String, _
Optional МаскаПорта As String) As String
'Задает принтер поумолчанию на основе заданной маски его имени [и имени порта]
Dim res As Long, need As Long, cnt As Long, i As Long
Dim buf() As Long
Dim inf() As PRINTER_INFO_5
ReDim inf(0)
ReDim buf(255) 'Работаем через промежуточный 32бит-буфер
res = EnumPrinters(PRINTER_ENUM_LOCAL, vbNullString, 5, _
buf(0), (UBound(buf) + 1) * LenB(buf(0)), _
need, cnt)
If res <> 1 Then 'Буфер слишком мал - переопределяем
ReDim buf(need \ (LenB(inf(0)) \ 4))
res = EnumPrinters(PRINTER_ENUM_LOCAL, vbNullString, 5, _
buf(0), (UBound(buf) + 1) * LenB(buf(0)), _
need, cnt)
End If
If res = 1 Then 'Переносим содержимое буфера в массив структур
If cnt > 0 Then 'Количество принтеров в системе
ReDim inf(cnt - 1) 'Резервируем массив структур
For i = 0 To cnt - 1 'Переносим только строки
inf(i).pPrinterName = Space(StrLen(ByVal buf(5 * i)))
Call StrCopy(inf(i).pPrinterName, ByVal buf(5 * i))
inf(i).pPortName = Space(StrLen(ByVal buf(5 * i + 1)))
Call StrCopy(inf(i).pPortName, ByVal buf(5 * i + 1))
Next i
Else
Exit Function 'Нет установленных принтеров на данном компьютере
End If
Else
Exit Function 'Ошибка вызова EnumPrinters()
End If
For i = LBound(inf) To UBound(inf)
If UCase(inf(i).pPrinterName) Like UCase(МаскаИмени) Then
If IsMissing(МаскаПорта) Or Len(МаскаПорта) = 0 Then
ПринтерПоУмолчанию = inf(i).pPrinterName & _
" (" & inf(i).pPortName & ")"
Exit For
Else 'Поиск по двум маскам
If UCase(inf(i).pPortName) Like UCase(МаскаПорта) Then
ПринтерПоУмолчанию = inf(i).pPrinterName & _
" (" & inf(i).pPortName & ")"
Exit For
End If
End If
End If
Next i
'Возвращает "<имя> (<порт>:)", "<имя> (\\<сетевой адрес>)",
'Или пустую строку
End Function
там циклом For i = LBound(inf) To UBound(inf) идет перебор всех твоих принтеров, которые вернул API-вызов
в экселе так: (нужно по дефолту проставить сетевой HP 5Si Mx PS, если он привязан на клиенте):
Application.ActivePrinter =ПринтерПоУмолчанию("*5Si*") | |
|
| |
|
|
|
| спасибо!
Может быть.
Но я такой тупой, шо не знаю что дёргать.
И не вижу ничё подходящего. | |
|
| |