从我的程序拖放到vb.net中的第三方程序

时间:2012-06-15 20:36:39

标签: vb.net drag-and-drop execute multiple-files

我试图通过从VB.NET调用它来使用第三方程序打开多个文件。默认情况下,我通过命令行使用的程序一次只打开一个文件 - 如果我再次调用它,它会打开一个新实例。 (在GUI中启动时,我可以在其上删除许多文件)。

现在我用

打开它
Shell("program file")

如果程序正在运行,我想在正在运行的实例上添加“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 个答案:

答案 0 :(得分:2)

当您在快捷方式上删除文件时,Windows不会做任何壮观的事情。它只是启动程序并将路径作为命令行参数传递给删除的文件。这可以定制,但不常见。

所以只做Windows所做的事情,比模拟D + D几乎不可能的任务更容易上手:

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

请务必传递文件的完整路径(例如c:\ foo \ bar.baz),增量路径不起作用。