0

特定のプロセス(同時に複数のプロセスを実行する)の特定のフォームが表示されるかどうかを監視する必要があるバッチとして実行する必要があるサードパーティの winforms ソフトウェアがあります。

このメソッドを使用して、プロセスのすべてのウィンドウ ハンドルを取得しました

public IEnumerable<int> EnumerateProcessWindowHandles(int processId)
{
    var handles = new List<IntPtr>();
    try
    {

        foreach (ProcessThread thread in Process.GetProcessById(processId).Threads)
            Win32.EnumThreadWindows(thread.Id,
                (hWnd, lParam) => { handles.Add(hWnd); return true; }, IntPtr.Zero);

    }
    catch(Exception e) {}
    return handles.Select(h => (int)h);
}

次に、このメソッドは、hwnd からウィンドウのキャプションを取得します

public string GetTitle(int hwnd)
{
    int length = Win32.SendMessage((IntPtr)hwnd, Win32.WM_GETTEXTLENGTH, 0, IntPtr.Zero);
    var sb = new StringBuilder(length + 1);
    Win32.SendMessage((IntPtr)hwnd, Win32.WM_GETTEXT, (IntPtr)sb.Capacity, sb);
    return sb.ToString();
}

毎秒上記の方法でプロセスをポーリングしますが、表示されているウィンドウを検出できないことがあります。問題のウィンドウは 1 秒以上開いているため、ポール周波数ではありません。

ウィンドウを閉じたり開いたりしたときにコールバックを取得するより信頼できる方法はありますか?

4

2 に答える 2

1

おそらく、ウィンドウの作成と破棄をリッスンする最もクリーンな方法は、CBT フックを使用することです。HCBT_CREATEWNDとを聞きHCBT_DESTROYWNDます。この MSDN の記事、.NET Framework の Windows フック では、.net の観点から主題を取り上げています。

于 2013-04-15T10:47:16.447 に答える
-1

多分それは助けることができます

[1] http://spradip.wordpress.com/category/programming-c/page/2/

これは ms C++ の例です

[2] http://msdn.microsoft.com/en-us/library/windows/desktop/ms686701(v=vs.85).aspx

于 2013-04-15T11:17:42.360 に答える