热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

VC++获取句柄的各种方法(转载)

VC各种情况下的窗口句柄的获取收藏AfxGetMainWndAfxGetMainWnd获取自身窗口句柄HWNDhWndAfxGetMainWnd()-m_hWnd;GetTopW

VC 各种情况下的窗口句柄的获取 收藏

AfxGetMainWnd

 

AfxGetMainWnd获取自身窗口句柄

 

HWND hWnd = AfxGetMainWnd()->m_hWnd;

 

 

GetTopWindow

 

函数功能:该函数检查与特定父窗口相联的子窗口z序(Z序:垂直屏幕的方向,即叠放次序),并返回在z序顶部的子窗口的句柄。

函数原型:HWND GetTopWindow(HWND hWnd);

参数:

  hWnd:被查序的父窗口的句柄。如果该参数为NULL,函数返回Z序顶部的窗口句柄。

返回值:

    如果函数成功,返回值为在Z序顶部的子窗口句柄。如果指定的窗口无子窗口,返回值为NULL

 

 

GetForegroundWindow

函数功能:该函数返回当前系统的前台窗口的窗口句柄。

函数原型:HWND GetForegroundWindow(VOID)  

返回值:函数返回前台窗回的句柄。

 

 

GetActiveWindow

 

函数功能:该函数可以获得与调用该方法的线程的消息队列相关的活动窗口的窗口句柄(就是取得当前进程的活动窗口的窗口句柄)。

 

函数原型:HWND GetActiveWindow(VOID)

 

返回值:返回值是与调用线程的消息队列相关的活动窗口的句柄。否则,返回值为NULL

 

GetSafeHwnd

 

函数功能:获取某个窗口对象(CWnd的派生对象)指针的句柄(HWND)时,最安全的方法是使用GetSafeHwnd()函数。

通过下面的例子来看其理由:

  CWnd *pwnd = FindWindow(ExploreWClass,NULL); //希望找到资源管理器

 

  HWND hwnd = pwnd->m_hwnd; //得到它的HWND

 

  这样的代码当开始得到的pwnd为空的时候就会出现一个“General protection error,并关闭应用程序,因为一般不能对一个NULL指针访问其成员,如果用下面的代码:

 

  CWnd *pwnd = FindWindow(ExploreWClass,NULL); //希望找到资源管理器

 

  HWND hwnd = pwnd->GetSafeHwnd(); //得到它的HWND

 

  就不会出现问题,因为尽管当pwndNULL时,GetSafeHwnd仍然可以用,只是返回NULL

 

 

IsWindowVisible

函数功能:该函数获得给定窗口的可视状态。

 

函数原型:BOOL IsWindowVisible(HWND hWnd);

 

参数;

 

  hWnd:被测试窗口的句柄。

 

返回值:

    如果指定的窗口及其父窗口具有WS_VISIBLE风格,返回值为非零;如果指定的窗口及其父窗口不具有WS_VISIBLE风格,返回值为零。由于返回值表明了窗口是否具有Ws_VISIBLE风格,因此,即使该窗口被其他窗口遮盖,函数返回值也为非零。

备注:

    窗口的可视状态由WS_VISIBLE位指示。当设置了WS_VISIBLE位,窗口就可显示,而且只要窗口具有WS_VISIBLE风格,任何画在窗口的信息都将被显示。

 

 

IsWindow

函数功能:该函数确定给定的窗口句柄是否标示一个已存在的窗口。 

函数原型:BOOL IsWindow(HWND hWnd);

参数:

    hWnd:被测试窗口的句柄。

返回值:

    如果窗口句柄标识了一个已存在的窗口,返回值为TURE;如果窗口句柄未标识一个已存在窗口,返回值为FALSE

 

FindWindow

HWND FindWindow(LPCSTR lpClassName,LPCSTR lpWindowName );

参数:

lpClassName

 

  指向一个以null结尾的、用来指定类名的字符串或一个可以确定类名字符串的原子。如果这个参数是一个原子,那么它必须是一个在调用此函数前已经通过GlobalAddAtom函数创建好的全局原子。这个原子(一个16bit的值),必须被放置在lpClassName的低位字节中,lpClassName的高位字节置零。

 

lpWindowName

 

  指向一个以null结尾的、用来指定窗口名(即窗口标题)的字符串。如果此参数为NULL,则匹配所有窗口名。

返回值:

如果函数执行成功,则返回值是拥有指定窗口类名或窗口名的窗口的句柄。

 

  如果函数执行失败,则返回值为 NULL 。可以通过调用GetLastError函数获得更加详细的错误信息。

SetWindowText:

至于窗口标题的改变,我们可以通过SetWindowText来实现

注:如果窗口本身属性是不显示标题的,这个函数的调用不会影响窗口属性。

//Set title for application’s main frame window .

AfxGetMainWnd ( ) —> SetWindowText (_T("Application title") )

 

//Set title for View’s MDI child frame window .

