【问题标题】:Open Folder Path if not already open, if open show window如果尚未打开,则打开文件夹路径,如果打开显示窗口
【发布时间】:2014-11-18 20:21:23
【问题描述】:

这似乎是一项简单的任务,但我似乎无法产生寻找的结果。

目前我有这个代码

 Dim folderpath As String

Private Sub Button4_Click(sender As Object, e As EventArgs) Handles Button4.Click
    folderpath = "C:\epds\WIP"
    Process.Start("explorer.exe", folderpath)

End Sub

这很好,它会按指示打开我的文件夹路径,但是,如果该文件夹的实例已经在资源管理器中打开,我该如何使该窗口成为当前窗口而不是打开新的窗口资源管理器?

编辑:这似乎可以解决问题,感谢@Okuma.Scott 为我指明正确的方向

<DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)> _
Private Shared Function FindWindow( _
  ByVal lpClassName As String, _
  ByVal lpWindowName As String) As IntPtr
End Function

<DllImport("user32.dll", EntryPoint:="FindWindow", SetLastError:=True, CharSet:=CharSet.Auto)> _
Private Shared Function FindWindowByClass( _
  ByVal lpClassName As String, _
  ByVal zero As IntPtr) As IntPtr
End Function

<DllImport("user32.dll", EntryPoint:="FindWindow", SetLastError:=True, CharSet:=CharSet.Auto)> _
Private Shared Function FindWindowByCaption( _
  ByVal zero As IntPtr, _
  ByVal lpWindowName As String) As IntPtr
End Function

Dim folderpath As String

Private Sub Button4_Click(sender As Object, e As EventArgs) Handles Button4.Click
    folderpath = "C:\epds\WIP"
    'Process.Start("explorer.exe", folderpath)
    Dim nWnd As IntPtr
    Dim ceroIntPtr As New IntPtr(0)
    Dim Wnd_name As String

    Wnd_name = "WIP"
    nWnd = FindWindow(Nothing, Wnd_name)
    'show the info
    If nWnd.Equals(ceroIntPtr) Then
        Process.Start("explorer.exe", folderpath)
    Else
        AppActivate(Wnd_name)
        SendKeys.SendWait("~")
    End If


End Sub

【问题讨论】:

  • 我想打开 C:\epds\WIP 或者如果它已打开我想将其显示为当前窗口,明白吗? vb 不是 c#,我知道有转换器,但这不是我要找的。​​span>
  • 我明白了。首先,您查看资源管理器是否已打开。如果是,请检查它浏览到的文件夹(我提供的链接)。如果它在您想要的地方,只需activate 即可。如果没有,请打开一个新的。
  • 好的,谢谢。不过我想知道,是否总是至少有一个 explorer.exe 实例,而不一定是有问题的那个?只是想知道这是否会引起冲突。我会看看我能不能得到你链接到工作的东西。再次感谢您。
  • 如果资源管理器没有打开,它就没有窗口。我的第一个猜测是使用findwindow 或者你可以使用try this

标签: vb.net visual-studio


【解决方案1】:

我试图解决同样的问题,发现它似乎只需要调用 Process.Start 就可以工作:

Process.Start("C:\Temp")

如果文件夹已在资源管理器窗口中打开,则会打开现有窗口,否则会打开新窗口。

【讨论】:

    【解决方案2】:

    你需要导入 Imports System.Runtime.InteropServices

    那么你就可以使用函数 Findwindow

    <DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)> _
    Private Shared Function FindWindow(ByVal lpClassName As String, ByVal lpWindowName As String) As IntPtr
    End Function
    

    然后制作 2 个暗淡 1. 文件夹路径和 2 是文件夹名称
    然后在您的点击事件中使用“System.IO.Path.GetFileName(folderpath)”来获取您正在寻找的窗口的名称。“为您 WIP”

    然后用 if 语句检查 FindWindow(vbNullString, foldername) = 0 "not open"

    vbNullString 表示一个长度为零的字符串,用于打印和显示功能,以及用于调用外部过程。"msdn"

    所以如果 findwindow 为 0 打开文件夹,否则聚焦文件夹

    Dim folderpath As String
    Dim foldername As String
    
    Private Sub Button4_Click(sender As Object, e As EventArgs) Handles Button4.Click
        folderpath = "C:\epds\WIP"
        foldername = System.IO.Path.GetFileName(folderpath)
        If FindWindow(vbNullString, foldername) = 0 Then
            Process.Start("explorer.exe", folderpath)
        Else
            AppActivate(foldername)
            SendKeys.SendWait("~")
        End If
    End Sub
    

    【讨论】:

    • 干净多了,谢谢!另外,是否有办法同时关注 C:\epds\WIP\ 中的文件夹?我遇到的唯一另一个问题是 WIP\ 中的文件夹总是在更改其名称,据我所知,您不能将通配符用于文件夹路径。所以说我在 C:\epds\WIP\SO123456 并且我需要激活该窗口,它不会看到它,因为我已将文件夹路径指向静态 C:\epds\WIP 我想我有太多变量为了实现我的目标,感谢您的帮助@Creator
    • 嗯,有趣的是:如果 C:\epds\WIP\ 中的子文件夹在资源管理器中被选中(突出显示)并且它不是活动窗口,button4_Click 将导航到该子文件夹。如果 WIP 文件夹中没有子文件夹,则它按预期运行,或者如果子文件夹未突出显示,则按预期运行。
    • @EricDeVault 这是因为您发送了密钥 ~ “enter”,然后输入您打开文件夹或文件。也许尝试使用正确的密钥“SendKeys.SendWait("{RIGHT}")”或适合您需要的东西。“然后它不会打开您的 WIP 文件夹中的选定文件夹”
    • 啊,我现在明白了。感谢您的帮助@Creator。我将在 WIP 中的子文件夹呢?像Public tmpDir As New IO.DirectoryInfo("C:\epds\WIP\") 这样的东西会起作用吗?这有点像 or 情况,要么用户在 \WIP 中,要么在 WIP 的子目录中,需要调用以聚焦
    【解决方案3】:

    这有效,不会打开多个窗口:

    Process.Start(new ProcessStartInfo() { FileName = "C:\\", UseShellExecute = true });
    

    唯一的缺点是它不会将打开的文件夹带到前台(这取决于您的用例可能是也可能不是坏事!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-02-03
      • 2014-06-30
      • 2013-10-26
      • 1970-01-01
      • 2012-01-04
      • 2020-03-31
      • 2012-06-30
      相关资源
      最近更新 更多