我怎样才能确定是否从另一个应用程序的窗口是可见的?

我最近获得了WinX DVD Ripper Platinum的许可证,并且很担心这个事实,当它完成撕毁DVD的时候,它并没有告诉我这么做。 没有popup窗口,没有系统“嘟嘟” – 什么也没有。 进度对话框简单地closures。 主窗口甚至不关注自己…

为了加快我的DVD翻录过程,我做了一个简单的控制台应用程序(使用C#和VS2010):

  1. 查找名为“WinX_DVD_Ripper_Platinum”(WinX DVD Ripper Platinum软件的进程名称)的进程的句柄,
  2. pinvoke.net上使用本示例中定义的GetChildWindows方法在该进程中查找进度对话框的句柄
  3. 启动一个System.Timers.Timer实例,该实例检查(或应该检查)进度对话框是否每5秒closures一次(使用GetWindowLong函数 ,
  4. 使用System.Console.Beep方法发出几声嘟嘟声,告诉用户rip已完成。 定时器会自动复位,每5秒钟执行一次检查(或者在对话框closures的情况下重复发出嘟嘟声),直到用户按下控制台窗口中的某个键。

步骤1,2和4工作正常,但我有步骤3这个问题,我的问题是,我应该使用哪个窗口样式常量来检查窗口是否可见? (WS_VISIBLE没有工作…)

有关更多详细信息,这是我用来检查对话框的可见性的函数:

 private static bool IsWindowVisible(IntPtr hwnd) { var style = GetWindowLong(hwnd, GWL.GWL_EXSTYLE); var visible = style & (WS flag goes here); return visible != 0; } 

你尝试过使用IsWindowVisible()来代替吗?