特定のプロセス(同時に複数のプロセスを実行する)の特定のフォームが表示されるかどうかを監視する必要があるバッチとして実行する必要があるサードパーティの 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 秒以上開いているため、ポール周波数ではありません。
ウィンドウを閉じたり開いたりしたときにコールバックを取得するより信頼できる方法はありますか?