我发现这两个函数的功能真的不是一般的有意思,贴上这两个函数函数原型:

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函数相关推荐

  1. WINDOWS API ——SETWINDOWLONG—— 设置窗口样式 SetWindowLong 函数原型为:LONG SetWindowLong(HWND hwnd,int nIndex,Lon

    WINDOWS API --SETWINDOWLONG-- 设置窗口样式 SetWindowLong 函数原型为:LONG SetWindowLong(HWND hwnd,int nIndex,Lon ...

  2. Windows SDK笔记(三):定制控件消息处理函数

    From: http://www.vckbase.com/document/viewdoc/?id=1009 一.概述 控件的消息处理函数是由系统定义好了的,通常情况下,不需要自己提供. 但当需要对控 ...

  3. 定制控件消息处理函数

    Windows SDK笔记(三):定制控件消息处理函数 作者:冯明德 一.概述 控件的消息处理函数是由系统定义好了的,通常情况下,不需要自己提供. 但当需要对控件进行特殊控制时,可以提供一个消息处理函 ...

  4. Windows.h 常用API函数【转】

    转自:https://blog.csdn.net/farmwang/article/details/50603608 http://www.vbgood.com/api.html http://hi. ...

  5. windows常用 API函数

    系统API查询 http://www.vbgood.com/api.html http://hi.baidu.com/3582077/item/9cc3483b581f53c5392ffae3 第一个 ...

  6. Windows API函数速查

    http://blog.csdn.net/ghevinn/article/details/8213614 Windows API函数速查 1. API之网络函数 WNetAddConnection 创 ...

  7. VC中常见API函数使用方法(经验版)

    ***********************************************声明*************************************************** ...

  8. VC中常见API函数用法(经验版)

    ***********************************************声明*************************************************** ...

  9. Windows 系统API 函数快速查找

    1. API之网络函数 WNetAddConnection 创建同一个网络资源的永久性连接 WNetAddConnection2 创建同一个网络资源的连接 WNetAddConnection3 创建同 ...

最新文章

  1. Tomcat关闭后,重新启动,session中保存的对象为什么还存在解决方法
  2. Java互联网架构 百度云_java互联网架构师
  3. U盘中的autorun.inf
  4. 被5月GitHub Top20榜单惊呆了 原来区块链大佬都在做这个
  5. spring学习(6)
  6. POJ 2186 挑战 --牛红人 强连通分量——Tarjan
  7. 多线程的线程通信(生产消费)
  8. 算法(4)-leetcode-explore-learn-数据结构-数组2
  9. 安装rtx时报错因计算机中丢失lo,policy.3.1.IntervalZero.RTX64.dll
  10. graphics | 基础绘图系统(八)——棘状图、符号图、多边形(路径)图、Cohen-Friendly关联图、条件密度图...
  11. Win11未安装Defender怎么办?解决Win11未安装Defender的方法
  12. 计算机兴趣小组的意义,计算机兴趣小组总结
  13. 大学里学的单片机和网课一对一学单片机有什么区别
  14. baacloud无法连接到_加入 Beta 版“Baacloud88” - TestFlight - Apple
  15. 企业全面运营管理沙盘模拟心得_你要的企业沙盘模拟心得来了!!!
  16. gcc编译C++ 符号名解码 c++filt demangle
  17. LSTM预测未来一天股票收盘价
  18. 如何从YouTube历史记录中暂停,清除和删除视频
  19. 话说公孙胜对宋江 水浒
  20. 异常(The host [tomcat_server] is not valid)(Nginx配置异常)

热门文章

  1. CCNP中单区域OSPF详解(第一部分)
  2. org.apache.hadoop.hive.metastore.api.MetaException: Get request failed :xxxx
  3. secureCRT修改鼠标颜色
  4. hiveserver或者hive启动出现Expected authority at index 7问题解决
  5. 64位系統修復dll
  6. debian下面的apt-fast安装
  7. This application failed to start because it could not find or load the Qt platform plugin xcb in
  8. 深入理解计算机操作系统:链接笔记
  9. IP协议详解---Linux学习笔记
  10. 使用django创建一个单表查询的图书管理系统