GetWindowLong和SetWindowLong函数
我发现这两个函数的功能真的不是一般的有意思,贴上这两个函数函数原型:
LONG WINAPI SetWindowLong(_In_ HWND hWnd,_In_ int nIndex,_In_ LONG dwNewLong
);
LONG WINAPI GetWindowLong(_In_ HWND hWnd,_In_ int nIndex
);
这两个函数的资料在度娘上面也是不胜枚举,同时本人在网络上翻看了诸多大牛的文章,大家对这两个函数的理解也都是入木三分。后来人便可综合大家的总结,更方便的理解这两个函数。但一是本人水平实在有限,二是为了不再给网络增加负担,所以本人决定理论的知识就不再赘述了,以免出现纰漏贻误后来人。而是通过亲身经历的两个小例子来展示一下这两个函数的强大之处。
1.设置窗口的透明属性。
这段代码实现的功能就是让我们电脑上的计算器再透明一点,本来是这样的,然后我们写个程序使其变成这个鬼样子。
以SDK为例,我们新建一个默认工程,在默认工程的回调函数里,添加一个右键处理消息,当右键按下,获取计算器的句柄,其中类名或者窗口名,可以通过VS自带的SPY++获得(32位和64位版本要对应),然后通过这两个函数获取窗口属性,用SetLayeredWindowAttributes函数设置透明色。(前提是要打开计算器,使能够获取句柄成功)。代码如下:
1 case WM_RBUTTONDOWN: 2 { 3 //获取计算器窗口句柄(这里也可以设置QQ了,英雄联盟了,等一系列窗口) 4 HWND hCalc=FindWindow(_T("CalcFrame"), NULL);//这个函数也是非常非常有意思的。 5 if (hCalc!=NULL) 6 { 7 //通过GetWindowLong获得窗口的属性 8 int ExdStyle = (int)GetWindowLong(hCalc, GWL_EXSTYLE); 9 //通过SetWindowLong设置窗口的属性,多增加了一个WS_EX_LAYERED支持透明 10 SetWindowLong(hCalc, GWL_EXSTYLE, ExdStyle | WS_EX_LAYERED); 11 //设置窗口的透明色 12 SetLayeredWindowAttributes( 13 hCalc, RGB(255, 255, 255), 14 100, LWA_ALPHA);//100代表透明度,0是全透明,255是不透明 15 } 16 17 } 18 break;
2.改写回调函数过滤消息。
比如改写该进程下的回调函数,达到过滤右键按下的消息的目的
旧回调函数: LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {switch (message){case WM_CREATE:{//OldProc返回值是SetWindowLong原来的回调函数的地址OldProc = (WNDPROC)SetWindowLong(hWnd, GWL_WNDPROC, (LONG)NewProc);//程序主窗口此时的回调函数是NewProc而不是WndProc; }break;case WM_RBUTTONDOWN:{MessageBox(hWnd, _T("旧的窗口回调函数里"), _T("提示"), NULL);}break;case WM_DESTROY:PostQuitMessage(0);break;default:return DefWindowProc(hWnd, message, wParam, lParam);}return 0; } 新回调函数 LRESULT CALLBACK NewProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {switch (message){case WM_RBUTTONDOWN:{MessageBox(hWnd, _T("新的窗口回调函数里"), _T("提示"), NULL);}return 0;//达到过滤消息后,恢复原来的回调函数,在OldProc中保存着default:return CallWindowProc(OldProc, hWnd, message, wParam, lParam);} }
转载于:https://www.cnblogs.com/wingss/p/5116602.html
GetWindowLong和SetWindowLong函数相关推荐
- WINDOWS API ——SETWINDOWLONG—— 设置窗口样式 SetWindowLong 函数原型为:LONG SetWindowLong(HWND hwnd,int nIndex,Lon
WINDOWS API --SETWINDOWLONG-- 设置窗口样式 SetWindowLong 函数原型为:LONG SetWindowLong(HWND hwnd,int nIndex,Lon ...
- Windows SDK笔记(三):定制控件消息处理函数
From: http://www.vckbase.com/document/viewdoc/?id=1009 一.概述 控件的消息处理函数是由系统定义好了的,通常情况下,不需要自己提供. 但当需要对控 ...
- 定制控件消息处理函数
Windows SDK笔记(三):定制控件消息处理函数 作者:冯明德 一.概述 控件的消息处理函数是由系统定义好了的,通常情况下,不需要自己提供. 但当需要对控件进行特殊控制时,可以提供一个消息处理函 ...
- Windows.h 常用API函数【转】
转自:https://blog.csdn.net/farmwang/article/details/50603608 http://www.vbgood.com/api.html http://hi. ...
- windows常用 API函数
系统API查询 http://www.vbgood.com/api.html http://hi.baidu.com/3582077/item/9cc3483b581f53c5392ffae3 第一个 ...
- Windows API函数速查
http://blog.csdn.net/ghevinn/article/details/8213614 Windows API函数速查 1. API之网络函数 WNetAddConnection 创 ...
- VC中常见API函数使用方法(经验版)
***********************************************声明*************************************************** ...
- VC中常见API函数用法(经验版)
***********************************************声明*************************************************** ...
- Windows 系统API 函数快速查找
1. API之网络函数 WNetAddConnection 创建同一个网络资源的永久性连接 WNetAddConnection2 创建同一个网络资源的连接 WNetAddConnection3 创建同 ...
最新文章
- Tomcat关闭后,重新启动,session中保存的对象为什么还存在解决方法
- Java互联网架构 百度云_java互联网架构师
- U盘中的autorun.inf
- 被5月GitHub Top20榜单惊呆了 原来区块链大佬都在做这个
- spring学习(6)
- POJ 2186 挑战 --牛红人 强连通分量——Tarjan
- 多线程的线程通信(生产消费)
- 算法(4)-leetcode-explore-learn-数据结构-数组2
- 安装rtx时报错因计算机中丢失lo,policy.3.1.IntervalZero.RTX64.dll
- graphics | 基础绘图系统(八)——棘状图、符号图、多边形(路径)图、Cohen-Friendly关联图、条件密度图...
- Win11未安装Defender怎么办?解决Win11未安装Defender的方法
- 计算机兴趣小组的意义,计算机兴趣小组总结
- 大学里学的单片机和网课一对一学单片机有什么区别
- baacloud无法连接到_加入 Beta 版“Baacloud88” - TestFlight - Apple
- 企业全面运营管理沙盘模拟心得_你要的企业沙盘模拟心得来了!!!
- gcc编译C++ 符号名解码 c++filt demangle
- LSTM预测未来一天股票收盘价
- 如何从YouTube历史记录中暂停,清除和删除视频
- 话说公孙胜对宋江 水浒
- 异常(The host [tomcat_server] is not valid)(Nginx配置异常)
热门文章
- CCNP中单区域OSPF详解(第一部分)
- org.apache.hadoop.hive.metastore.api.MetaException: Get request failed :xxxx
- secureCRT修改鼠标颜色
- hiveserver或者hive启动出现Expected authority at index 7问题解决
- 64位系統修復dll
- debian下面的apt-fast安装
- This application failed to start because it could not find or load the Qt platform plugin xcb in
- 深入理解计算机操作系统:链接笔记
- IP协议详解---Linux学习笔记
- 使用django创建一个单表查询的图书管理系统