关于魔法数字

我们可以使用如下的方法来获取窗口当前使用的窗口过程。

兼容32位和64位Windows版本:GetWindowLongPtr(hwnd, GWLP_WNDPROC)仅在32位Windows下使用:GetWindowLong(hwnd, GWL_WNDPROC)

为什么有时候我们会得到一些比较奇怪的返回值呢?如果窗口当前使用的窗口过程和GetWindowLongPtr的调用者不兼容,则GetWindowLongPtr调用将不会返回真实的窗口过程地址,而是返回一个所谓的”魔法数字”。

这个魔法数字的唯一目的在于,它可以被CallWindowProc识别并被转换成窗口过程所接受的参数格式。

举个例子

如果你使用的是Windows XP,并且系统是UNICODE版本的,但是有一个组件使用了ANSI来进行编译并在代码中调用了GetWindowLong(hwnd, GWL_WNDPROC)。因为调用者使用的是ANSI版本的消息,而窗口过程希望收到的是一个UNICODE版本的消息,所以这个调用将不会返回真实的窗口过程地址,而是返回一个上面所提到的魔法数字。

当你将这个魔法数字传递给CallWindowProc后,它会识别这个魔法数字:”噢,我需要将消息从ANSI版本转换为UNICODE版本,然后将UNICODE版的消息传递给窗口过程”。

另一个例子

如果你使用的系统是Windows 95且窗口是由一个32位组件所创建的,但是调用GetWindowLong(hwnd, GWLP_WNDPROC)的是一个16位的组件。再一次的,32位的窗口过程不会被真正的返回,因为消息需要从16位转换为32位。(另外,一个16位的程序不能跳转到一个32位的地址空间)

所以,GetWindowLong再一次地返回了一个魔法数字给调用者,CallWindowProc会识别这个魔法数字:”噢,我需要将16位版本的消息转换为32位版本的,然后将转换后的消息传递给窗口过程”。(实际上,我们使用了术语thunks来指代转换这个操作)

总结

你从GetWindowLongPtr(hwnd, GWLP_WNDPROC)调用中获取到的返回值,只应该有两个去处:

1) 将返回值传递给CallWindowProc。

2) 将返回值传递给SetWindowLongPtr(hwnd, GWLP_WNDPROC)。

返回值_关于GWLP_WNDPROC的那些奇怪的返回值相关推荐

  1. java方法返回值_如何高效率的学习Java函数返回值

    一.概述 函数返回处理值有两种方式,一种直接利用函数返回值返回:另一种通过输出参数返回,一般传入的值为引用或者指针. public Foo Function1(); // 函数返回值的形式 publi ...

  2. list修改元素的值_第115天:Python 到底是值传递还是引用传递

    我们平时写的 Python 程序中充斥着大量的函数,包括系统自带函数和自定义函数,当我们调用函数时直接将参数传递进去然后坐等接收返回值即可,简直不要太好用.那么你知道函数的参数是怎么传递的么,是值传递 ...

  3. java 数组的索引值_按索引访问Java数组位置的值

    我是 Java的新手,我只是在努力使用数组.我有一段代码,我在编写教程时已经编写过,但我很难理解它,如果有人能向我解释,我会很高兴. 我尝试过各种不同的方法(向我的鸭子解释,写下来等等)并且仍然无法理 ...

  4. wpf 窗口的返回值_如何:获取页函数的返回值

    如何:获取页函数的返回值How to: Get the Return Value of a Page Function 03/30/2017 本文内容 本示例显示如何获取页函数的返回值.This ex ...

  5. python自定义函数返回值_第八讲 python自定义函数返回值

    注意自定义函数:统一文件内函数名称不能相同. 单返回值 语法结构: def function_name([para1,para2...]): code... code... ... return va ...

  6. python一个函数调用另一个函数的返回值_在另一个函数中使用返回值

    所以我认为当你调用check_channel_number函数时,user_channel_number是在那里定义的,所以当你调用delete_events函数时,它已经超出了范围,也许这样会有帮助 ...

  7. sql如何处理null值_如何正确处理SQL中的NULL值

    sql如何处理null值 前言 (Preface) A friend who has recently started learning SQL asked me about NULL values ...

  8. python赋予x新值_快速为 Python 字典设置新的值

    dict = {'evaporation': {'释义': '蒸发', '词性': 'n'}, 'carpenter': {'释义': '木匠', '词性': 'n'}} 常规做法通常是这样,即先验证 ...

  9. mysql返回对象_使用mysql_fetch_object()以对象的形式返回查询结果

    mysql_fetch_object()同样用于获取查询数据结果集,返回当前行数据,并自动滑向下一行.但与mysql_fetch_row()和mysql_fetch_array()不同的是,它返回的是 ...

最新文章

  1. 【Groovy】MOP 元对象协议与元编程 ( 使用 Groovy 元编程进行函数拦截 | 重写 MetaClass#invokeMethod 方法实现函数拦截 | 实现函数调用转发 )
  2. 程序员必备的在线编程辅导平台之TutorialsPoint
  3. 【CV项目实战】纯新手如何从零开始完成一个工业级的图像分类任务?
  4. Nginx upstream 配置
  5. webpack4.x 模块化浅析-CommonJS 1
  6. 项目的启动顺序_多个项目进行如何做好进度管理
  7. CentOS/Redhat:手动配置IP地址(命令和图形界面)
  8. Android 打造完美的侧滑菜单/侧滑View控件
  9. java中result方法_java.sql.resultSet接口中有很多方法的实现
  10. 论用户体验测试:牛逼的功能千篇一律,好的体验万里挑一
  11. cmos逻辑门传输延迟时间_什么是TTL电平、CMOS电平?区别是什么?
  12. window7安装jdk报错this version of the jdk is already installed
  13. 工作十年的程序员,却拿着毕业三年的工资,再不开窍就真晚了!
  14. 混合颜料-python实现
  15. Vue定义全局常量,全局方法
  16. 认知升级三部曲(深度好文)
  17. 插件化框架集成-360插件框架DroidPlug
  18. 苹果的新技术3D Touch与以往的“长按屏幕”有何区别?
  19. 『中秋赏月』程序员用文心大模型带你玩转不一样的中秋
  20. Java实现-交错正负数

热门文章

  1. 在GHOST的WINXPSP2安装SQL SERVER2000个人版时出现“以前的某个程序安装已在安装计算机上创建挂起的文件操作。运行安装之前,必须重新启动计算机。”错误的解决方法...
  2. CCN:拥有雄厚实力的BCH将成为下一轮牛市的催化剂
  3. 失败的Omni协议与继续前行的虫洞协议
  4. Fedora 30系统的升级方法
  5. JS(JavaScript)的深入了解1(更新中···)
  6. wget 下载一个网站所有文件
  7. rtems线程管理与调度(一)
  8. MySQL 5.6.26 Release Note解读
  9. 实现jquery.ajax及原生的XMLHttpRequest调用WCF服务的方法
  10. C#程序实现动态调用DLL的研究(转)