免費論壇 繁體 | 簡體
Sclub交友聊天~加入聊天室當版主
分享
返回列表 回復 發帖

抓取視窗參考

檔案總管的標題是存在的,但是可能僅為目錄名,或完整路徑,視選項內設定而定。你可以用 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
返回列表