句柄(HANDLE)是Windows程序中一个重要的概念,使用也非常频繁。在Windows程序中,有各种各样的资源(窗口、图标、光标等),系统在创建这些资源时会为它们分配内存,并返回标识这些资源的标识号,即句柄。

窗口句柄是windows句柄的一种,且是重要的一种句柄。在Windows应用程序中,窗口是通过窗口句柄(HWND)来标识的。我们要对某个窗口进行操作,首先就要得到这个窗口的句柄。

窗口句柄的概念比较抽象,简单说窗口句柄就是一个窗口(window)的代表。我们通过几个例子来认识它。

1.LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);

windows窗口处理函数,windows消息机制说的是,每当某个窗口发生变化(比如改变大小,移动),windows系统都会发相应的消息(wm_size,wm_move)给这个窗口。即调用函数 SendMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam);注意这里WndProc和SendMessage的第一个参数都是HWND,窗口句柄代表这个窗口。

2. hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,

CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);

这里说的是窗口句柄的产生,可以把hWnd想象成指针,CreateWindow想象成c++里的new,创建一个window,系统要为这个window对象分配一些资源,可以想象,window是由一个大的结构构成的。同时窗口句柄用来标识这个窗口。

3.有个窗口的句柄,则你就可以操控这个窗口的一切。

大量管理window的win32 api都是以hwnd做为参数。下面列举一些:

BringWindowToTop

FindWindowEx

GetParent

SetWindowPos

GetWindowRect

等等。

4.不仅窗口,窗口上的控件,象按钮,编辑框等也有窗口句柄,因为它们也是一种特殊的窗口,上面操作窗口的api大部分对这些控件窗口也适用。

获取句柄的方法:

这篇文章是关于如何获取窗口句柄,以及有哪些函数可供使用的简单讨论!可适用于vc、bcb(其他的我没有试,估计可以),本人在bcb环境下试验。

首先我会罗列出一些获取句柄的win32 api 函数,然后简单说说他们的用途!最后说说我是怎么理解和应用的。见笑了!

可用的win32 api函数:

1.HWND FindWindow(LPCTSTR lpClassName, LPCTSTR lpWindowName)

HWND FindWindowEx(HWND hwndParent, HWND hwndChildAfter,LPCTSTR lpClassName, LPCTSTR lpWindowName)

2.HWND WindowFromPoint(POINT& Point)

3.BOOL CALLBACK EnumChildProc(HWND hwnd,LPARAM lParam)

BOOL CALLBACK EnumChildWindows(HWND hWndParent, WNDENUMPROC lpEnumFunc,LPARAM lParam)

BOOL CALLBACK EnumWindows(WNDENUMPROC lpEnumFunc, LPARAM lParam)

BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam)

一般用途:

对于第一种,大家都很熟悉,是捕捉句柄的常规武器,FindWindow这两兄弟,可以接受捕捉对象的类名或者窗口标题之一,作为参数,返回一个HWND。可是对于一般群众,不一定知道所有的窗口(包括标题栏、按钮等等)的类名啊!--可以简单举例,请问你知道桌面图标的窗口的类名吗?而对于窗口标题,有可能会出现相同的标题,有两个窗口--指一个程序的两个进程,这又是个麻烦吧!好了,这个问题先放放,继续下一组。

第二组,通过win32定义的POINT结构(typedef struct tagPOINT {   LONG x;
  LONG y;} POINT),来获得当前鼠标光标位置的窗口HWND,这是最直观的武器!常规操作如下:先得到Cursor的POINT(BOOL GetCursorPos(LPPOINT)函数),再用WindowFromPoint。这样,我们几乎可以获得任何打开的有窗口的函数的HWND了!然后通过获取类名的win32 api函数(int GetClassName(  HWND hWnd,   LPTSTR lpClassName,   int nMaxCount ))得到类名--这里的lpClassName最好用字符数组地址,nMaxCount就是数组的size了,同时,这种方法解决了第一个问题的麻烦!--我可以把鼠标放在任何地方!*^_^*

第三组,这些是用来列举和处理任何窗口的超级武器!通过组合运用EnumWindows和EnumWindowsProc,EnumChildWindows与EnumChildProc,可以扫描桌面所有窗口并对之处理!

我的理解:(这部分用任务驱动式教学方法--谁让小弟是老师呢!xi xi)

任务:得到所有的窗口的类名。

解决办法1:我们会先想到第三组,可以自桌面窗口开始(它是所有窗口的祖先),依次扫描,获取类名并存之。有点儿像Visual Stdio的Spy++,或者Borland 的WinSight32,具体办法如下:(bcb中)

在主程序中,调用EnumWindows,传入YouEnumProc的函数地址作第一个参数,别忘了转换成WNDENUMPROC类型。第二参可NULL。::EnumWindows(reinterpret_cast<WNDENUMPROC> YouEnumProc,NULL);

在YouEnumProc函数中,如果第一参HWND = = NULL,就跳离(return FALSE;),可以结束啦!

然后,把类名数组准备好,得到类名,存之。

返回真值,继续下一次扫描。

看起来并不复杂,是一种函数递归。但是我可会解释!面啊!: p

第二种解决方法:简单、直观--自己想出来的,颇得意

首先准备一个时钟,一种存类名方法(我用TMemo)

在定时器处理函数中:

1、得到当前cursor的点位置

2、再用WindowFromPoint,

3、然后得到类名,放到TMemo里

这样可以用鼠标获得你想要的窗口(包括按钮等),只要鼠标在窗口放一会儿。。。哈哈

第三种方法:其实利用FindWindow和循环结构也应该可以

总结:其实得到HWND的方法很多,比如知道了窗口层次,依次向下扫。。。在说第三种呢!但我觉得,我的方法最直接有效,你说呢?

