簡體   English   中英

如何將特定文件的資源管理器窗口設置為TopMost窗體的子窗口?

[英]How to set the Explorer window of a specific file as a child window of TopMost form?

我做了一些研究,但我找不到真正“有趣”的東西。 我盡力找到最接近我的案例的任何類型的文檔或問題,如下所示:

如何找到應用程序的主窗口標題名稱

如何獲取進程的窗口標題

如何通過其進程 ID 獲取標題欄文本

獲取進程名稱

如何獲取正在運行的進程名稱列表

檢查進程是否正在運行

如何獲取進程所有者 ID

如何獲取最后一個活動窗口的標題/名稱?

從窗口標題中獲取進程 ID

還有Process.GetProcessesByName 方法

我用來打開進程窗口的代碼

Private Async Function ParentMethod() As Task
       Dim filePath As String = Await Task.Run(
       Function()

           Return Directory.EnumerateFiles(My.Settings.Cartellasalvataggio, titolo & ".mp3",
                         SearchOption.AllDirectories).FirstOrDefault()
       End Function)
       If Not String.IsNullOrEmpty(filePath) Then
           LinkLabel1.Text = "File exist already"
           LinkLabel1.Visible = True
           PictureBox7.Visible = True
       Else
           MsgBox("it doesn't exist")

       End If

   End Function

和助手類

Imports System.IO
Imports System.Runtime.InteropServices

Public Class NativeMethods
   <DllImport("shell32.dll", SetLastError:=True)>
   Private Shared Function SHOpenFolderAndSelectItems(
           pidlFolder As IntPtr, cidl As UInteger,
           <[In], MarshalAs(UnmanagedType.LPArray)> apidl As IntPtr(),
           dwFlags As UInteger) As Integer
   End Function

   <DllImport("shell32.dll", SetLastError:=True)>
   Private Shared Sub SHParseDisplayName(
           <MarshalAs(UnmanagedType.LPWStr)> name As String,
           bindingContext As IntPtr, <Out> ByRef pidl As IntPtr,
           sfgaoIn As UInteger, <Out> ByRef psfgaoOut As UInteger)
   End Sub

   Public Shared Sub OpenFolderAndSelectFile(filePath As String)
       Dim dirPath As String = Path.GetDirectoryName(filePath)
       Dim fileName As String = Path.GetFileName(filePath)
       OpenFolderAndSelectFile(dirPath, fileName)
   End Sub

   Public Shared Sub OpenFolderAndSelectFile(dirPath As String, fileName As String)
       Dim nativeFolder As IntPtr
       Dim psfgaoOut As UInteger
       SHParseDisplayName(dirPath, IntPtr.Zero, nativeFolder, 0, psfgaoOut)

       If nativeFolder = IntPtr.Zero Then
           ' Log error, can't find folder
           Return
       End If

       Dim nativeFile As IntPtr
       SHParseDisplayName(Path.Combine(dirPath, fileName),
                          IntPtr.Zero, nativeFile, 0, psfgaoOut)

       Dim fileArray As IntPtr()
       If nativeFile = IntPtr.Zero Then
           ' Open the folder without the file selected if we can't find the file
           fileArray = New IntPtr(-1) {}
       Else
           fileArray = New IntPtr() {nativeFile}
       End If

       SHOpenFolderAndSelectItems(nativeFolder, CUInt(fileArray.Length), fileArray, 0)

       Marshal.FreeCoTaskMem(nativeFolder)
       If nativeFile <> IntPtr.Zero Then
           Marshal.FreeCoTaskMem(nativeFile)
       End If
   End Sub
End Class

然后用

NativeMethods.OpenFolderAndSelectFile(filepath,filename & "extension"))

由於我以這種方式打開進程而不是使用 Process 類,因此幾乎所有這些都不適合考慮我的情況,因為其中許多都參考記事本,而我認為每個文件的資源管理器窗口標題和 ID 都會更改(顯然),在“記事本”過程中,保持“記事本”。

我也嘗試過BringToFront,但后者將一個控件移動到其他控件的前面,但在這種情況下,Explorer 不是一個控件,對吧?

我最不想做的是獲取活動窗口及其進程名稱的列表,因為它會無緣無故地浪費內存和時間,因為我需要“過濾”進程以找到我的進程。

希望我們能找到解決方案,提前致謝。 馬蒂亞

這是使用 FindWindowW e SetWindowPos Api 的解決方案。 它在最頂部的窗體上顯示資源管理器文件夾。

   <DllImport("user32.dll", EntryPoint:="FindWindowW")>
   Public Shared Function FindWindowW(<MarshalAs(UnmanagedType.LPTStr)> ByVal lpClassName As String, <MarshalAs(UnmanagedType.LPTStr)> ByVal lpWindowName As String) As IntPtr
   End Function
   <DllImport("user32.dll")>
   Shared Function SetWindowPos(ByVal hWnd As IntPtr, ByVal hWndInsertAfter As IntPtr, ByVal X As Integer, ByVal Y As Integer, ByVal cx As Integer, ByVal cy As Integer, ByVal uFlags As UInteger) As Boolean
   End Function
Shared ReadOnly HWND_TOPMOST As IntPtr = New IntPtr(-1)
   Const SWP_NOSIZE As UInt32 = &H1
   Const SWP_NOMOVE As UInt32 = &H2
   Const SWP_SHOWWINDOW As UInt32 = &H40
Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click


       Dim inptr = FindWindowW("CabinetWClass", Nothing)
       SetWindowPos(inptr, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE Or SWP_SHOWWINDOW)
   End Sub

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM