当前位置: 首页 > news >正文

使用 SetParent 制作父子窗口的时候,如何设置子窗口的窗口样式以避免抢走父窗口的焦点

制作传统 Win32 程序以及 Windows Forms 程序的时候,一个用户看起来独立的窗口本就是通过各种父子窗口嵌套完成的,有大量窗口句柄,窗口之间形成父子关系。不过,对于 WPF 程序来说,一个独立的窗口实际上只有一个窗口句柄,窗口内的所有内容都是 WPF 绘制的。

如果你不熟悉 Win32 窗口中的父子窗口关系和窗口样式,那么很有可能遇到父子窗口之间“抢夺焦点”的问题,本文介绍如何解决这样的问题。


本文内容

    • “抢夺焦点”
    • 解决办法

“抢夺焦点”

下图中的上下两个部分是两个不同的窗口,他们之间通过 SetParent 建立了父子关系。

注意看下面的窗口标题栏,当我在这些不同区域间点击的时候,窗口标题栏在黑色和灰色之间切换:

抢夺焦点

这说明当子窗口获得焦点的时候,父窗口会失去焦点并显示失去焦点的样式。

你可以在这篇博客中找到一个简单的例子:

解决办法

而原因和解决方法仅有一个,就是子窗口需要有一个子窗口的样式。

具体来说,子窗口必须要有 WS_CHILD 样式。

你可以看看 Spyxx.exe 抓出来的默认普通窗口和子窗口的样式差别:

![默认普通窗口]](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9ibG9nLndhbHRlcmx2LmNvbS9zdGF0aWMvcG9zdHMvMjAxOS0wOS0xOS0xMC0yMS0zMS5wbmc?x-oss-process=image/format,png)

▲ 默认普通窗口

子窗口

▲ 子窗口


参考资料

  • 关于WS_CLIPCHILDREN和WS_CLIPSIBLINGS的理解(个人认为还是相当全面的) - helloj2ee - 博客园

我的博客会首发于 https://blog.walterlv.com/,而 CSDN 会从其中精选发布,但是一旦发布了就很少更新。

如果在博客看到有任何不懂的内容,欢迎交流。我搭建了 dotnet 职业技术学院 欢迎大家加入。

知识共享许可协议

本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。欢迎转载、使用、重新发布,但务必保留文章署名吕毅(包含链接:https://walterlv.blog.csdn.net/),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请与我联系。

相关文章:

  • WPF 程序如何移动焦点到其他控件
  • EFI 分区/恢复分区不可删除?你需要使用命令行了(配合鼠标操作)
  • EFI 分区/恢复分区不可删除?你需要使用命令行了(全命令行操作)
  • 使用傲梅分区助手无损合并分区,无损调整分区大小
  • .NET/C# 检测电脑上安装的 .NET Framework 的版本
  • Windows 系统上用 .NET/C# 查找所有窗口,并获得窗口的标题、位置、尺寸、最小化、可见性等各种状态
  • 直击本质:WPF 框架是如何实现模态窗口的
  • 什么是模态窗口?本文带你了解模态窗口的本质
  • 使用 .editorconfig 配置 .NET/C# 项目的代码分析规则的严重程度
  • 如何在 .NET 项目中开启不安全代码(以便启用 unsafe fixed 等关键字)
  • WPF 高性能位图渲染 WriteableBitmap 及其高性能用法示例
  • .NET 实现 NTFS 文件系统的硬链接 mklink /J(Junction)
  • 使用 Direct3D11 的 OpenSharedResource 方法渲染来自其他进程/设备的共享资源(SharedHandle)
  • 将 Direct3D11 在 GPU 中的纹理(Texture2D)导出到内存(Map)或导出成图片文件
  • .NET/C# 在 64 位进程中读取 32 位进程重定向后的注册表
  • [ 一起学React系列 -- 8 ] React中的文件上传
  • css属性的继承、初识值、计算值、当前值、应用值
  • ES学习笔记(10)--ES6中的函数和数组补漏
  • idea + plantuml 画流程图
  • Linux编程学习笔记 | Linux多线程学习[2] - 线程的同步
  • pdf文件如何在线转换为jpg图片
  • SegmentFault 2015 Top Rank
  • 笨办法学C 练习34:动态数组
  • 前端面试题总结
  • 学习笔记DL002:AI、机器学习、表示学习、深度学习,第一次大衰退
  • 一加3T解锁OEM、刷入TWRP、第三方ROM以及ROOT
  • #Spring-boot高级
  • #我与Java虚拟机的故事#连载07:我放弃了对JVM的进一步学习
  • (C语言)二分查找 超详细
  • (poj1.3.2)1791(构造法模拟)
  • (Redis使用系列) SpringBoot中Redis的RedisConfig 二
  • (附源码)node.js知识分享网站 毕业设计 202038
  • (附源码)springboot课程在线考试系统 毕业设计 655127
  • (南京观海微电子)——COF介绍
  • (十二)devops持续集成开发——jenkins的全局工具配置之sonar qube环境安装及配置
  • (四)docker:为mysql和java jar运行环境创建同一网络,容器互联
  • (算法)Travel Information Center
  • (一)spring cloud微服务分布式云架构 - Spring Cloud简介
  • (转)jdk与jre的区别
  • **CI中自动类加载的用法总结
  • 、写入Shellcode到注册表上线
  • .NET Core工程编译事件$(TargetDir)变量为空引发的思考
  • .NET设计模式(2):单件模式(Singleton Pattern)
  • .net项目IIS、VS 附加进程调试
  • /proc/interrupts 和 /proc/stat 查看中断的情况
  • /usr/bin/perl:bad interpreter:No such file or directory 的解决办法
  • @Transactional 详解
  • [ C++ ] STL---string类的模拟实现
  • [Android Studio] 开发Java 程序
  • [Android学习笔记]ScrollView的使用
  • [Bzoj4722]由乃(线段树好题)(倍增处理模数小快速幂)
  • [Effective C++读书笔记]0012_复制对象时勿忘其每一部分
  • [exgcd] Jzoj P1158 荒岛野人
  • [IE9] IE9 Beta崩溃问题解决方案
  • [IE编程] WebBrowser控件的多页面浏览(Tabbed Browsing)开发接口