vba ShellExecute печать изображения без диалога печати

#vba #winapi

#vba #winapi

Вопрос:

Я использую ShellExecute для печати своего изображения.

 Declare PtrSafe Function apiShellExecute Lib "shell32.dll" Alias "ShellExecuteA" ( _
ByVal hwnd As Long, _
ByVal lpOperation As String, _
ByVal lpFile As String, _
ByVal lpParameters As String, _
ByVal lpDirectory As String, _
ByVal nShowCmd As Long) _
As Long

Public Sub PrintFile(ByVal strPathAndFilename As String)

    Call apiShellExecute(Application.hwnd, "print", strPathAndFilename, vbNullString, vbNullString, 0)

End Sub

Sub PrintImg()
    PrintFile "C:UsersAdministratorDesktopTest.png"
End Sub
  

Но откроется диалоговое окно, подобное приведенному ниже

введите описание изображения здесь

Есть ли какой-либо способ распечатать изображение без этого диалога?

Я знаю, что мог бы обойти это, изменив программу по умолчанию на открытие изображения с помощью paint. Но менять его на каждом компьютере конечного пользователя нецелесообразно.

Буду признателен за любую помощь.

Комментарии:

1. Это неизбежно, если вы полагаетесь на ассоциацию файлов. Это вне вашего контроля. Подумайте о том, что на самом деле делает ShellExecute. Если вы хотите контролировать, вам нужно будет взять управление на себя и включить код для выполнения печати из вашей программы.

2. @DavidHeffernan Это код vba из Excel, я печатаю файл с помощью ShellExecute, что вы имеете в виду под from your program ?

3. Я имею в виду именно это. В данный момент вы просите другую программу выполнить печать. И он решил показать это диалоговое окно. Если вы хотите контролировать печать самостоятельно в своей программе.

4. @DavidHeffernan Я просто хочу распечатать изображение из кода vba, есть ли какое-либо решение? Я не уверен, что вы подразумеваете под самостоятельной печатью.

5. Да, решение есть. Вы пишете код для взаимодействия с принтером через GDI, как это делает любая другая программа Windows. Я подозреваю, что большая часть вашей проблемы заключается в том, что вы не знаете, что на самом деле делает ShellExecute.

Ответ №1:

Это невозможно (поскольку вы полагаетесь на внешнее приложение, которое просто видит «print» как глагол, то, что оно будет делать, зависит от этого приложения), но печать в Windows похожа на запись в контекст устройства.

Подход изменения обработчика по умолчанию также совершенно неверен, поскольку вы никогда не можете быть уверены, что стороннее приложение будет делать в будущем, если у него нет документированного поведения (обычно использование стороннего приложения требует некоторой хорошо документированной автоматизации, которой у Paint нет).

Вы можете начать с здесь, чтобы посмотреть, и MS example в here является более быстрым примером использования GDI . Вот пример Visual Basic.

Комментарии:

1. Мой код взят из Excel vba. Как я могу использовать GDI из моего кода vba?

2. Пример здесь social.msdn.microsoft.com/Forums/en-US /…