如何处理来自单独线程的窗口消息?

2024-06-20

我希望启动一个单独的线程来处理窗口消息(通过阻塞 GetMessage 循环),但之后仍然在初始线程中创建窗口。

在单独的线程中,一旦启动,我就会调用PeekMessage使用 PM_NOREMOVE 确保消息队列存在(有必要吗?),然后..

AttachThreadInput(initial thread id,GetCurrentThreadId(),true)

..最终进入消息循环之前

我还没有使用互斥体或 cs 来确保这及时发生,但我只是使用Sleep为了简单起见,我在最初的线程中声明了这一点。

无论如何,窗口消息似乎不会被单独的线程拦截。

我有点不确定我这样做是否正确,并且希望得到任何可能的指导。两个线程都在同一个进程中

谢谢你们


那不是什么AttachThreadInput做。即使将输入队列附加到另一个线程后,Windows 仍然具有线程关联性。给定窗口的队列中的消息只能由该窗口的线程从队列中删除。

What AttachTheadInput所做的就是让两个线程共享一个输入队列。这允许他们查询有关输入状态的信息,并知道另一个线程将针对同一查询获得相同的答案。例如,一个线程可以调用GetAsyncKeyState并知道答案反映了另一个线程的关键状态。

它允许两个或多个线程与输入队列以及彼此之间具有与 Windows 3x 中的进程相同的关系。这就是这个 API 存在的原因;以便复杂的多进程应用程序可以从Win 3x 移植到Win95/WinNT。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何处理来自单独线程的窗口消息? 的相关文章

  • 使用标准用户帐户在提升的脚本中获取登录用户名

    在 Windows 7 中运行的批处理脚本中 我有几个 IF 子句 例如 IF USERNAME foo GOTO bar 不幸的是 当我运行这个批处理脚本时 用 以管理员身份运行 从上下文菜单中 USERNAME 始终是管理员的用户名 而
  • 如何区分触摸板生成的 WM_MOUSE*** 消息和鼠标设备生成的 WM_MOUSE*** 消息?

    我试过了GetMessageExtraInfo 这里提到 检测WM MOUSEMOVE是否是由触摸 笔引起的 https stackoverflow com questions 29857587 detect if wm mousemove
  • Windows 上的 ruby​​ 中出现 SSL 错误

    我收到以下错误 C Users user Desktop folder gt ruby exchange rate rb C Ruby23 x64 lib ruby 2 3 0 net http rb 933 in connect nonb
  • 如何正确调用 LsaLogonUser 进行交互式登录?

    我正在尝试使用 LsaLogonUser 创建交互式登录会话 但它总是返回STATUS INVALID INFO CLASS 0xc0000003 从网上查到的内存布局KERB INTERACTIVE LOGON结构很棘手 但我很确定我做得
  • 使用 Rcpp 和 OpenMP 在 R 中实现多线程和 SIMD 矢量化 Mandelbrot

    As an OpenMP Rcpp性能测试 我想检查使用最直接和最简单的方法在 R 中计算 Mandelbrot 集的速度有多快Rcpp OpenMP执行 目前我所做的是 include
  • Visual C++ 只有一个线程工作 (OpenMP)

    我有一个多线程应用程序的简单代码 但无论我传递多少个线程 它都只使用一个线程执行 起初 我以为是我的电脑的问题 但我又尝试了另一台电脑 但还是不行 我是不是出了什么事 我正在使用 Visual Studio 2015 如果有帮助的话 int
  • Linux 内核 - 如何停止等待信号量的 kthread?

    在编写 Linux 内核模块时 我遇到了一个 kthread 问题 在等待信号量解锁时无法唤醒该 kthread 这会导致线程不可停止并且rmmod尝试卸载模块时冻结 请注意 该模块在 3 10 内核上运行 我无法将其更新到较新的版本 客户
  • 如何获取文件或目录的标准化日期/时间戳。在纯批处理脚本中?

    Windows 命令行中有没有一种方法可以检索标准化文件或目录的日期 时间戳 修改 创建 访问 独立于语言环境格式 例如 ISO8601 http www iso org iso home standards iso8601 htm 我发现
  • 应用程序错误:故障地址0x00012afb(专家)

    我需要一些 光 来找到解决方案 可能有很多事情会导致这个问题 但也许有人可以帮助我 场景 Windows 服务器 24 7 运行 PostgreSQL 数据库和其他服务器应用程序 用于处理数据库上的任务等 有不同的服务器场景 30 具有不同
  • WindowsFromDc 返回 null

    我需要一些有关 win32 api 特别是 WindowsFromDc 的帮助 我有一个应用程序挂钩另一个应用程序 这两个应用程序通过 NamedPipe 进行通信 在第二个应用程序中 我挂钩了 DrawTextExW 函数 并从该函数中获
  • PHP中如何找出特定进程仍在运行

    我正在编写一个脚本 该脚本构建其他脚本的队列 并应该管理它们的启动 管理器脚本应该知道哪个子进程已经完成 因此它可以启动在队列中等待的其他脚本 我添加了一个 echo 获取每个子进程的进程 ID 所以我有我的子进程进程 ID 现在正在使用系
  • Git core.safecrlf 对具有相同行结尾的文件有不同的行为

    我有带有 VS 项目的 Windows 计算机 并且使用 Visual Studio 和 Cygwin 环境中的工具 包括 Git 有时 编辑后我会在文件中得到不同的行结尾 我想要简单的解决方案来检查文件的行尾一致性 然后再将其发送到存储库
  • 如何在 Windows 上以编程方式将 SVG 转换为 PDF?

    我希望在服务器上以编程方式将 SVG 转换为 PDF 文档 在 Windows 上执行此操作有哪些选项 我看过链接Inkscape http www inkscape org Batik http xmlgraphics apache or
  • 多线程:您在什么时候创建了太多线程?

    我正在开发一个多线程应用程序 该应用程序最初是单线程 后来扩展到多线程以实现性能提升 我有一个主线程 它将工作分成更小的块 并将其卸载到处理这些块的工作线程 此部分使用信号量进行控制 以在任何时间仅允许 X 个工作线程 工作线程生成数据块
  • 托管线程多久切换一次操作系统线程?

    据我所知 托管线程不能保证在同一操作系统线程上运行 如果 CLR 可以在操作系统线程之间切换托管线程 这种情况发生的频率是多少 频率受什么影响 我有一个单独的问题 https stackoverflow com questions 1979
  • 如何检查应用程序的另一个实例是否正在运行[重复]

    这个问题在这里已经有答案了 有人可以展示如何检查程序的另一个实例 例如 test exe 是否正在运行 如果是 则停止加载应用程序 如果存在该实例 想要一些严肃的代码吗 这里是 var exists System Diagnostics P
  • 强制 Java 最低版本以“java -version:”运行在 Windows 上不起作用

    我想强制应用程序运行的 JVM 最低版本为 1 6 或更高版本 即 1 6 我的理解是 您可以使用 version 命令行参数来执行此操作 我尝试了一下 在Linux下似乎可以正常工作 但在Windows下却不行 LINUX 我在 Linu
  • WinSock.h 和 WinSock2.h 使用哪个?

    有谁知道 WinSock h 和 WinSock2 h 之间的区别 我知道它们不使用相同的库 lib 但我不知道 WinSock2 是否仅添加了新功能 或者是否还改进了 WinSock 1 功能 我正在使用 IP TCP 套接字 并希望使用
  • Windows Defender 检测 Python EXE 为木马

    我制作了一个 Python 脚本 将 Windows 目录以 zip 形式邮寄给我 我使用 sched 模块添加了一个调度程序 每小时重复一次 我试图制作一个简单的同步应用程序供个人使用 在 Windows 启动时启动 我使用将其转换为 e
  • 如何为 Python 中的应用程序设置专用屏幕区域?

    MS OneNote 就是一个很好的例子 它可以选择固定在屏幕的一侧 并将所有其他窗口推到一侧 当最大化或调整其他窗口大小时 它们只能扩展到 OneNote 的边缘 Python 使用 Tkinter 或其他模块是否具有此功能 感谢您的帮助