欢迎大家与我联系,并讨论这个问题!有关这个问题我还有许多疑问,比如HWND与ID的转换,在如IE页面中的表单控件的HWND或ID,还是其他的东东,总之是能识别他的东西。。。这个我很困惑,没办法!

不清楚地方,大家要参照MSDN啊

其它获取句柄的方法:

1.根据id获取窗口句柄
  Hwnd hwnd = GetDlgItem(hwndParent,id).
2.根据窗口句柄,获取id
    id = GetWindowLong(hwndChild,GWL_ID)
    id = GetDlgCtrlID(hwndchild).
3.获取实例句柄的若干方法
    hInst = GetWindowLong(hwnd,GWL_HINSTANCE)
    把HINSTANCE 作为全局变量保存.
    当建立窗口时,参数lparam指向了一个建立结构的地址.
    可以这样获取实例句柄
    hInst = ((LPCREATESTRUCT)lParam)->hInstance.

窗口句柄浅析和获取窗口句柄的方法相关推荐

  1. MFC框架类、文档类、视图类相互访问(及窗口句柄获取)的方法

    1.获取应用程序指针  CMyApp* pApp=(CMyApp*)AfxGetApp(); 2.获取主框架指针  CWinApp 中的公有成员变量 m_pMainWnd 就是主框架的指针  CMai ...

  2. python获取窗口句柄_Python+selenium 获取浏览器窗口坐标、句柄的方法

    1.0 获取浏览器窗口坐标 python目录可找到Webdriver.py 文件定义了get_window_rect()函数,可获取窗口的坐标和大小(长宽),但出现"Command not ...

  3. win32 获取窗口句柄的方法

    第一种方法是根据窗口句柄值获取窗口句柄 使用spy++获取指定窗口的窗口句柄值,因为句柄值是16进制数,所以前面加0x,然后进行强制转换为HWND类型. HWND hWnd=(HWND)0x00280 ...

  4. [WinAPI] 获取窗口句柄的几种方法

    转: http://www.cnblogs.com/zjutlitao/p/3889900.html 1.使用FindWindow函数获取窗口句柄 示例:使用FindWindow函数获取窗口句柄,然后 ...

  5. 按键精灵获取窗口句柄的几个方法代码

    //获取窗口句柄 //根据姓名(标题)或家族(类名)查一个: Hwnd = Plugin.Window.Find(0, "无标题 - 记事本") HwndEx = Plugin.W ...

  6. 【python句柄获取】——简单明了的获取窗口句柄,并使用句柄操作获取相应内容(全网最详细)

    点个赞留个关注吧!! 所使用模块 import win32gui import win32con import win32api import psutil import win32process 获 ...

  7. AutoIt3 使用进程名获取窗口句柄

    背景 需要用AutoIt3控制QQ音乐播放器,首先要获取QQ音乐的窗口句柄 问题 WinGetHandle方法不能满足要求 QQ音乐的Title会根据当前播放的歌曲动态改变 而QQ音乐与QQ的窗口Cl ...

  8. 通过Windows进程ID获取窗口句柄

    通过Windows进程ID获取窗口句柄 方法一:使用EnumWindows的方式 ///< 枚举窗口参数 typedef struct { HWND hwndWindow; // 窗口句柄 DW ...

  9. windows使用VS获取窗口句柄或者类名

    windows获取窗口句柄或者类名 以下步骤记录了windows下,通过vs工具获取窗体或者程序句柄的方法. 1.打开VS2015(以2015为例,2010也可以): 2.菜单/工具/Spy(或者Sp ...

  10. C++ 获取窗口句柄

    1.使用FindWindow函数获取窗口句柄 示例:使用FindWindow函数获取窗口句柄,然后获得窗口大小和标题,并且移动窗口到指定位置. [html] view plaincopy #inclu ...

最新文章

  1. HTML-参考手册: URL 编码
  2. 分布式系统的面试题1
  3. 这样设置路由,99.9%的黑客都攻不破
  4. JDBC+Servlet+JSP整合开发之26.JSP内建对象
  5. git命令之git rebase 的用法
  6. matlab2016a下载包及安装教程
  7. 什么是PXE及PXE启动
  8. 如何用计算机观看电视节目,如何将计算机显示器变成电视以观看节目
  9. From.List用法详解
  10. Vue实现简单的音乐播放器
  11. 深入理解Nginx 读书笔记
  12. JavaScrpt LRC歌词同步 和 es6 的 fetch 的 async/await 和 promise 两种写法
  13. 移动端项目功能点及实现方案 (图片居多)
  14. 快速上手Linux核心命令(九):文件备份与压缩
  15. Android无线调试
  16. 高级面试题--SpringBoot启动流程解析
  17. mac删除global protect
  18. 用python计算残差等
  19. 二进制如何转十进制,十进制如何转二进
  20. 《软件方法(上)业务建模和需求》第2版 勘误(2021年10月21日更新)

热门文章

  1. svnadmin的使用
  2. win10系统怎么改奇摩输入法_Yahoo! 奇摩输入法
  3. 【转】姚班学霸陈立杰
  4. matlab中提取微分方程某点的值,从随机微分方程解中提取某些参数的值
  5. OSI七层参考模型与5G协议
  6. 计算机芯片组的分类,主板知识详解:芯片组和支持CPU类型
  7. 机械工程师手册 pdf版下载_机械设计问题 简明手册介绍的还是很全面详尽的(附PDF手册)...
  8. 编辑mike的dfs2、dfs0等文件
  9. Linux 网易云 deb 包下载 安装
  10. 计算机添加桌面小插件,如何在电脑桌面添加时钟,日历等小工具_在电脑桌面添加时钟,日历等小工具的方法-系统城...