1

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

现在我打开它

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"),它打开了许多“程序”实例,而不是在同一个实例中加载所有文件。

4

1 回答 1

2

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

因此,只需做 Windows 所做的事情,比模拟 D+D 几乎不可能完成的任务要容易得多:

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

确保将完整路径传递给文件(如 c:\foo\bar.baz),增量路径将不起作用。

于 2012-06-16T01:37:56.303 回答