研究Win32 GUI中SetActiveWindow与SetFocus和窗口消息

研究Win32 GUI中SetActiveWindow与SetFocus和窗口消息为了与 Win32GUI 的函数功能兼容 得先知道 Windows 是怎么处理这些信息的 才能模仿 这次研究对象是 SetActiveWin 与 SetFocus 和窗口消息 WM SETFOCUS WM ACTIVATE 之间的关系

为了与Win32 GUI的函数功能兼容,得先知道Windows是怎么处理这些信息的,才能模仿。

这次研究对象是SetActiveWindow与SetFocus和窗口消息WM_SETFOCUS,WM_ACTIVATE之间的关系

————————————

SetFocus

功能:设置新的焦点窗口,只有焦点窗口才能获取键盘输入消息

1.这个函数会检查输入的窗口,如果是最小化的窗口,或者禁用的窗口,则不会改变焦点.

2.如果要设置的焦点窗口是子窗口,且其父窗口不是激活状态,还会调用SetActiveWindow将其父窗口激活.

3.检查激活窗口是否成功,如果没有成功,则取消设置新焦点.

4.向窗口发送WM_SETFOCUS消息,向前一个焦点窗口发送WM_KILLFOCUS消息

———————————–

功能:设置激活窗口,只有激活窗口,才能拥有焦点窗口

1.检查传入的窗口,如果是子窗口,则取消操作

2.向当前激活窗口发送WM_NCACTIVE消息,如果当前激活窗口返回FALSE,则表示它不同意其它窗口被激活,所以取消操作.

4.将传入的窗口标记为激活窗口,并将窗口的Z序置顶,

5.向新激活窗口发送WM_NCACTIVE和WM_ACTIVE消息,告之被成功激活.

———————————

WM_NCACTIVE

这个消息通知窗口,非客户区被激活或取消激活.

当WPARAM参数为FALSE时,表示窗口要被取消激活,此时如果返回FALSE,则会阻止被取消激活,返回TRUE则表示允许被激活。

WM_SETFOCUS 

这个消息是通知窗口,即将获得或失去焦点;

DefWindowProc好像并没有处理这个消息。

WM_ACTIVATE 

 这个消息是通知窗口,即将被激活或取消激活;

———————————

这里很诡异的是,如果对一个未激活的主窗口调用SetFocus,它会激活这个窗口,

而激活这个窗口会发送WM_ACTIVE消息,而默认处理WM_ACTIVE消息的方式又是对这个窗口调用SetFocus…

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/227035.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月16日 下午10:05
下一篇 2026年3月16日 下午10:06


相关推荐

  • github加速插件

    github加速插件在chrome或edge的插件库里搜索github加速,安装后访问github,和在github上下东西都很快

    2025年6月15日
    3
  • 面试常问到的经典100问 附答案和点评 参加过面试的人就知道这些题目出现的频率有多高啦 ①

    面试常问到的经典100问 附答案和点评 参加过面试的人就知道这些题目出现的频率有多高啦 ①1 问题 请给我们谈谈你自己的一些情况回答 简要的描述你的相关工作经历以及你的一些特征 包括与人相处的能力和个人的性格特征 如果你一下子不能够确定面试者到底需要什么样的内容 你可以这样说 有没有什么您特别感兴趣的范围 BYSCN com 点评 企业以此来判断是否应该聘用你 通过你的谈论 可以看出你想的是如何为公司效力还是那些会影响工作的个人问题 当然 还可以知道你的一些背景

    2026年3月27日
    2
  • 马拉车算法Java_马拉车算法(Manacher’s Algorithm)

    马拉车算法Java_马拉车算法(Manacher’s Algorithm)这是悦乐书的第 343 次更新 第 367 篇原创 Manacher sAlgorithm 中文名叫马拉车算法 是一位名叫 Manacher 的人在 1975 年提出的一种算法 解决的问题是求最长回文子串 神奇之处在于将算法的时间复杂度精进到了 O N 下面我们来详细介绍下这个算法的思路 01 算法由来在求解最长回文子串的问题时 一般的思路是以当前字符为中心 向其左右两边扩展寻找回文 但是这种解法的时间复杂度是 O

    2026年3月18日
    0
  • redisson和jedis区别_java调用redis集群

    redisson和jedis区别_java调用redis集群Redis可以存储键与5种不同数据结构类型之间的映射,这5种数据结构类型分别为String(字符串)、List(列表)、Set(集合)、Hash(散列)和Zset(有序集合)。 redis与spring的整合一般分为spring-data-redis整合和jedis整合,先看看两者的区别1、引用的依赖不同:spring-data-redis使用的依赖如下:<depen…

    2025年10月17日
    4
  • es6数组方法find()、findIndex()与filter()的总结

    es6数组方法find()、findIndex()与filter()的总结find()该方法主要应用于查找第一个符合条件的数组元素。它的参数是一个回调函数。在回调函数中可以写你要查找元素的条件,当条件成立为true时,返回该元素。如果没有符合条件的元素,返回值为undefined。以下代码在myArr数组中查找元素值大于4的元素,找到后立即返回。返回的结果为查找到的元素:constmyArr=[1,2,3,4,5,6];varv=myArr.find(value=>value>4);console.log(v);//5没有符合元素,返回undefi

    2022年5月29日
    81
  • json数据结构

    json数据结构一 使用中 json 有以下三种结构 对象 name Michael age 24 数组 比如 name Michael age 24 name Tom age 25 值 name Michael birthday month 8 day 26 类似于对象嵌套对象 很多人疑惑 和 形式的区别 看到一段很经典的

    2026年3月16日
    1

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号