2010-11-18 10 views
0

私は基本的にC#で特殊なマクロプレーヤー/レコーダーを作成しています。私ができることの1つは、ポップアップウィンドウ(名前を付けて保存...ダイアログボックスのようなもの)を待ってからマクロ入力の再生を続行することです。理想的には、開いているウィンドウをポーリングして、一致するウィンドウタイトルのタイトルを検索できるようにしたいと考えています。 明らかに、ダイアログはほとんど新しいプロセスとして表示されないため、Processes.GetProcesses()を使用することはできません。C#ポップアップウィンドウを待って入力用に選択する方法

開いているウィンドウとそのタイトルを取得するにはどうすればよいですか?

答えて

1

開いているすべてのウィンドウをポーリングする場合は、EnumWindows()を使用します。私はこのコードをコンパイルしませんでしたが、機能にはかなり近いはずです。

public class ProcessWindows 
{ 
    List<Window> visibleWindows = new List<Window>(); 
    List<IntPtr> allWindows = new List<IntPtr>(); 

    /// <summary> 
    /// Contains information about visible windows. 
    /// </summary> 
    public struct Window 
    { 
     public IntPtr Handle { get; set; } 
     public string Title { get; set; } 
    } 

    [DllImport("user32.dll")] 
    static extern int EnumWindows(EnumWindowsCallback lpEnumFunc, int lParam); 

    [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)] 
    static extern int GetWindowLong(IntPtr hWnd, int nIndex); 

    [DllImport("user32.dll", CharSet = CharSet.Unicode, SetLastError = true)] 
    private static extern void GetWindowText(IntPtr hWnd, StringBuilder lpString, int nMaxCount); 

    delegate bool EnumWindowsCallback(IntPtr hwnd, int lParam); 

    public ProcessWindows() 
    { 
     int returnValue = EnumWindows(Callback, 0); 
     if (returnValue == 0) 
     { 
      throw new System.ComponentModel.Win32Exception(Marshal.GetLastWin32Error(), "EnumWindows() failed"); 
     } 
    } 

    private bool Callback(IntPtr hwnd, int lParam) 
    { 
     const int WS_BORDER = 0x800000; 
     const int WS_VISIBLE = 0x10000000; 
     const int GWL_STYLE = (-16); 

     // You'll have to figure out which windows you want here... 
     int visibleWindow = WS_BORDER | WS_VISIBLE; 
     if ((GetWindowLong(hwnd, GWL_STYLE) & visibleWindow) == visibleWindow) 
     { 
      StringBuilder sb = new StringBuilder(100); 
      GetWindowText(hwnd, sb, sb.Capacity); 

      this.visibleWindows.Add(new Window() 
      { 
       Handle = hwnd, 
       Title = sb.ToString() 
      }); 
     } 

     return true; //continue enumeration 
    } 

    public ReadOnlyCollection<Window> GetVisibleWindows() 
    { 
     return this.visibleWindows.AsReadOnly(); 
    } 
} 
} 
+0

1つのコメントは、私があなたがWindowTitle.GetText()で何を意味するのか理解できませんでした。私は何のライブラリを私はインポートされていないか、私は行方不明を知りません。代わりに別のuser32関数を使用しました。静的extern int GetWindowText(int hWnd、StringBuilder text、int count); – ashurexm

+0

ああ、申し訳ありません。それは私のアプリケーションの1つの別のクラスへの参照です。私は自分の答えを編集して、自分が何をしているのかを表示します... –

+0

Ok、修正済み。 GetWindowTextの新しいpinvokeステートメントと、WindowTitle.GetText()を使用していた呼び出しを確認します。 (これは、基本的には、とにかく、とにかく、明らかにしたことです。) –

関連する問題