`
txf2004
  • 浏览: 6877174 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

【Chapter 3 - Kernel Objects】SetWindowLongPtr 和 DWLP_MSGRESULT / DWL_MSGRESULT

 
阅读更多

学习《Windows via C/C++》的时候,看到了一个宏~

chHANDLE_DLGMSG(hwnd, WM_COMMAND,    Dlg_OnCommand);

于是查了一下,原来这个宏是这样子的:

/////////////////////////// chHANDLE_DLGMSG Macro /////////////////////////////


// The normal HANDLE_MSG macro in WindowsX.h does not work properly for dialog
// boxes because DlgProc returns a BOOL instead of an LRESULT (like
// WndProcs). This chHANDLE_DLGMSG macro corrects the problem:
#define chHANDLE_DLGMSG(hWnd, message, fn)                 \
   case (message): return (SetDlgMsgResult(hWnd, uMsg,     \
      HANDLE_##message((hWnd), (wParam), (lParam), (fn))))


于是乎HANDLE_##message 又不明白了,然后 google 之,找到下面的文章:

http://blog.csdn.net/jasonM2008/article/details/3869296

但是SetDlgMsgResult 函数依旧令人费解,VS2010 的 MSDN 上居然找不到,后来终于在 windowsX.h 上发现它的踪影了:

#define     SetDlgMsgResult(hwnd, msg, result) (( \
        (msg) == WM_CTLCOLORMSGBOX      || \
        (msg) == WM_CTLCOLOREDIT        || \
        (msg) == WM_CTLCOLORLISTBOX     || \
        (msg) == WM_CTLCOLORBTN         || \
        (msg) == WM_CTLCOLORDLG         || \
        (msg) == WM_CTLCOLORSCROLLBAR   || \
        (msg) == WM_CTLCOLORSTATIC      || \
        (msg) == WM_COMPAREITEM         || \
        (msg) == WM_VKEYTOITEM          || \
        (msg) == WM_CHARTOITEM          || \
        (msg) == WM_QUERYDRAGICON       || \
        (msg) == WM_INITDIALOG             \
    ) ? (BOOL)(result) : (SetWindowLongPtr((hwnd), DWLP_MSGRESULT, (LPARAM)(LRESULT)(result)), TRUE))

怎么样?够繁杂吧!看来看去看不懂,只好继续 google ,终于找到了这篇文章:

http://www.powerbasic.com/support/pbforums/showthread.php?t=18613

也就是说,当对话框接收到的是上面列出的消息时,因为它们的返回值是固定类型的,所以就直接返回 result 了。

但如果接收到其他消息的时候,程序员可能希望返回一些其他东西,比如句柄啊,指针啊,等等。

此时如果直接以返回值的形式返回 result,则会将结果返回到默认的对话框处理函数 DefDlgProc 中,而程序员是无法进入 DefDlgProc 去取得这个返回值的(一般来说)。这时微软为每个窗口所定义的额外字节便可以粉墨登场了!程序员可以将需要返回的特殊值写入到那4个额外字节中:

SetWindowLongPtr (hwnd, DWLP_MSGRESULT, result) ;

然后,程序员就可以在其他的地方通过 GetWindowLongPtr 取得原先存储在额外字节中的内容了。

result = GetWindowLongPtr (hwnd, DWLP_MSGRESULT) ;

当然,前提是一旦设置了 SetWindowLongPtr 以后就不能再对窗口进行其他的操作,比如 SetWindowText ,这样一来会清空窗口的额外字节中的内容~~

哦,对了。DWLP_MSGRESULT 和 DWL_MSGRESULT 是差不多的~~具体看定义:

#include <winuser.h>
/* 
 * Get/SetWindowWord/Long offsets for use with WC_DIALOG windows
 */
#define DWL_MSGRESULT   0
#define DWL_DLGPROC     4
#define DWL_USER        8

#ifdef _WIN64

#undef DWL_MSGRESULT
#undef DWL_DLGPROC
#undef DWL_USER

#endif /* _WIN64 */

#define DWLP_MSGRESULT  0
#define DWLP_DLGPROC    DWLP_MSGRESULT + sizeof(LRESULT)
#define DWLP_USER       DWLP_DLGPROC + sizeof(DLGPROC)


分享到:
评论

相关推荐

    Windows API一日一练TXT版

    Windows API 一日一练(1)第一个应用程序 ---------------------------------------------------------------3 Windows API 一日一练(2)使用应用...Windows API一日一练(21)SetWindowLongPtr 和 GetWindowLongPtr 函数

    Universal-WndProc-Hook:适用于x86和x64的通用WndProc挂钩

    通用WndProc挂钩适用于x86和x64的通用WndProc挂钩可以用作GetAKeySyncState的替代品,其中包括一些Easy-Cheat和Battleye Monitor这样的Anti-Cheats。 在使用之前,用窗口的HWND替换SetWindowLongPtr的第一个参数

    node-v5.11.0-x86.msi

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    41532698775097Facebook Lite_405.0.0.8.113_apkcombo.com.armeabi-v7a.apk

    41532698775097Facebook Lite_405.0.0.8.113_apkcombo.com.armeabi-v7a.apk

    2024-2030中国RDF制粒机市场现状研究分析与发展前景预测报告.docx

    2024-2030中国RDF制粒机市场现状研究分析与发展前景预测报告

    财务困境-RLPM模型.xlsx

    详细介绍及样例数据:https://blog.csdn.net/li514006030/article/details/138549562

    基于python实现的Socket服务器与传感器通讯手段实现的家庭能源管理系统

    【作品名称】:基于Socket作为服务器与传感器通讯手段实现的家庭能源管理系统 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。

    node-v9.10.0-linux-armv7l.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    信息素养大赛的模拟题目

    内容概要: 此资源为信息素养大赛的算法创意实践挑战赛的模拟题目,包含:选择题、填空题、编程题。内容完全为自己整合,请各位同学及家长放心使用。

    什么是TJA和ICA.pdf

    什么是TJA和ICA

    2024-2030中国POS射频识别系统市场现状研究分析与发展前景预测报告.docx

    2024-2030中国POS射频识别系统市场现状研究分析与发展前景预测报告

    PCI & PCIe图像采集卡专精特新“小巨人”企业最新调研报告.docx

    PCI & PCIe图像采集卡专精特新“小巨人”企业最新调研报告

    基础运维技能(下)md格式笔记

    基础运维技能(下)md格式笔记

    ISO 18115-3-2022 表面化学分析词汇第3部分:光学界面分析术语.pdf

    ISO 18115-3-2022 表面化学分析词汇第3部分:光学界面分析术语.pdf

    node-v17.2.0-headers.tar.gz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    WordPress原创插件:当日24小时发布文章标题变红.zip

    WordPress原创插件:当日24小时发布文章标题变红

    微博热搜数据可视化分析系统,技术框架python + flask web + mysql + pycharm

    微博热搜数据可视化分析系统 技术框架 python + flask web + mysql + pycharm 角色介绍 普通用户 qqq 123456 模块分析 登录注册 数据爬取 数据清洗 数据可视化模块 热门话题排行 热词榜单 话题热度趋势和分布 话题情感指数和趋势 词云 NLP情感分析 相关话题推送 分词主题数据提取 舆情分析 退出模块 数据库weibo_nlp_system 分析原理 我的最爱是动漫,你喜欢什么呢? 我 的 最爱 是 动漫 你 喜欢 什么 呢

    node-v8.5.0-linux-armv7l.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    node-v9.3.0-linux-armv7l.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    QQIP查询,IP指针文件,IP查询

    这是一个能够获取 IP 访问者信息的文件。当有用户访问时,它可以精准地获取到访问者的 IP 地址。该文件具有高效、准确的特点,能够为相关应用提供有力的数据支持。通过使用这个文件,我们可以更好地了解访问者的来源和分布情况,有助于进行数据分析和应用优化。将其上传至 CSDN,希望能与更多开发者分享交流,共同探索其在不同领域的应用价值,为互联网技术的发展贡献一份力量。需注意,在使用过程中要遵循相关法律法规,确保数据的合法使用和隐私保护。

Global site tag (gtag.js) - Google Analytics