檔案總管的標題是存在的,但是可能僅為目錄名,或完整路徑,視選項內設定而定。你可以用 Spy++ 確認。
如果照你這篇說的目的,我會用
[邏輯 (虛擬碼)]
1. hDeskWnd = GetDesktopWindow
2. arrHWnd = EnumChildWindows(hDeskWnd)
3. arrProcessId = GetWindowThreadProcessId(arrHWnd)
4. arrProcessId 跟 Process 類別比對,找出檔名是 explorer.exe 的(也可以呼叫 API Process32Next 來找,不過 Process 已經包裝好了,這邊就不用呼叫 API )
5. 過濾完的 hWnd 用 GetWindowText(hWnd) 取得視窗標題。
6. 目標關閉視窗用 SendMessage(WM_CLOSE) 來處理,若不行才考慮 Process.Kill 。
-----------------------------------------------------------------------------
視窗叫 Window
程序叫 Process
要處理程序請參考 Process 類別 (System.Diagnostics.Process) ,所有 Get 開頭的方法,選你要的。
------------------------------------------------------------------------------
Public Class Form1
Dim p As Process
Dim processes() As Process
'列出處理程序
Private Sub ShowProcess()
Dim AddProcessItem As ListViewItem
ListView1.Items.Clear()
processes = Process.GetProcesses
For Each p In processes
AddProcessItem = ListView1.Items.Add(p.MainWindowTitle)
AddProcessItem.SubItems.Add(p.ProcessName)
AddProcessItem.SubItems.Add(p.Id.ToString)
Next
End Sub
Private Sub btnProcess_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnProcess.Click
ShowProcess()
End Sub
'關閉處理程序
Private Sub btnClose_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnClose.Click
Try
Dim processID As Integer = System.Convert.ToInt32(ListView1.SelectedItems(0).SubItems(2).Text)
Dim p As Process = Process.GetProcessById(processID)
p.Kill()
p.WaitForExit()
ShowProcess()
Catch ex As System.NullReferenceException
MessageBox.Show(ex.Message)
ShowProcess()
End Try
End Sub
End Class
Form1.Designer.vb
'ListView1
'
Me.ListView1.Columns.AddRange(New System.Windows.Forms.ColumnHeader() {Me.ColumnHeader1, Me.ColumnHeader2, Me.ColumnHeader3})
Me.ListView1.Location = New System.Drawing.Point(12, 12)
Me.ListView1.MultiSelect = False
Me.ListView1.Name = "ListView1"
Me.ListView1.Size = New System.Drawing.Size(463, 168)
Me.ListView1.TabIndex = 0
Me.ListView1.UseCompatibleStateImageBehavior = False
Me.ListView1.View = System.Windows.Forms.View.Details
'
'ColumnHeader1
'
Me.ColumnHeader1.Text = "視窗標題"
Me.ColumnHeader1.Width = 270
'
'ColumnHeader2
'
Me.ColumnHeader2.Text = "處理程序"
Me.ColumnHeader2.Width = 120
'
'ColumnHeader3
'
Me.ColumnHeader3.Text = "處理序 ID"
Me.ColumnHeader3.Width = 65
----------------------------------------------------------------
要處理程序請參考 Process 類別
視窗標題無法使用 Process 類別直接取得。
要處理其他視窗標題的,都需要呼叫 API ,比如說 FindWindow 、EnumWindow 等,再由 hWnd 取的 ProcessId 對應到 Process 。
你已知什麼?欲求什麼請明確說明。
註:檔案總管比較特別,跟 IE 都是繼承 InternetExplorer Object ,所以可以直接從 Shell.Application 取得目前所有開啟中的 File Explorer 跟 Internet Explorer ,進而取得 Url 或其他資訊。
---------------------------------------------------------------------
Dim allProcess As Process() = Process.GetProcesses
For i = 0 To allProcess.Length - 1
Debug.Print(allProcess(i).ProcessName)
Next |