Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 |

 

  Вопрос: WebBrowser / Print to file Добавлено: 19.07.06 14:39  

Автор вопроса:  Resonator
Здравствуйте.

Есть задача напечатать ПостСкрипт файл из WebBrowser. Установил драйвер принтера, который в состоянии печатать постскрипт, программно выбираю этот принтер как дефолтовый и посылаю команду печати.

ctrlBrowser.ExecWB OLECMDID_PRINT, OLECMDEXECOPT_DONTPROMPTUSER, 2, vbNull

Порт принтера установлен в "FILE:" Открывается окошко и просят ввести имя файла. Есть ли способ это обойти? Пробовал создавать новый порт принтера с полным путем файла. Работает, но как-то не эстетично, плюс в таком случае нужно програмно опять таки открыть настройки принтера и найти КУДА же уйдет печать. Хотелось бы оставить портом "FILE" но указать имя файла.

Ответить

  Ответы Всего ответов: 4  

Номер ответа: 1
Автор ответа:
 HACKER


 

Разработчик Offline Client

Вопросов: 236
Ответов: 8362
 Профиль | | #1 Добавлено: 20.07.06 02:03
ну как вариант: программно нажать "печать" :)

Ответить

Номер ответа: 2
Автор ответа:
 Resonator



Вопросов: 5
Ответов: 6
 Профиль | | #2 Добавлено: 20.07.06 04:09
Мало знаком с подобным "програмным" :) подходом, понимаю ,что нужно найтьи окошко

hwnd = FindWindow(vbNullString, "Print To File";)

А если это русифицированный вин. ? а если китайнезированный?)

Ответить

Номер ответа: 3
Автор ответа:
 HACKER


 

Разработчик Offline Client

Вопросов: 236
Ответов: 8362
 Профиль | | #3 Добавлено: 20.07.06 23:01
а если конец света завтра? и твоей прогой так никто и не воспользуется? :) сделай англ и русс на остальное забей :)

Да, находишь хендел окошка, как показал выше...
потом, перебираешь дочерние хенделы этого окна...
и PostMassage нажимаешь на кнопку...

Я писал не так давно что-то похожее...

'Модуль автоматического реагирования на диалоги
'Написано HACKER'ом 0x.07.06

Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function GetClassName Lib "user32" Alias "GetClassNameA" (ByVal hwnd As Long, ByVal lpClassName As String, ByVal nMaxCount As Long) As Long
Private Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long
Private Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Private Declare Function EnumChildWindows Lib "user32" (ByVal hWndParent As Long, ByVal lpEnumFunc As Long, ByVal lParam As Long) As Long
Private Declare Function SetTimer& Lib "user32" (ByVal hwnd&, ByVal nIDEvent&, ByVal uElapse&, ByVal lpTimerFunc&;)
Private Declare Function KillTimer& Lib "user32" (ByVal hwnd&, ByVal nIDEvent&;)

Private Const WM_LBUTTONDOWN = &H201
Private Const WM_LBUTTONUP = &H202
Private Const WM_CLOSE = &H10

Private Me_hwnd As Long
Private GoodWindow As Boolean

Private Type AnswerWindow
    NameWindow        As String
    NameButtonToPress As String
End Type

Public ArrAnswerWindow() As AnswerWindow

Private Function EnumElement_(ByVal hwnd As Long, ByVal lParam As Long) As Long
Dim c As Long, t As Long, I As Byte
Dim sText As String
Dim sClass As String
        sClass = Space$(128)
        c = GetClassName(hwnd, sClass, 128)
        If c > 0 Then
            sClass = Left$(sClass, c)
            sText = Space$(128)
            t = GetWindowText(hwnd, sText, 128)
            sText = Left$(sText, t)
            For I = LBound(ArrAnswerWindow) To UBound(ArrAnswerWindow)
                If Trim$(sClass) Like "*Button*" Then
                    sText = Replace(sText, "&", "";)
                    If Trim(sText) = Replace(ArrAnswerWindow(I).NameButtonToPress, "&", "";) Then
                        Call PostMessage(hwnd, WM_LBUTTONDOWN, 0, 0)
                        Call PostMessage(hwnd, WM_LBUTTONUP, 0, 0)
                        GoodWindow = True
                    End If
                End If
            Next I
            If GoodWindow = False Then
                Call PostMessage(wHwnd, WM_CLOSE, 0, 0)
            End If
        End If
EnumElement_ = 1
End Function

Private Sub EnumElement(hWndParent As Long)
    EnumChildWindows hWndParent, AddressOf EnumElement_, 0&
End Sub

Private Sub TimerProc(ByVal hwnd As Long, ByVal uMsg As Long, ByVal idEvent As Long, ByVal dwTime As Long)
    Dim I As Byte
    Dim wHwnd As Long
    GoodWindow = False
    For I = LBound(ArrAnswerWindow) To UBound(ArrAnswerWindow)
        wHwnd = FindWindow(vbNullString, ArrAnswerWindow(I).NameWindow)
        If wHwnd > 0 Then Call EnumElement(wHwnd)
    Next
    
End Sub

Public Sub StartAutoAnswerDialog(FormHwnd As Long, Optional Interval As Long = 5000)
    Me_hwnd = FormHwnd
    SetTimer FormHwnd, 1, Interval, AddressOf TimerProc
End Sub

Public Sub StopAutoAnswerDialog()
    KillTimer hwnd, 1
End Sub



пользоваться так:
Private Sub Form_Load()
    ReDim ArrAnswerWindow(4)
    ArrAnswerWindow(0).NameWindow = "Internet Explorer Script Error"
    ArrAnswerWindow(0).NameButtonToPress = "Yes"
    
    ArrAnswerWindow(1).NameWindow = "Internet Explorer"
    ArrAnswerWindow(1).NameButtonToPress = "OK"
    
    ArrAnswerWindow(2).NameWindow = "Security Warning"
    ArrAnswerWindow(2).NameButtonToPress = "Yes"
    
    ArrAnswerWindow(3).NameWindow = "Security Alert"
    ArrAnswerWindow(3).NameButtonToPress = "Yes"
    
    ArrAnswerWindow(4).NameWindow = "Предупреждение системы безопасности"
    ArrAnswerWindow(4).NameButtonToPress = "Да"
    
    AutoAnswerDialog.StartAutoAnswerDialog Me.hwnd
End Sub

Private Sub Form_Unload(Cancel As Integer)
    AutoAnswerDialog.StopAutoAnswerDialog
End Sub

Ответить

Номер ответа: 4
Автор ответа:
 Resonator



Вопросов: 5
Ответов: 6
 Профиль | | #4 Добавлено: 21.07.06 14:45
Вот спасибо) Уже пользуюсь.

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам