GetWindowLong说明及应用

2023-05-16

“窗口类的封装,从全局窗口消息处理到窗口对象消息处理的映射方法:

  对界面进行封装,一般都是一个窗口一个类,比如实现一个最基本的窗口类CMyWnd,你一定会把窗口过程作为这个类的成员函数,但是使用WINAPI创建窗口时必须注册类WNDCLASS,里面有个成员数据lpfnWndProc需要WNDPROC的函数指针,一般想法就是把窗口类的消息处理函数指针传过去,但是类成员函数除非是静态的,否则无法转换到WNDPROC,而全局的消息处理函数又无法得到窗口类对象的指针。这里有几种解决办法:

  一种解决方法是用窗口列表,开一个结构数组,窗口类对象创建窗口的时候把窗口HWND和this指针放入数组,全局消息处理函数遍历数组,利用HWND找出this指针,然后定位到对象内部的消息处理函数。这种方法查找对象的时间会随着窗口个数的增多而增长。

  另一种方法比较聪明一点,WNDCLASS里面有个成员数据cbWndExtra一般是不用的,利用这点,注册类时给该成员数据赋值,这样窗口创建时系统会根据该值开辟一块内存与窗口绑定,这时把创建的窗口类的指针放到该块内存,那么在静态的窗口消息循环函数就能利用GetWindowLong(hWnd,GWL_USERDATA)取出该指针,return (CMyWnd*)->WindowProc(...),这样就不用遍历窗口了。但是这样一来就有个致命弱点,对窗口不能调用SetWindowLong(hWnd,GWL_USERDATA,数据),否则就会导致程序崩溃。幸好这个函数(特定这几个参数)是调用几率极低的,对于窗口,由于创建窗口都是调用窗口类的Create函数,不用手工注册WNDCLASS类,也就不会调用SetWindowLong函数。但是毕竟缺乏安全性,而且当一秒钟内处理的窗口消息很多时,这种查找速度也可能不够快。

创建窗口时: SetWindowLong( m_hWnd, GWL_USERDATA, (LONG) this );

 

函数功能描述:用这个函数能够获得指定窗口的信息

函数原型:
LONG GetWindowLong( HWND hWnd,int nIndex )

参数:
hWnd:指定窗口的句柄
nIndex:需要获得的信息的类型
     值            功能

nIndex取值如下:
GWL_EXSTYLE    得到扩展的窗口风格
GWL_STYLE      得到窗口风格
GWL_WNDPROC    得到窗口回调函数的地址,或者句柄。得到后必须使用CallWindowProc函数来调用
GWL_HINSTANCE  得到应用程序运行实例的句柄
GWL_HWNDPARENT 得到父窗口的句柄
GWL_ID         得到窗口的标识符
GWL_USERDATA   得到和窗口相关联的32位的值(每一个窗口都有一个有意留给创建窗口的应用程序是用的32位
               的值)

当hWnd标识一个对话框时可以使用下面的值
Value Action
DWL_DLGPROC   得到对话框回调函数的地址,或者句柄。得到后必须使用CallWindowProc函数来调用
DWL_MSGRESULT 得到对话框回调函数中消息处理过程的返回值
DWL_USER      得到额外的应用程序私有信息,如一些句柄和指针等

返回值:
成功时,返回一个请求的32位的值
失败时,返回0,可以使用GetLastError来取得错误信息

示例:
long nStyle = ::GetWindowLong(hWnd, GWL_STYLE);   // hWnd是一个编辑框的句柄
if(nStyle & ES_PASSWORD)
{
    AfxMessageBox("这是一个密码域");
}

 

下面是一个具体的应用:

星号密码查看工具大家都用过吧?现在我们自己来写一个超级简单的。密码框其实就是Windows的一个子窗口,显示星号是因为密码框设置了EM_SETPASSWORDCHAR属性,只要我们把密码框的EM_SETPASSWORDCHAR属性去掉,那么密码就会以明文显示了。我们可以给程序发送消息去掉EM_SETPASSWORDCHAR属性,通过安装鼠标钩子监视鼠标动作,如果用户单击的是密码框,那么就发送一个去除密码属性的消息。
本文使用的编程工具为VC6.0,具体实现步骤和代码如下。
1)生成一个基于对话框的程序pass。打开passDlg.cpp,加入下面的全局变量和鼠标钩子函数。

HHOOK g_hHook = NULL;//全局钩子函数句柄
//鼠标钩子函数
LRESULT CALLBACK HookProc( int code, WPARAM wParam,LPARAM lParam )
{
HWND hwnd;
POINT point;
GetCursorPos(&point);
//得到鼠标位置
hwnd=::WindowFromPoint(point);
//得到包含鼠标的窗口句柄
long nStyle=::GetWindowLong(hwnd,GWL_STYLE);
//得到窗口风格

EVENTMSG *event=(EVENTMSG *)lParam;
if(event->message==WM_LBUTTONDOWN)
//是否为鼠标左键
{
if(nStyle & ES_PASSWORD)
//是否为密码框
{
::PostMessage(hwnd, EM_SETPASSWORDCHAR,0,0);
//去掉密码属性
}
}
return CallNextHookEx(g_hHook,code,wParam,lParam);
}

这里需要注意的是,程序中的::PostMessage(hwnd, EM_SETPASSWORDCHAR,0,0);只能是PostMessage,而不能用SendMessage代替。
2)添加“开始探测”按钮及响应函数OnOK(),并在函数中安装钩子。

void CPassDlg::OnOK()
{
g_hHook=SetWindowsHookEx(WH_JOURNALRECORD,HookProc,GetModuleHandle(NULL),0);
//安装钩子
}

钩子的第三部分使用GetModuleHandle(NULL)函数,意为把自己作为保存钩子的DLL。
  3)添加“取消退出”按钮及响应函数OnExit(),并在函数中卸载钩子。
  
void CPassDlg::OnExit()
{

if(g_hHook)
UnhookWindowsHookEx(g_hHook);
//卸载钩子
exit(0);
}

至此,整个程序就编写完成了。打开我们的程序,按下“开始探测”按钮,再打开需要输入密码的程序试试,是不是以明文显示了?用这个小程序可以搞定系统的密码设置、Outlook或防范不严的程序密码,但对有专门防范的程序就不行了,比如新版QQ。

 

 
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

