博客
关于我
窗口与线程的关系
阅读量:335 次
发布时间:2019-03-04

本文共 1073 字,大约阅读时间需要 3 分钟。

能产生消息的四种情况

在Windows系统中,消息的产生主要涉及以下四种情况:

  • 鼠标:鼠标的点击、拖动和滚动等操作会产生消息。
  • 键盘:键盘的按键按下和按住等动作会触发键盘事件。
  • 其他应用程序(进程间消息传递):通过SendMessage函数或其他 IPC机制,应用程序之间可以跨进程发送消息。
  • 操作系统的内核程序:内核程序负责处理底层的系统事件和异常。
  • 消息的传递路径

    在Windows系统中,消息是通过窗口和线程来传递的。当鼠标点击按钮时,消息会被发送到对应窗口所在线程的消息队列。值得注意的是,Windows系统启动了两个线程分别监听鼠标和键盘输入,这两个线程运行在0环中,与主程序无关。因此,即使主程序卡死,鼠标仍然可以正常移动。

    如何通过窗口找到消息队列

    要理解窗口的作用,首先需要了解窗口在哪。通过IDA调试工具分析user32.dll中的CreateWindow函数,可以追踪到窗口的创建过程。随后,调试步骤会进入0环,进一步分析窗口的具体信息。

    关于窗口的一切数据都位于0环中,包括窗口的创建、显示以及消息处理。因此,窗口的信息非常重要。

    窗口对象的结构

    窗口对象在0环中以_WINDOW_OBJECT的结构体形式存在。该结构体包含以下信息:

    • 所属线程信息,通过PTHREADINFO pti可以知道当前窗口所属哪个线程。
    • 窗口的各种属性,如窗口类、父窗口、子窗口等。

    需要注意的是,窗口中的按钮等控件也是窗口的一部分,即使它们是子控件,也会被系统视为独立的窗口对象。因此,一个线程可能会拥有多个窗口对象。

    子窗口控件

    Windows系统提供了多种预定义的窗口类,称为子窗口控件(controls),这些控件可以独立处理消息,并在自身状态发生变化时通知父窗口。常见的控件类型包括:

  • 按钮(Button):用于触发事件。
  • 复选框(Checkbox):用于选择或取消选项。
  • 编辑框(Edit):用于文本输入。
  • 静态字符串标签(Static):用于显示文本或图像。
  • 滚动条(ScrollBar):用于调整窗口大小。
  • 窗口对象中还包含Wnd成员,用于存储窗口的各种属性,如窗口风格、父窗口信息、子窗口信息等。

    窗口对象的特殊性

    Windows系统将窗口对象放在0环中,这意味着:

  • 窗口句柄是全局的,所有进程共享同一个句柄表。
  • 窗口对象的操作不依赖于进程或线程。
  • 窗口的创建和管理完全由内核负责,不需要线程通信机制。
  • 总结

  • 窗口是在0环中创建的。
  • 窗口句柄是全局的,可以被多个线程共享。
  • 每个窗口只能属于一个线程,但一个线程可以拥有多个窗口。
  • 转载地址:http://nsve.baihongyu.com/

    你可能感兴趣的文章
    SDUT2161:Simple Game(NIM博弈+巴什博弈)
    查看>>
    51nod 1596 搬货物(二进制处理)
    查看>>
    来自星星的祝福(容斥+排列组合)
    查看>>
    Hmz 的女装(递推)
    查看>>
    HDU5589:Tree(莫队+01字典树)
    查看>>
    Codeforces Round #459 (Div. 2):D. MADMAX(记忆化搜索+博弈论)
    查看>>
    Linux 6种日志查看方法,不会看日志会被鄙视的
    查看>>
    不停机替换线上代码? 你没听错,Arthas它能做到
    查看>>
    后端程序员不得不会的 Nginx 转发匹配规则
    查看>>
    sharding-jdbc 分库分表的 4种分片策略,还蛮简单的
    查看>>
    分库分表的 9种分布式主键ID 生成方案,挺全乎的
    查看>>
    MySQL不会丢失数据的秘密,就藏在它的 7种日志里
    查看>>
    Python网络编程之socket应用
    查看>>
    Python开发之序列化与反序列化:pickle、json模块使用详解
    查看>>
    Git学习笔记:基础篇
    查看>>
    回顾-生成 vs 判别模型-和图
    查看>>
    Python 的 type 及常用魔法方法(上)
    查看>>
    Python基础 - 字符串处理
    查看>>
    采坑 - 字符串的 "" 与 pd.isnull()
    查看>>
    无序列表 - 链表
    查看>>