Как открыть несколько файлов в Windows Photoviewer из VB.NET?

Следующий код в VB.NET открывает OpenFileDialog, пользователь выбирает файл JPG, затем программа открывает WinPhotoViewer для печати выбранного JPG. ОС Win7

Sub CmdImprimirJPGClick(sender As Object, e As EventArgs)

Dim filePath As String = ""
Dim openFileDialog1 As New OpenFileDialog()

openFileDialog1.Filter = "JPG files (*.jpg , *.jpeg)|*.jpg;*.jpeg|All files (*.*)|*.*"
openFileDialog1.FilterIndex = 1
'openfiledialog1.Multiselect = True   
openFileDialog1.RestoreDirectory = True

If (DialogResult.OK) = openFileDialog1.ShowDialog(Me) Then
        filePath = openFileDialog1.FileName     
Else
        Exit Sub
End If

Dim oProc As New ProcessStartInfo(filePath)

oProc.verb = "Print"
oProc.CreateNoWindow = True
oProc.WindowStyle = ProcessWindowStyle.Hidden
Process.Start(oProc)

Проблема есть. Теперь я хочу открыть MULTIPLE JPG файлы и показать диалог печати напрямую, чтобы распечатать их все, на одной странице в виде больших пальцев или на многих страницах. Цель состоит в том, чтобы напечатать несколько jpgs с photoviewer... как я могу это сделать?, пытался поместить много имен файлов в стартовую строку, например, "1.jpg", "2.jpg", но не сработало.

Теперь я пытаюсь с помощью cmd-строки:

rundll32 "%ProgramFiles%\Windows Photo Viewer\Photoviewer.dll", ImageView_Fullscreen c:\1.jpg & c:\2.jpg

действительно открывает несколько файлов (но в разных случаях), но теперь мне нужно применить команду "Переключатель печати", и переключатели cmd-line для photoviewer.dll, похоже, не документированы.

2 ответа

Решение

Если программа не позволяет переключателям командной строки делать то, что вы хотите (в чем я очень сомневаюсь)(проверьте "Photoviewer.dll?" Или "Photoviewer.dll /?"), Вам придется делать это через что-то вроде Sendkeys, что не реально. надежный. Но все это становится НАМНОГО сложнее, когда вы хотите сделать это с несколькими файлами, и приложение запускает несколько экземпляров приложения.

Ты использовал Process.Start() это хорошо, потому что он даст вам дескриптор запущенного приложения, но похоже, что он запустил несколько приложений с несколькими дескрипторами, не очень хорошо. Я бы посоветовал вам сделать process.start для каждого файла, использовать sendkeys, дождаться закрытия приложения и затем process.start следующего файла.

Сегодня мне нужно было открыть несколько фотографий в Windows Photo Viewer, открыв только один экземпляр.

Обычно достаточно открыть само изображение, а затем пользователь использует стрелки для просмотра изображений.

Однако, когда изображение находится во временной папке, стрелки отключены. Альтернативой является открытие папки контейнера, после чего стрелки становятся активными.

Вот мой код в VB:

      Private Sub BtnLoad_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Dim filePath As String = "C:\Users\Picsonald\AppData\Local\Temp\SubFolder\photo1.jpg"
    Dim directoryPath As String = "C:\Users\Picsonald\AppData\Local\Temp\SubFolder"
    OpenPhotoViewer(filePath) ' Open the picture, but arrow are disabled (cause of Temp folder ?) :(
    OpenPhotoViewer(directoryPath) ' Open a picture located in the directory, and arrow are enabled :) <- Several pictures can be browsed
End Sub

Private Sub OpenPhotoViewer(pathToOpen As String)
    ' Finding the PhotoViewer.dll full path...
    Dim photoViewerPath As String = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles).Replace(" (x86)", String.Empty), "Windows Photo Viewer", "PhotoViewer.dll")
    If Not File.Exists(photoViewerPath) Then
        photoViewerPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.CommonProgramFilesX86), "Windows Photo Viewer", "PhotoViewer.dll")
    End If

    ' Construct arguments to specify element to display
    Dim argument As String = String.Concat("""", photoViewerPath, """, ImageView_Fullscreen " + pathToOpen)
    Dim psi As ProcessStartInfo = New ProcessStartInfo("rundll32.exe", argument)
    psi.UseShellExecute = True
    Process.Start(psi) ' Run the Microsoft Photo Viewer
End Sub

И тот же код на С#:

      private void BtnLoad_Click(object sender, EventArgs e)
{
    string filePath = @"C:\Users\Picsonald\AppData\Local\Temp\SubFolder\photo1.jpg";
    string directoryPath = @"C:\Users\Picsonald\AppData\Local\Temp\SubFolder";
    OpenPhotoViewer(filePath); // Open the picture, but arrow are disabled (cause of Temp folder ?) :(
    OpenPhotoViewer(directoryPath); // Open a picture located in the directory, and arrow are enabled :) <- Several pictures can be browsed
}

private void OpenPhotoViewer(string pathToOpen)
{
    // Finding the PhotoViewer.dll full path...
    string photoViewerPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles).Replace(" (x86)", String.Empty), "Windows Photo Viewer", "PhotoViewer.dll");
    if (!File.Exists(photoViewerPath))
    {
        photoViewerPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.CommonProgramFilesX86), "Windows Photo Viewer", "PhotoViewer.dll");
    }

    // Construct arguments to specify element to display
    string argument = string.Concat("\"", photoViewerPath, "\", ImageView_Fullscreen " + pathToOpen);
    ProcessStartInfo psi = new ProcessStartInfo("rundll32.exe", argument);
    psi.UseShellExecute = true;
    Process.Start(psi); // Run the Microsoft Photo Viewer
}

Однако должен существовать более подходящий подход, чем тот, который запросил спрашивающий, потому что с помощью проводника Windows выбор двух изображений из папки, содержащей несколько изображений, приводит к тому, что средство просмотра фотографий Windows просматривает только эти два изображения.

Другие вопросы по тегам