#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 /…