GetParentFrame ( ) —> SetWindowText ("_T ("MDI Child Frame new title") )

 

//Set title for dialog’s push button control.

GetDigitem (IDC_BUTTON) —> SetWindowText (_T ("Button new title ") )

 

其他:

 

1、直接得句柄

        GetActiveWindow();        //得激活窗口句柄

 

        GetForegroundWindow();           //的前台窗口句柄

 

       AfxGetApp()->GetMainWnd()->GetSafeHwnd()      //很常规的,涉及到很多方法

 

2、枚举型的

 

     HWND GetWindow(HWND hWnd, UINT uCmd );      //要先有hWnd,然后指明uCmd 的关系

 

     HWND FindWindowEx( HWND hwndParent,

 

                                         HWND hwndChildAfter,  

 

                                         LPCTSTR lpszClass, L

 

                                         PCTSTR zWindow);   

 

     //由类名和窗口标题得句柄,可能不只一个,所以不唯一确定

 

3、其他参数的句柄

 

     进程ID:

 

    MARK:由句柄得ID可以用GetWindowThreadProcessId()

 

    而由ID的句柄只能枚举+比较了

 

历遍全部窗体,并取得他们对应的HWND进一步取得对应PID,符合已知PID的就是了,当然可能要判断一下窗体状态了,如果进程只有一个窗体那就不用了。

 

:

如果要在列表框里显示所有的窗口

BOOL CALLBACK EnumWindowsProc(

   HWND hwnd,       // handle to parent window

   LPARAM lParam    // application-defined value

)

{

char lpWinTitle[256]; 

::GetWindowText(hwnd,lpWinTitle,256-1); 

CString m_strTitle;

m_strTitle.Format("%s",lpWinTitle);

CListBox *p_l = (CListBox *)lParam;

if (!m_strTitle.IsEmpty())

{

   p_l->AddString(lpWinTitle);

}

return TRUE;

}

 

调用EnumWindows(EnumWindowsProc, (LPARAM)GetDlgItem(IDC_LIST1));


推荐阅读
  • WinMain 函数详解及示例
    本文详细介绍了 WinMain 函数的参数及其用途,并提供了一个具体的示例代码来解析 WinMain 函数的实现。 ... [详细]
  • [转]doc,ppt,xls文件格式转PDF格式http:blog.csdn.netlee353086articledetails7920355确实好用。需要注意的是#import ... [详细]
  • 本文将介绍如何在混合开发(Hybrid)应用中实现Native与HTML5的交互,包括基本概念、学习目标以及具体的实现步骤。 ... [详细]
  • 我有一个从C项目编译的.o文件,该文件引用了名为init_static_pool ... [详细]
  • Ihavetwomethodsofgeneratingmdistinctrandomnumbersintherange[0..n-1]我有两种方法在范围[0.n-1]中生 ... [详细]
  • 开机自启动的几种方式
    0x01快速自启动目录快速启动目录自启动方式源于Windows中的一个目录,这个目录一般叫启动或者Startup。位于该目录下的PE文件会在开机后进行自启动 ... [详细]
  • Python 序列图分割与可视化编程入门教程
    本文介绍了如何使用 Python 进行序列图的快速分割与可视化。通过一个实际案例,详细展示了从需求分析到代码实现的全过程。具体包括如何读取序列图数据、应用分割算法以及利用可视化库生成直观的图表,帮助非编程背景的用户也能轻松上手。 ... [详细]
  • 本文详细解析了使用C++实现的键盘输入记录程序的源代码,该程序在Windows应用程序开发中具有很高的实用价值。键盘记录功能不仅在远程控制软件中广泛应用,还为开发者提供了强大的调试和监控工具。通过具体实例,本文深入探讨了C++键盘记录程序的设计与实现,适合需要相关技术的开发者参考。 ... [详细]
  • Python 程序转换为 EXE 文件:详细解析 .py 脚本打包成独立可执行文件的方法与技巧
    在开发了几个简单的爬虫 Python 程序后,我决定将其封装成独立的可执行文件以便于分发和使用。为了实现这一目标,首先需要解决的是如何将 Python 脚本转换为 EXE 文件。在这个过程中,我选择了 Qt 作为 GUI 框架,因为之前对此并不熟悉,希望通过这个项目进一步学习和掌握 Qt 的基本用法。本文将详细介绍从 .py 脚本到 EXE 文件的整个过程,包括所需工具、具体步骤以及常见问题的解决方案。 ... [详细]
  • QT框架中事件循环机制及事件分发类详解
    在QT框架中,QCoreApplication类作为事件循环的核心组件,为应用程序提供了基础的事件处理机制。该类继承自QObject,负责管理和调度各种事件,确保程序能够响应用户操作和其他系统事件。通过事件循环,QCoreApplication实现了高效的事件分发和处理,使得应用程序能够保持流畅的运行状态。此外,QCoreApplication还提供了多种方法和信号槽机制,方便开发者进行事件的定制和扩展。 ... [详细]
  • 本文节选自《NLTK基础教程——用NLTK和Python库构建机器学习应用》一书的第1章第1.2节,作者Nitin Hardeniya。本文将带领读者快速了解Python的基础知识,为后续的机器学习应用打下坚实的基础。 ... [详细]
  • Hadoop的文件操作位于包org.apache.hadoop.fs里面,能够进行新建、删除、修改等操作。比较重要的几个类:(1)Configurati ... [详细]
  • 本文介绍如何使用OpenCV和线性支持向量机(SVM)模型来开发一个简单的人脸识别系统,特别关注在只有一个用户数据集时的处理方法。 ... [详细]
  • Flutter 2.* 路由管理详解
    本文详细介绍了 Flutter 2.* 中的路由管理机制,包括路由的基本概念、MaterialPageRoute 的使用、Navigator 的操作方法、路由传值、命名路由及其注册、路由钩子等。 ... [详细]
  • Spring – Bean Life Cycle
    Spring – Bean Life Cycle ... [详细]
author-avatar
吴碧菱乐其怡伶
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有