如何判断某个窗口已经成为活动窗口?

原创 2006年06月08日 22:48:00

    我们在软件开发过程中,有的时候需要判断某个窗口是否成为了活动窗口,如果是,就执行一个过程,如果不是就执行另外一个过程。这要如何做到呢,我在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),而门户浏览器是下面的方式启动的:
    可以看出,门户浏览器是用生成对象的方式(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;
    }
}

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;
}

 

C# Windows API应用之GetDesktopWindow ——获得桌面所有窗口句柄的方法

Windows APIWindows 这个多作业系统除了协调应用程序的执行、分配内存、管理资源…之外, 它同时也是一个很大的服务中心,调用这个服务中心的各种服务(每一种服务就是一个函数),可以帮应用程...
  • testcs_dn
  • testcs_dn
  • 2015年04月19日 14:29
  • 18231

SelfService.exe

  • 2014年05月07日 12:54
  • 1.1MB
  • 下载

自己写的判断当前活动窗口是否是全屏状态

//判断屏幕上的一点(niX,niY)所属的process id是否和WDProcessID相同 //返回true表示相同,返回false表示不同 bool CheckSame(DWORD WDPro...
  • liyun123gx
  • liyun123gx
  • 2014年05月08日 11:30
  • 1177

判断当前界面是否是桌面

在安卓开发当中,很多情况下我们需要判断当前的界面是否为桌面。比如,
  • lanhuzi9999
  • lanhuzi9999
  • 2014年04月09日 00:06
  • 1648

MFC:如何判断非模态对话框已经创建了

MFC:如何判断非模态对话框已经创建了           在使用MFC做UI时,经常会进行不同界面(对话框)之间的切换。这时就需要去判断对话框是否已经被创建。创建非模态对话框的两种方式:类的对象...
  • yangxuhui1989
  • yangxuhui1989
  • 2015年03月06日 19:59
  • 1471

判断当前窗口是否是全屏

原文 http://blog.csdn.net/magictong/article/details/4085477
  • liyun123gx
  • liyun123gx
  • 2014年04月23日 15:44
  • 1777

判断窗口是否在最大化状态和最小化状态

1、IsZoomed函数:确定窗口是否是最大化的窗口。    函数原型:BOOL IsZoomed(HWND hWnd);    参数: hWnd:待判断窗口的句柄。    返回值:如果窗口已最...
  • fuck487
  • fuck487
  • 2016年02月28日 23:42
  • 2334

判断手机当前界面是不是Home界面的方法

/** * 判断当前界面是否是在home页面,如果是在home页面,返回true,否则返回false, * 判断是Home界面主要A:找到能能实现Home界面的程序集合,B:处...
  • miao_dingxiao
  • miao_dingxiao
  • 2016年12月08日 14:48
  • 279

c# 获取当前活动窗口句柄,获取窗口大小及位置

需调用API函数 需在开头引入命名空间 using System.Runtime.InteropServices; 获取当前窗口句柄:GetForegroundWindow() [DllI...
  • pangwenquan5
  • pangwenquan5
  • 2014年10月20日 21:09
  • 17288

android悬浮窗口的创建

android悬浮窗口的创建。整个Android的窗口机制是基于一个叫做 WindowManager,这个接口可以添加view到屏幕,也可以从屏幕删除view。它面向的对象一端是屏幕,另一端就是Vie...
  • qq_32969313
  • qq_32969313
  • 2016年06月07日 15:56
  • 355
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:如何判断某个窗口已经成为活动窗口?
举报原因:
原因补充:

(最多只允许输入30个字)