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

delphi 获取有输入焦点的活动窗口信息 阅读详情

    我们在软件开发过程中,有的时候需要判断某个窗口是否成为了活动窗口,如果是,就执行一个过程,如果不是就执行另外一个过程。这要如何做到呢,我在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;
}

 

RADIOML 2018.01A调制信号数据集介绍及处理 RadioML 2018.01A 由 DeepSig 发布,是专门针对自动调制识别(Automatic Modulation Recognition, AMR)和无线信号分类研究设计的基准数据集。它在原有 RadioML 2016.10a 的基础上,扩展并精细化了信道仿真模型,使得信号更接近真实无线环境下的表现。该数据集广泛用于机器学习模型的训练与评估,为各类深度学习算法提供了统一、可重复的实验条件。 阅读详情

相关推荐

sam3.1 部署笔记 推理封装

sam3.1 部署笔记

jacke121的专栏 400

GetForegroundWindow获取系统最前端的窗口

1、GetActiveWindow返回线程的活动窗口,而不是系统的活动窗口。如果要得到用户正在激活的窗口,应该使用 GetForegroundWindow。 2、例如

勿忘初心,安得始终 2万+

delphi 自动抓取当前活动窗体

delphi 自动抓取当前活动窗体非常不错

随记一则(GetForegroundWindow获取窗口句柄)

今天调一个控制台程序,大意是在控制台输出一个位图,使用GetForegroundWindow函数获取窗口句柄。死活获取不到vs的小黑窗,导致图画不出来。(为什么知道是获取不到呢,因为那个图有一回甚至画在了我的桌面上,说明获取句柄获取错了)遂猜测是不是因为这个,于是进入cmd,输入wt打开一个新终端,在一个向下的标志处点开设置,将默认终端应用程序设为windows控制台主机,遂解决。机缘巧合之下,发现控制台小黑窗竟然是powershell,不是以前的命令提示符。这究竟是怎么回事,希望未来某一天能知道。

qq_52144555的博客 1151

GetActiveWindow与GetForegroundWindow两者有何区别?

来自MSDN:   The active window is either the window that has the current input focus or the window explicitly made active by the SetActiveWindow member function    The foreground window applies only to

yazi1297的专栏 2万+

2.GetForegroundWindow函数及ShowWindow函数

GetForegroundWindow语法:GetForegroundWindow();通过这两个函数,我们可以获得比如我们正在运行窗口的句柄,使用一些函数的必要条件。第一个函数是获取正在激活的窗口句柄的,第二个是控制窗口隐藏、显示等等的。对比上一章,就是将运行框隐藏起来了,如果觉得不满意,下一章,绝对好玩。ShowWindow语法:ShowWindow(hwnd,指令)SW_HIDE (隐藏),SW_SHOW (显示)而第二个就是一个实用性很高的函数。已经知道了恶搞代码,这一期我们给它加一些。

2301_80089915的博客 1207

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

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

weixin_30836759的博客 744

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

//判断屏幕上的一点(niX,niY)所属的process id是否和WDProcessID相同 //返回true表示相同,返回false表示不同 bool CheckSame(DWORD WDProcessID,int niX,int niY) { bool lbRet = false; POINT lpt={niX,niY}; HWND lhwnd= (HWND)WindowFromP

Lydia的博客 2304

判断窗口是否活动窗口

看了很多人写的判断方法,总觉得有很多多余的东西,正面写下我写的 /* 本段代码是在一个Form的方法的一部分 */ if (Win32Helper.GetForegroundWindow() == this.Handle) { // todo } /* 本段代码是类Win32Help

lihb018的专栏 3151

如何判断存在弹出窗体?如何判断当前窗口活动窗口

如何判断存在弹出窗体? Application.OpenForms属性,当此属性返回的集合的Count值大于1时表示当前窗体存在弹出窗体; 如何判断当前窗口活动窗口? Form.ActiveForm,表示当前应用程序中的活动窗口

jzt_designer的专栏 3832

java 获取活动窗口_用Java获取活动窗口信息

小编典典减轻您的痛苦,并使用JNA。您将需要下载Win32 API的 jna.jar 和 jna -platform.jar。该PInvoke的wiki和MSDN是找到合适的系统调用是有用的。无论如何,这是用于打印当前活动窗口的标题和过程的代码。import static enumeration.EnumerateWindows.Kernel32.*;import static enumerati...

weixin_42313675的博客 1481

QT设置活动窗口

QT设置活动窗口 遇到一个QT窗口问题记录下,已经显示的窗口被其他窗口遮挡。再调用show无法将窗口激活显示到最前面。解决方式如下: if(!isActiveWindow()) //判断是否活动窗口 { activateWindow(); //设置成活动窗口 } 这样窗口就会被激活。 ...

qq_42281306的博客 4526

qt获取多窗口活动窗口

活动窗口发送按键事件,直接上测试代码。

TT的博客 1069

Linux下判断活动窗口是否全屏

Linux下判断活动窗口是否全屏

qq_41264992的博客 785

.Net - C# 如何判断程序里某个窗体是否为Windows的当前活动窗体?(附代码)

private void timer1_Tick(object sender, EventArgs e)         {             foreach (Form f in Application.OpenForms)             {                 Console.WriteLine("Name: " + f.Name + " Focused:"

编程岁月 3307

C#获取当前激活窗口-GetActiveWindow与GetForegroundWindow两者有何区别

然后你正在EXCEL表格中编辑,那么使用GetForegroundWindow获取到的就是QQ2的指针函数,因为无论你打开什么软件,QQ2都在最上层显示。原文链接:https://blog.csdn.net/lijian2017/article/details/80620053。当使用GetActiveWindow 你获取到的就是EXCEL表格的指针函数,因为输入的焦点在EXCEL上。GetActiveWindow() 是你的程序的当前激活的窗口

喜欢自学并分享经验的技术宅 5282

win32-GetActiveWindow和GetForegroundWindow

最近被这两个api搞得有点晕,故查阅了相关的资料。 这篇文章解释的很好:https://devblogs.microsoft.com/oldnewthing/20081006-00/?p=20643 测试代码: case WM_LBUTTONDOWN: { HWND h1 = GetFocus(); HWND h2 = GetAc...

qq_39529180的博客 352

判断当前窗体是否为Windows活动窗体?

[System.Runtime.InteropServices.DllImport("user32")]          private    static    extern    IntPtr    GetActiveWindow();                  private    bool    ThisIsActive()          {               re

编程岁月 1692

Http自动发送请求软件(自动化测试http请求)

【更新日期:2026-03-04】【版本:V1.0.7】详细说明:https://tingyu.blog.csdn.net/article/details/143800144在现代软件开发过程中,HTTP 请求的自动化测试是确保应用程序稳定性和可靠性的关键环节。为了满足这一需求,我开发了一款功能强大且易于使用的自动化 HTTP 请求发送工具。该工具基于 C# 开发,集成了项目管理、接口管理、日志查看等功能,能够高效地模拟各种 HTTP 请求场景。以下将详细介绍该软件的功能特点和使用方法。软件运行环境:Win10 x64编译工具:Visual Studio 2022开发语言:C# WinForm这款基于 C# 开发的自动化 HTTP 请求发送工具,为用户提供了一个高效、灵活、易用的测试平台。通过集成项目管理、接口管理、日志查看等功能,工具能够满足用户在测试和开发过程中对 HTTP 请求测试的需求。异步发送和并发处理功能进一步增强了工具的性能和用户体验,使得 HTTP 请求测试过程更加便捷和高效。无论是开发人员还是测试人员,这款工具都能成为他们日常工作中不可或缺的助手。

上一篇: 一位老工程师给年轻人的“十大忠告”
下一篇: 枚举系统字体
捷哥1999
博客等级 码龄25年 1090粉丝 12原创
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值