Перетащите из моей программы в стороннюю программу в vb.net

Я пытаюсь открыть несколько файлов с помощью сторонней программы, вызывая его из VB.NET. По умолчанию программа, которую я использую, через командную строку, открывает только один файл за раз - и если я вызываю его снова, она открывает новый экземпляр. (при запуске в графическом интерфейсе, я могу сбросить много файлов на нем).

Теперь я открываю это с

Shell("program file")

Если программа работает, я хочу добавить "файл" поверх запущенного экземпляра вместо запуска нового экземпляра.

Что-то вроде:

If Not procExists then
    Shell("program file")
else
   'I want to drop "file" onto running "program" (or procNumber since I have it)
End If

Я пытался найти какой-нибудь пример кода перетаскивания для VB.NET или C#, но я не смог найти того, что я мог понять - я читал о WM_DROPFILES и о том, что он может не работать в Windows 7 (именно там я нужно чтобы это работало). Я также нашел обходной путь для MFC, http://helgeklein.com/blog/2010/03/how-to-enable-drag-and-drop-for-an-elevated-mfc-application-on-vistawindows-7/ но мое ограниченное понимание этого примера (за исключением того факта, что я не могу заставить его работать или использовать его для моего приложения vb.net), заключается в том, что он применяется для удаления элементов в МОЕМ приложении, а не в другом.

Что-то еще, что я обнаружил - и опять-таки, похоже, что для удаления файлов в МОЕМ приложении, а не для другого - и все еще открывает отдельный экземпляр этой программы, и я действительно не хочу этого - имеет что-то вроде:

Public Const WM_DROPFILES As Integer = 563
Private Declare Sub DragFinish Lib "Shell32.dll" (ByVal hdrop As IntPtr)
Private Declare Function DragAcceptFiles Lib "shell32.dll" (ByVal hwnd As IntPtr, ByVal accept As Boolean) As Long
Private Declare Function DragQueryFile Lib "shell32.dll" (ByVal hdrop As IntPtr, ByVal ifile As Integer, ByVal fname As System.Text.StringBuilder, ByVal fnsize As Integer) As Integer

Public Sub HandleDroppedFiles(ByVal file As String)
    If Len(file) > 0 Then
        'do something but what ? If I call the program, it will open a new instance
    End If
End Sub

Где я могу получить пример WM_DROPFILES - или что-то еще - что я могу работать?

Изменить: используя предложенный ответ, я попытался:

For Each filename in filelist
  System.Diagnostics.Process.Start(program, filename)
Next

К сожалению, так же, как Shell("program filename"), он открыл много экземпляров "программы", вместо этого загрузив все файлы в одном экземпляре.

1 ответ

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

Так что просто делайте то, что делает Windows, гораздо легче начать работу, чем практически невозможная задача симуляции D+D:

  System.Diagnostics.Process.Start("program file", file);

Обязательно укажите полный путь к файлу (например, c:\foo\bar.baz), дополнительные пути не будут работать.

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