在C#中,如何判断某个窗口已经成为活动窗口?

    我们在软件开发过程中,有的时候需要判断某个窗口是否成为了活动窗口,如果是,就执行一个过程,如果不是就执行另外一个过程。这要如何做到呢,我在Web自助终端整合项目需求变更中就遇到了这样的问题,通过查找相关资料,我通过下面的方法解决:

    首先我们定义一个API函数:GetForegroundWindow(),这个函数在MSDN中的描述是这样的:

    The GetForegroundWindow function returns a handle to the foreground window (the window with which the user is currently working)

    翻译成中文就是GetForegroundWindow()函数返回当前活动窗口的句柄。有了这个函数,再加上.netFrameWork中提供的Process类,我们就可以判断某个进程的主窗口是否已经成为活动窗口。如下面所示:

[DllImport("user32.dll")]

private static extern IntPtr GetForegroundWindow();

//枚举SelfService进程到一个进程数组

foreach(System.Diagnostics.Process myproc in System.Diagnostics.Process.GetProcessesByName("SelfService"))

  {

     if(myproc.MainWindowHandle.ToInt32()==GetForegroundWindow().ToInt32())

     {

            //SelfService进程的主窗口成为活动窗口

            //do what you want here...

     }

     else

     {

             //SelfService进程的主窗口不是活动窗口

             //do what you want here...

     }

   }

    但是我通过上面这种处理方法,无法得到正常的结果,后面通过分析,发现:程序由定制浏览器监控程序(SSMonitor.exe)启动,监控程序启动后,由监控程序启动一个单独的进程来启动定制浏览器(SelfService.exe),而门户浏览器是下面的方式启动的:

private void axWebBrowser1_NewWindow2(object sender, AxSHDocVw.DWebBrowserEvents2_NewWindow2Event e)

{

     //Function action:To nevigate the WWW.ICBC.COM.CN 

     this.TopMost=false;

     //清空页面限制计数器

     PortalBrowser.pbcount=0;

     pBrowser=new PortalBrowser();

     pBrowser.Text="Pbrowser";

     pBrowser.axWebBrowser1.RegisterAsBrowser=true;

     e.ppDisp=pBrowser.axWebBrowser1.Application;

     pBrowser.Visible=true;

}

    可以看出,门户浏览器是用生成对象的方式(PortalBrowser类的实例)来启动的,这样启动以后,门户浏览器的句柄和定制浏览器的句柄是一样的,所以,不论定制浏览器是当前活动活动窗口,还是门户浏览器是当前活动窗口,下面的判断都是成立的,这就是导致程序运行不正确的原因:

    if(myproc.MainWindowHandle.ToInt32()==GetForegroundWindow().ToInt32())

    修改程序后,通过判断Process.GetProcessesByName()返回的进程的窗口标题作为判断的依据,代码如下:

private bool GetCurrentWindow()

{

   bool is_fb=false;

   try

   {

     foreach(System.Diagnostics.Process myproc in System.Diagnostics.Process.GetProcessesByName("SelfService"))

       {

          //if(myproc.MainWindowHandle.ToInt32()==GetForegroundWindow().ToInt32())

          if(myproc.MainWindowTitle=="Pbrowser")

          {

             //当前窗口是门户浏览器

             is_fb=false;

          }

          else if(myproc.MainWindowTitle=="FormBrowser")

          {

             //当前窗口是定制浏览器

             is_fb=true;

          }

          break;

        }

    }

    catch(Exception ex)

    {

       //MessageBox.Show("检测系统发现没有启动定制浏览器!");

    }

    if(is_fb==true)

    {

       return true;

    }

    else

    {

       return false;

    }

}

转载于:https://www.cnblogs.com/ajiefj/archive/2010/03/31/1701725.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值