2011-09-01 20 views

答えて

26

何か:

using System.Diagnostics; 

Process[] processlist = Process.GetProcesses(); 

foreach (Process process in processlist) 
{ 
    if (!String.IsNullOrEmpty(process.MainWindowTitle)) 
    { 
     Console.WriteLine("Process: {0} ID: {1} Window title: {2}", process.ProcessName, process.Id, process.MainWindowTitle); 
    } 
} 
+21

は、彼が唯一の各プロセスのメインウィンドウになるだろう、このように、彼は内のすべての開いているウィンドウを求めましたシステム。 –

+0

彼は言う:「すべてのオープンアプリの名前にもっと似ている」。 – CodeCaster

+0

Davide pirasが正しいです。私は開いている窓がすべて必要です。 Intrarntの脆弱性のようなタブ。どんな方法?再度、感謝します! –

1

あなたはEnumWindow APIを使用する必要があります。

のC#からそれを使用する方法の例の多くがあり、私はここで何かを見つけた:

Get Application's Window Handles

Issue with EnumWindows

+0

私はそれを理解しています。あなたは私にexsple、plesaeを与えることができますか? –

+2

リンクのみの回答は答えではありません。 – zzzzBov

4

は私にいくつかのエラーを与える前の回答に基づいて、finaly私はGetOpenedWindows機能で、このコードを使用します。

public class InfoWindow 
{ 
      public IntPtr Handle = IntPtr.Zero; 
      public FileInfo File = new FileInfo(Application.ExecutablePath); 
      public string Title = Application.ProductName; 
      public override string ToString() { 
       return File.Name + "\t>\t" + Title; 
      } 
}//CLASS 

/// <summary>Contains functionality to get info on the open windows.</summary> 
public static class RuningWindows 
{ 
      internal static event EventHandler WindowActivatedChanged;  
      internal static Timer TimerWatcher = new Timer();  
      internal static InfoWindow WindowActive = new InfoWindow();  
      internal static void DoStartWatcher() { 
       TimerWatcher.Interval = 500; 
       TimerWatcher.Tick += TimerWatcher_Tick; 
       TimerWatcher.Start();  
      }      

      /// <summary>Returns a dictionary that contains the handle and title of all the open windows.</summary> 
      /// <returns>A dictionary that contains the handle and title of all the open windows.</returns> 
      public static IDictionary<IntPtr , InfoWindow> GetOpenedWindows() 
      { 
       IntPtr shellWindow = GetShellWindow(); 
       Dictionary<IntPtr , InfoWindow> windows = new Dictionary<IntPtr , InfoWindow>(); 

       EnumWindows(new EnumWindowsProc(delegate(IntPtr hWnd , int lParam) { 
        if (hWnd == shellWindow) return true; 
        if (!IsWindowVisible(hWnd)) return true;  
        int length = GetWindowTextLength(hWnd); 
        if (length == 0) return true;  
        StringBuilder builder = new StringBuilder(length); 
        GetWindowText(hWnd , builder , length + 1);  
        var info = new InfoWindow(); 
        info.Handle = hWnd; 
        info.File = new FileInfo(GetProcessPath(hWnd)); 
        info.Title = builder.ToString();  
        windows[hWnd] = info; 
        return true;  
       }) , 0);  
       return windows; 
      } 

      private delegate bool EnumWindowsProc(IntPtr hWnd , int lParam); 

      public static string GetProcessPath(IntPtr hwnd) 
      { 
       uint pid = 0; 
       GetWindowThreadProcessId(hwnd , out pid); 
       if (hwnd != IntPtr.Zero) { 
        if (pid != 0) { 
         var process = Process.GetProcessById((int) pid); 
         if (process != null) { 
          return process.MainModule.FileName.ToString(); 
         } 
        } 
       } 
       return ""; 
      }  

      [DllImport("USER32.DLL")] 
      private static extern bool EnumWindows(EnumWindowsProc enumFunc , int lParam); 

      [DllImport("USER32.DLL")] 
      private static extern int GetWindowText(IntPtr hWnd , StringBuilder lpString , int nMaxCount); 

      [DllImport("USER32.DLL")] 
      private static extern int GetWindowTextLength(IntPtr hWnd); 

      [DllImport("USER32.DLL")] 
      private static extern bool IsWindowVisible(IntPtr hWnd); 

      [DllImport("USER32.DLL")] 
      private static extern IntPtr GetShellWindow(); 

      [DllImport("user32.dll")] 
      private static extern IntPtr GetForegroundWindow(); 

      //WARN: Only for "Any CPU": 
      [DllImport("user32.dll" , CharSet = CharSet.Auto , SetLastError = true)] 
      private static extern int GetWindowThreadProcessId(IntPtr handle , out uint processId);  


      static void TimerWatcher_Tick(object sender , EventArgs e) 
      { 
       var windowActive = new InfoWindow(); 
       windowActive.Handle = GetForegroundWindow(); 
       string path = GetProcessPath(windowActive.Handle); 
       if (string.IsNullOrEmpty(path)) return; 
       windowActive.File = new FileInfo(path); 
       int length = GetWindowTextLength(windowActive.Handle); 
       if (length == 0) return; 
       StringBuilder builder = new StringBuilder(length); 
       GetWindowText(windowActive.Handle , builder , length + 1); 
       windowActive.Title = builder.ToString(); 
       if (windowActive.ToString() != WindowActive.ToString()) { 
        //fire: 
        WindowActive = windowActive; 
        if (WindowActivatedChanged != null) WindowActivatedChanged(sender , e); 
        Console.WriteLine("Window: " + WindowActive.ToString()); 
       } 
      } 

}//CLASS 

警告:あなたが唯一の「任意のCPU」の下compil /デバッグは、32ビットAppsにアクセスするためにすることができます。 ..

0

Heraは、Tabs.Here上で操作が実行された後に呼び出さなければならないUpdateWindowsList_WindowMenu()です。windowToolStripMenuItemは、ウィンドウメニューからメニューストリップに追加されるメニュー項目です。

public void UpdateWindowsList_WindowMenu() 
{ 
    //get all tab pages from tabControl1 
    TabControl.TabPageCollection tabcoll = tabControl1.TabPages; 

    //get windowToolStripMenuItem drop down menu items count 
    int n = windowToolStripMenuItem.DropDownItems.Count; 

    //remove all menu items from of windowToolStripMenuItem 
    for (int i = n - 1; i >=2; i--) 
    { 
     windowToolStripMenuItem.DropDownItems.RemoveAt(i); 
    } 

    //read each tabpage from tabcoll and add each tabpage text to windowToolStripMenuItem 
    foreach (TabPage tabpage in tabcoll) 
    { 
     //create Toolstripmenuitem 
     ToolStripMenuItem menuitem = new ToolStripMenuItem(); 
     String s = tabpage.Text; 
     menuitem.Text = s; 

     if (tabControl1.SelectedTab == tabpage) 
     { 
      menuitem.Checked = true; 
     } 
     else 
     { 
      menuitem.Checked = false; 
     } 

     //add menuitem to windowToolStripMenuItem 
     windowToolStripMenuItem.DropDownItems.Add(menuitem); 

     //add click events to each added menuitem 
     menuitem.Click += new System.EventHandler(WindowListEvent_Click); 
    } 
} 

private void WindowListEvent_Click(object sender, EventArgs e) 
{ 
    //casting ToolStripMenuItem to ToolStripItem 
    ToolStripItem toolstripitem = (ToolStripItem)sender; 

    //create collection of tabs of tabContro1 
    //check every tab text is equal to clicked menuitem then select the tab 
    TabControl.TabPageCollection tabcoll = tabControl1.TabPages; 
    foreach (TabPage tb in tabcoll) 
    { 
     if (toolstripitem.Text == tb.Text) 
     { 
      tabControl1.SelectedTab = tb; 
      //call UpdateWindowsList_WindowMenu() to perform changes on menuitems 
      UpdateWindowsList_WindowMenu(); 
     } 
    } 
} 
3

開いているすべてのウィンドウのリストを取得するためのコードです。実際には、各項目がKeyValuePairであり、キーがウィンドウのハンドル(hWnd)であり、値がそのタイトルである辞書を取得します。

using HWND = IntPtr; 

/// <summary>Contains functionality to get all the open windows.</summary> 
public static class OpenWindowGetter 
{ 
    /// <summary>Returns a dictionary that contains the handle and title of all the open windows.</summary> 
    /// <returns>A dictionary that contains the handle and title of all the open windows.</returns> 
    public static IDictionary<HWND, string> GetOpenWindows() 
    { 
    HWND shellWindow = GetShellWindow(); 
    Dictionary<HWND, string> windows = new Dictionary<HWND, string>(); 

    EnumWindows(delegate(HWND hWnd, int lParam) 
    { 
     if (hWnd == shellWindow) return true; 
     if (!IsWindowVisible(hWnd)) return true; 

     int length = GetWindowTextLength(hWnd); 
     if (length == 0) return true; 

     StringBuilder builder = new StringBuilder(length); 
     GetWindowText(hWnd, builder, length + 1); 

     windows[hWnd] = builder.ToString(); 
     return true; 

    }, 0); 

    return windows; 
    } 

    private delegate bool EnumWindowsProc(HWND hWnd, int lParam); 

    [DllImport("USER32.DLL")] 
    private static extern bool EnumWindows(EnumWindowsProc enumFunc, int lParam); 

    [DllImport("USER32.DLL")] 
    private static extern int GetWindowText(HWND hWnd, StringBuilder lpString, int nMaxCount); 

    [DllImport("USER32.DLL")] 
    private static extern int GetWindowTextLength(HWND hWnd); 

    [DllImport("USER32.DLL")] 
    private static extern bool IsWindowVisible(HWND hWnd); 

    [DllImport("USER32.DLL")] 
    private static extern IntPtr GetShellWindow(); 
} 

そして、ここでそれを使用していくつかのコードです:

foreach(KeyValuePair<IntPtr, string> window in OpenWindowGetter.GetOpenWindows()) 
{ 
    IntPtr handle = window.Key; 
    string title = window.Value; 

    Console.WriteLine("{0}: {1}", handle, title); 
} 

クレジット:http://www.tcx.be/blog/2006/list-open-windows/

+1

このコードを使用しようとしましたが、最初の行を 'HWND = System.IntPtr; –

関連する問題