随机推荐

  • 如何在java中获得整数的0填充二进制表示?

    例如 对于1 2 128 256输出可以是 16 位 0000000000000001 0000000000000010 0000000010000000 0000000100000000 I tried String format 16s
  • 如何在android中实现触摸平滑图像橡皮擦?

    我已经从 API 演示中看到了finturePaint java 我想实现触摸平滑橡皮擦 通过在android中触摸移动来擦除部分图像 FingerPaint 告诉我要实现这个 mPaint setXfermode new PorterDu
  • 删除行导致锁超时

    当我尝试从表中删除行时 我不断收到这些错误 这里的特殊情况是我可能同时运行5个进程 该表本身是一个 Innodb 表 约有 450 万行 我的 WHERE 子句中使用的列没有索引 其他指数按预期运行 这是在事务中完成的 首先删除记录 然后插
  • 使用 Dapper 插入时出现 NullReferenceException

    当我运行以下代码时 我收到一个 NullReferenceException 异常 指出对象引用未设置到该对象的实例 我已经使用不太复杂但格式相同的对象成功插入了 dapper 所以我不确定我做错了什么 public void Foo IE
  • jquery中文本区域自动调整大小

    我怎样才能做一个
  • C++20:非类型模板参数中的非捕获 lambda

    C 20 是否允许将非捕获 lambda 衰减为函数指针作为非类型模板参数直接传递 如果是这样 正确的语法是什么 我在不同版本的 clang 和 gcc 中尝试了以下代码 std c 2a include
  • Mercurial 和 SVN 并排在同一工作目录中?

    我们的环境目前使用SVN 我想更频繁地提交 但我不想破坏任何主要分支 就我个人而言 我比 SVN 更喜欢 Mercurial 如果我在 SVN 工作副本中初始化一个存储库 如果我只是定期提交到 Mercurial 存储库并将工作修订提交到
  • 如何正确设置Rocks DB上的TTL?

    我正在尝试将 Rocks DB 与 TTL 结合使用 我初始化rocks db的方式如下 options setCreateIfMissing true setWriteBufferSize 8 SizeUnit KB setMaxWrit
  • 测试 AngularJs 的 $http.defaults.headers.common 是否设置了特定标头

    所以我对 JavaScript 和 AngularJS 的世界还是个新手 因此我的代码还没有达到应有的水平 但它正在改进 尽管如此 我开始学习并实现一个带有 REST 后端的简单登录页面 提交登录表单后 将返回一个身份验证令牌并将其设置为默
  • iPhone 上的双精度与浮动

    我刚刚听说 iPhone 本身无法进行双倍操作 从而使它们比常规浮动慢得多 这是真的 证据 我对这个问题很感兴趣 因为我的程序需要高精度计算 而且我将不得不在速度上妥协 iPhone 可以在硬件中执行单精度和双精度算术 在 1176 原始
  • python 中的对数 y 轴 bin

    我正在尝试创建数据列的直方图并以对数方式绘制它 y axis 并且我不确定为什么以下代码不起作用 import numpy as np import matplotlib pyplot as plt data np loadtxt foo
  • 检测 iPhone 是否在运行时运行调试/分发构建

    是否可以在运行时检测正在运行的应用程序是否是通过调试或分发进行编译的 在项目信息中 对于调试配置 添加 DEBUG 预处理器宏 在 GCC 4 2 预处理部分 在代码中 如果您想要包含或不包含某些代码用于调试版本 则可以使用 ifdef 来
  • Visual Studio Code 不显示 Python 的输出

    我对 Python 非常陌生 刚刚开始了 Sendtex 的 Python 3 基础知识 课程 链接 https www youtube com channel UCfzlCWGWYyIQ0aLC5w48gBQ https www yout
  • 如何登录ec2机器?

    我获得了 EC2 机器的一些登录信息 基本上是 ec2 X X X compute X amazonaws com 加上用户名和密码 如何访问机器 我尝试过 ssh ssh email protected cdn cgi l email p
  • 如何通过Elasticsearch模糊匹配电子邮件或电话?

    我想通过 Elasticsearch 对电子邮件或电话进行模糊匹配 例如 匹配所有以以下结尾的电子邮件 gmail com or 匹配所有电话开头136 我知道我可以使用通配符 query wildcard email gmail com
  • AppStore 提交:错误 ITMS-9000:“无效的捆绑结构 - 不允许二进制文件‘MyApp.app/BuildAgent’

    我陷入了以下错误 我根本不明白 错误 ITMS 9000 无效的捆绑结构 不允许使用二进制文件 MyApp app BuildAgent 您的应用程序可能只包含一个可执行文件 当我使用 Xcode 从 Archive 导出到 IPA 时 我
  • 使用负索引对 std::vector 进行索引

    我试图索引一个vector使用负索引 这vector at 成员函数检查指定的索引是否在向量的范围内 如果没有发生 则返回一个out of range抛出异常 vector
  • Google Maps API 下拉列表,缩放至标记

    我正在使用 Google Maps API v3 我有一个带有一些标记的简单地图 我还有一个下拉列表 我需要最少的代码来完成这项工作 我想在下拉列表中选择一个标记 并将选定的标记平移到它 我已经尝试了一切并在网上查看 我发现事情很接近 但到
  • 使用 Java 在 Elasticsearch 中执行 Update By Query 时的 NPE

    我在 Spring Boot 应用程序中使用 Elasticsearch 2 4 我需要执行 update by query https www elastic co guide en elasticsearch reference 2 4
  • 如何处理来自单独线程的窗口消息?

    我希望启动一个单独的线程来处理窗口消息 通过阻塞 GetMessage 循环 但之后仍然在初始线程中创建窗口 在单独的线程中 一旦启动 我就会调用PeekMessage使用 PM NOREMOVE 确保消息队列存在 有必要吗 然后 Atta