GetWindowLong说明及应用 的相关文章

  • 修改数据库内存

    SQL gt conn as sysdba Connected SQL gt show parameter memory NAME TYPE VALUE hi shared memory address integer 0 memory m
  • Multi-Language IDE for Professional Developers (Komodo)

    Komodo is the professional IDE for major web languages including Python PHP Ruby Perl HTML CSS and JavaScript You 39 ll
  • mbps

    Mbps 61 Mbit s即兆比特每秒 Million bits per second的缩写 传输速率是指设备的的 数据交换能力 xff0c 也叫 带宽 xff0c 单位是Mbps xff08 兆位 秒 xff09 目前主流的集线器带宽主
  • Matplotlib中figure、subplot、axes、axis的区别

    参考链接 xff1a https blog csdn net JasonZhu csdn article details 85860963 画图板 画布 xff1a 这是一个基础载体 xff0c 类似实际的画图板 xff0c 用pyplot
  • 操作系统知识总结

    操作系统知识总结 1 简述操作系统的定义 操作系统是计算机系统的一种系统软件 xff0c 它统一管理计算机系统的资源和控制程序的执行 2 在多道程序设计技术的系统中 xff0c 操作系统怎样才会占领中央处理器 xff1f 只有当中断装置发现
  • (2016/02/19)多传感器数据融合算法---9轴惯性传感器

    2016年2月18日 传感器的原理 加速度计 xff1a 加速度计 我们可以把它想作一个圆球在一个方盒子中 假定这个盒子不在重力场中或者其他任何会影响球的位置的场中 xff0c 球处于盒子的正中央 你可以想象盒子在外太空中 xff0c 或远
  • 教你一招---如何把桌面弄到D盘

    有很多网友有个习惯 xff0c 就是桌面上有好多文件 xff0c 几乎重要的文件和工作文件都在桌面和我的文档里面 xff0c 嘿嘿 xff0c 我也是其中之一啊 xff0c 哈哈 xff0c 好几次重装了系统丢了文件 xff0c 那个着急啊
  • [转]SSH 原理和基本使用:ssh 安全配置 以及ssh key 认证登录

    一 什么是 SSH xff1f SSH全称 Secure SHell 是一种网络协议 xff0c 顾名思义就是非常安全的shell xff0c 主要用于计算机间加密传输 早期 xff0c 互联网通信都是基于明文通信 xff0c 一旦被截获
  • js如何判断小数点后有几位

    lt script gt var n 61 3 143423423 alert n toString split 34 34 1 length lt script gt js javascrip 截取小数点后几位 第一种 xff0c 利用m
  • 无效类字符串:ProgID: Excel.Application

    网上发现的方案是改注册表 xff0c 其实用不着那么麻烦 xff0c 找2种excel文件 xff1a xlsx和xls xff0c 把默认打开方式都换成你机器上有的程序就行 xff0c 比如WPS Office的WPS 表格
  • JAVA版拆分大整数为2幂的和算法

    import java util ArrayList import java util List public class StrTest public static void main String args 模拟生成一个大整数 Long
  • 使用vue时遇到的内存溢出以及处理

    业务场景 vue帮我们处理很多数据到视图 数据到事件的处理 xff0c 其中不乏许多闭包 事件处理 xff0c 因此比较容易忽视内存溢出的处理 前言 几种常见的内存溢出 1 全局变量引起的内存泄漏 2 闭包引起的内存泄漏 3 dom清空或删
  • ios 显示html标签,超链接颜色以及下划线的处理

    有的时候 xff0c 我们的app需要显示html标签的效果 xff0c 这个时候 xff0c 如果需求不是特别复杂的话 xff0c 我们都是可以使用textView来实现的 对冉Label也可以实现 xff0c 但是label很难实现超链
  • 并发用户数、吞吐量、思考时间的计算公式

    二 软件性能的几个主要术语 1 响应时间 xff1a 对请求作出响应所需要的时间 网络传输时间 xff1a N1 43 N2 43 N3 43 N4 应用服务器处理时间 xff1a A1 43 A3 数据库服务器处理时间 xff1a A2
  • 怎么获得MIUI12系统的root权限

    MIUI12系统怎么样拥有ROOT权限 xff1f 大家都知道 xff0c android手机有ROOT权限 xff0c 一旦手机拥有root相关权限 xff0c 能够实现更强的功能 xff0c 打个比方大家部门的营销部门 xff0c 使用
  • iPhone查看WiFi密码(篇章一)

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 第一章 xff1a iPhone查看那些 曾经手动连接过 的WiFi密码 1 找到 iCloud xff08 不同系统版本位置不同 xff0c 但都在设置里 xff09 进
  • 深度卷积神经网络TensorFlow GPU实现

    深度卷积神经网络TensorFlow GPU实现 Deep Learning CNN s in Tensorflow with GPUs Taylor Guo 2017年6月11日 本文讲解卷积神经网络架构 xff0c 如何在tensorf
  • 原版XP合集,非BT下载

    原版XP和集 xff0c 非BT下载 都用迅雷下载 xff09 因FTP下载比较稳定 一般不会出现BT丢种的问题 所以这里只发FTP下载连接 如果大家还有更好的 欢迎补充 xff01 联想xp pro SP2 http web qtedu

随机推荐

  • Eclipse快捷键-方便查找

    行注释 销注释 Ctrl 43 块注释 销注释 Ctrl 43 Shift 43 Ctrl 43 Shift 43 查找 查找替换 Ctrl 43 H Ctrl 43 F 查找下一个 往回找 Ctrl 43 K Ctrl 43 Shift
  • OpenGL鼠标点击事件

    include lt windows h gt Windows的头文件 include lt gl gl h gt OpenGL32库的头文件 include lt gl glu h gt GLu32库的头文件 include lt gl
  • debian中文字体美化

    为什么80 的码农都做不了架构师 xff1f gt gt gt 1 安装必要的字体包 Debian 和 Ubuntu 下对中文支持比较好的字体有 xff1a ttf droid ttf wqy zenhei和ttf wqy microhei
  • Kindeditor上传失败问题解决

    xff08 问题关键词 xff1a kindeditor 上传图片失败 kindeditor上传图片成功 xff0c 但是页面上却提示失败 kindeditor得到Json正确 xff0c 确提示失败 xff09 今天又遇到了一个比较无奈的
  • bash ps1变量_学习鸟哥私房菜--linux bash 的环境变量ps1设置

    bash里边的变量ps1是用户平时的提示符 xff0c 系统默认为 username 64 host 工作目录 关于ps1的相关介绍详见 xff1a http www cnblogs com starspace archive 2009 0
  • 人工智能让生活更美好

    人 I 工 I 智 I 能 I到 I来 科 I技 I大 I门 打 I 开 提起人工智能 你会想到什么 阿尔法围棋 浪潮天梭象棋 甚至会想到 大白 吧啦啦啦 史密斯电影 我 机器人 科技一直推动社会的变化 技术的飞速更迭与人类移动网络化的行为
  • 解压命令linux tgz,tar 解压_linux中的“tar命令”怎么解压“.tgz”与“.tar.gz”文件?...

    在LINUX下如何将tar压缩文件解压到指定的目录下 一 解压 tar gz格式到指定的目录下 xff1a 命令格式为 xff1a tar zxvf 压缩包文件名 tar gz C 路径 例如 xff1a tar zxvf japan ta
  • ssh证书登录(实例详解)

    前言 本文基于实际Linux管理工作 xff0c 实例讲解工作中使用ssh证书登录的实际流程 xff0c 讲解ssh证书登录的配置原理 xff0c 基于配置原理 xff0c 解决实际工作中 xff0c windows下使用SecureCRT
  • 常用滤波算法搜集

    一 十一种通用滤波算法 转 1 限幅滤波法 xff08 又称程序判断滤波法 xff09 A 方法 xff1a 根据经验判断 xff0c 确定两次采样允许的最大偏差值 xff08 设为A xff09 每次检测到新值时判断 xff1a 如果本次
  • 静态路由和默认路由的配置实战及其区别--很详细哦

    静态路由和默认路由的配置实战及其区别 一 xff1a 实验拓扑 二 xff1a 实验要求 1 xff1a 实现全网互通 2 xff1a 实现静态路由与动态路由的区别认识 3 xff1a 熟练掌握其配置命令 三 xff1a 实验步骤 第一步
  • MVC3学习:利用mvc3+ajax实现全选和批量删除

    本例数据库操作使用EF code first 先利用mvc自带的模板 xff0c 先生成一个list视图 xff0c 然后再手动添加复选框和删除按钮 lt table gt lt tr gt 64 在标题行添加一个全选按钮 64 lt th
  • 解决FAT32格式U盘安装win10时0x8007000D错误

    问题由来 我一直使用U盘 xff0c UltraISO软碟通和msdn原版镜像来装系统 最近在把Win10 1709升级为1803时遇到了问题 同样也是使用UltraISO刻录镜像到U盘的方法安装的 xff0c 这次从U盘启动安装时 xff
  • error: /lib64/libc.so.6: symbol _dl_starting_up, version GLIBC_PRIVATE not defined in file ld-linux-...

    sudo yum install libnotify Loaded plugins fastestmirror refresh packagekit security Setting up Install Process Repositor
  • 域组策略--+域控中组策略基本设置

    域控中组策略基本设置 计算机配置 xff1a 要重启生效 用户配置 xff1a 注销生效 策略配置后要刷新 xff1a gpupdate force 组策略编辑工具 xff01 gpmc msi xff08 工具 xff09 使用 xff1
  • a 链接 download 不生效问题

    众所周知 xff0c 在 HTML5 中 xff0c A 标签是支持 download 属性的 xff0c 此属性指示浏览器下载 URL 而不是导航到它 xff0c 但是该属性受到同源策略的限制 那么我们如何让 A 标签在跨域场景下依然有效
  • 【linux】创建新用户,并且指定用户ID,基本组,附加组(指定组号)

    1 创建用户 xff0c 必须先创建附加组 创建附加组 组名 xff1a fujia1 fujia2 GID 5005 5006 2 创建基本组 xff1a 组名 xff1a basicgp 3 创建用户 xff1a 用户名 xff1a n
  • 101个shell脚本

    本文用于记录学习和日常中使用过的shell脚本 脚本1 打印形状 打印等腰三角形 直角三角形 倒直角三角形 菱形 bin bash 等腰三角形 read p 34 Please input the length 34 n for i in
  • java生成PDF-支持中文及图片

    java生成PDF 支持中文及图片 PDF效果图 先弄出一个html 本地跟目录下放一个x html 内容如下 my name is walter I am red man 这是一句中文 this is a image 注意 xff1a h
  • 余士维讲座中的十八个故事[转载]

    No1 善于倾听 曾经有个小国到中国来 xff0c 进贡了三个一模一样的金人 xff0c 金壁辉煌 xff0c 把皇帝高兴坏了 可是这小国不厚道 xff0c 同时出一道题目 xff1a 这三个金人哪个最有价值 xff1f 皇帝想了许多的办法
  • GetWindowLong说明及应用

    窗口类的封装 从全局窗口消息处理到窗口对象消息处理的映射方法 xff1a 对界面进行封装 xff0c 一般都是一个窗口一个类 xff0c 比如实现一个最基本的窗口类CMyWnd xff0c 你一定会把窗口过程作为这个类的成员函数 xff0c