Win32:将窗口置于顶部

2024-05-07

我有一个 Windows 程序,其中有两个 2 窗口:

hwnd (main interface)

hwnd2 (toplevel window, no parent, created by hwnd)

当我双击 hwnd 时,我需要弹出 hwnd2 并显示一些数据,因此我使用此函数将 hwnd2 置于顶部:

BringWindowToTop(hwnd2);

hwnd2 被带到顶部,但有一点奇怪。当我再次点击hwnd2时,hwnd(主界面)又自动弹出。 我尝试使用以下函数来解决这个问题,但它们都不起作用。

SetWindowPos(hwnd, HWND_BOTTOM, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE);
                                                                  //doesn't work

BringWindowToTop(hwnd2);    //This is the function brings hwnd2 to top

SetForegroundWindow(hwnd2); //doesn't work

SetWindowPos(hwnd2, HWND_TOP, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE); 
                                                                  //doesn't work

SetWindowPos(hwnd2, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE);
                                       // hwnd2 "always" on top, not what I want

SetActiveWindow(hwnd2); // doesn't work too (for replying to Magnus Skog, thanks)

SwitchToThisWindow(hwnd2, TRUE);// got the same problem with BringWindowToTop function
SwitchToThisWindow(hwnd2, FALSE);

我该如何解决这个问题? 提前致谢。

(为了回复 aN,hwnd 2 没有父窗口,因为它需要是顶级窗口,因此它可以位于其他窗口的前面/后面)

(hwnd2是一个媒体播放器,由多个窗口组成,其中一个窗口用于视频显示,另外两个用于进度条和音量条的轨迹栏控件,一个用于控制面板的工具栏控件。)

(有一个这个可能会有所帮助,无论我点击hwnd2的哪个窗口,只要“鼠标按Z顺序位于hwnd之上”,hwnd就会自动弹出,包括菜单栏和非客户区等)

(这个媒体播放器是用Direct Show编写的。我使用IVideoWindow::put_Owner将视频窗口作为视频所有者,Direct Show内部创建一个子视频窗口作为视频窗口的子窗口。除了这个子视频窗口我看不到源代码,我在 hwnd2 中没有看到任何可疑的东西。)

我找到了原因,就是因为Direct Show。我用多线程来执行,然后问题就解决了。但为什么??

这个问题可以通过使用PostMessage(而不是SendMessage)来解决。


试试这个,据说来自M$

    HWND hCurWnd = ::GetForegroundWindow();
    DWORD dwMyID = ::GetCurrentThreadId();
    DWORD dwCurID = ::GetWindowThreadProcessId(hCurWnd, NULL);
    ::AttachThreadInput(dwCurID, dwMyID, TRUE);
    ::SetWindowPos(m_hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE);
    ::SetWindowPos(m_hWnd, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_SHOWWINDOW | SWP_NOSIZE | SWP_NOMOVE);
    ::SetForegroundWindow(m_hWnd);
    ::SetFocus(m_hWnd);
    ::SetActiveWindow(m_hWnd);
    ::AttachThreadInput(dwCurID, dwMyID, FALSE);

为了将窗口置于顶部,您应该获取窗口句柄、线程句柄、位于前台的窗口线程句柄

然后我们将线程附加到前台窗口线程并通过 AttachThreadInput 获取输入,然后设置窗口 z 顺序 到最顶层,然后将其 z 顺序恢复到正常,调用 SetForegroundWindow、SetFocus、SetActiveWindow 以确保我们的窗口被带到顶部并且处于活动状态并具有焦点

然后将输入队列与旧的前台窗口线程分离,使我们的线程成为唯一捕获输入事件的线程

那么我们为什么要调用AttachThreadInput呢,是因为

SetFocus 将键盘焦点设置到指定窗口。窗户必须是 附加到调用线程的消息队列。

AttachThreadInput 的作用是什么?

AttachThreadInput 函数可用于允许一组线程 共享相同的输入状态。通过共享输入状态,线程 分享他们的活动窗口的概念。通过这样做,一个线程 总是可以激活另一个线程的窗口。这个功能也是 对于共享焦点状态、鼠标捕获状态、键盘状态很有用, 以及不同线程创建的窗口之间的窗口 Z 顺序状态 其输入状态是共享的。

我们使用 SetWindowPos 将窗口置于最顶层,如果窗口使用 SWP_HIDEWINDOW 隐藏则显示窗口

SetWindowPos 函数更改窗口的大小、位置和 Z 顺序 子窗口、弹出窗口或顶级窗口。这些窗口是有序的 根据他们在屏幕上的外观。最上面的窗口 接收最高排名并且是 Z 顺序中的第一个窗口

如果您的问题是您的窗口也最小化,您应该在末尾添加一行代码

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

Win32:将窗口置于顶部 的相关文章

  • 如何向WebRequest添加参数?

    我需要从 Web 服务调用一个方法 所以我编写了以下代码 private string urlPath http xxx xxx xxx manager string request urlPath index php org get or
  • 套接字编程-listen() 和accept() 有什么区别?

    我一直在读本教程 http www cs rpi edu moorthy Courses os98 Pgms socket html了解套接字编程 看来listen and accept 系统调用都做同样的事情 即阻塞并等待客户端连接到使用
  • C# - Visual Studio 中的 System.OutOfMemoryException

    我遇到问题 当我右键单击 Visual Studio 中的主窗体并转到 视图设计器 时 出现错误 它说 引发了 System OutOfMemoryException 类型的异常 堆栈跟踪 at System Reflection Asse
  • 如何从 C# 调用 F# 类型扩展(静态成员函数)

    FSharp 代码的结构如下 我无法控制源代码 namespace FS
  • c 使用 lseek 以相反顺序复制文件

    我已经知道如何从一开始就将一个文件复制到另一个文件 但是我如何修改程序以按相反的顺序复制它 源文件应具有读取访问权限 目标文件应具有读写执行权限 我必须使用文件控制库 例如 FILE A File B should be ABCDEF FE
  • 使用默认行为将模型绑定到接口

    我正在尝试将控制器操作绑定到接口 但仍保持默认的绑定行为 public class CoolClass ISomeInterface public DoSomething get set ISomeInterface public clas
  • 应用新设置时如何防止 GraphicsDevice 被丢弃?

    我的游戏窗口允许手动调整大小 这意味着它可以像任何其他普通窗口一样通过拖动其边缘来调整大小 游戏还利用了RenderTarget2D rt2d 在主 Draw 方法中设置主渲染目标 GraphicsDevice SetRenderTarge
  • 多线程 - 比单线程慢

    当我使用多个线程而不是单线程运行程序时 它会变慢 不是应该更快吗 该程序应该遍历从起始目录开始的所有目录 并查找并打印所有名为 X 的文件 代码如下 while done pthread mutex lock lock if list is
  • += 运算符在 C++ 中是如何实现的?

    这是我一直在思考的一个问题 但从未找到任何资源来说明这个问题的答案 事实上它不仅是为了 也适用于它的兄弟姐妹 即 等等 当然不是 考虑这个例子 int a 5 a 4 this will make a 9 现在考虑等效表达式 a a 4 T
  • 多个线程访问一个变量

    我在正在读的一本教科书中发现了这个问题 下面也给出了解决方案 我无法理解最小值怎么可能是 2 为什么一个线程不能读取 0 而所有其他线程都执行并写入 1 而无论是1还是2 最后写入的线程仍然必须完成自己的循环 int n 0 int mai
  • 如果我重新分配并且新大小为 0,会发生什么情况。这与释放等效吗?

    给出以下代码 int a NULL a calloc 1 sizeof a printf d n a a realloc a 0 printf d n a return 0 它返回 4078904 0 这个 realloc 相当于 free
  • 禁用实体框架的默认值生成(Code First)

    我数据库中有一个列不能为空 我想将其设置为默认值在数据库中 问题是实体框架似乎自己创建了一个默认值 例如 int gt 0 并且完全忽略了数据库中的默认值约束 有没有办法禁用实体框架的默认值 我发现您可以使用以下属性来装饰您的字段 Data
  • 如何使用 C# 将表格粘贴到 Ms-Word 文档的末尾

    我有一个预制的 Word 模板 其中有一个表格 我想打开它 然后在文档末尾添加 粘贴 另一个表格 问题是它不会转到文档的末尾 而是将新表格粘贴到原始表格的第一个单元格中 任何帮助将不胜感激 previous code copied a ta
  • 检测笔记本电脑盖子的关闭和打开

    是否可以检测笔记本电脑的盖子何时打开或关闭 从我读到的内容来看 这是不可能的 但 SO 之前已经帮助我完成了不可能的任务 我发现唯一可能朝着正确方向的事情是关于报告电源按钮所需的 IOCTL 的 MSDN 博客文章 https learn
  • 删除数组时出现访问冲突异常

    删除分配的内存时 出现 访问冲突读取位置 异常 如下所示 我有一个针对 Visual Studio 2010 工具集 v100 C 编译器编译的本机 dll 我有一个针对它的托管 dll 包装器 它是针对工具集 v90 编译的 因为我想以
  • 按 Enter 继续

    这不起作用 string temp cout lt lt Press Enter to Continue cin gt gt temp cout lt lt Press Enter to Continue cin ignore 或更好 in
  • 如何使用“路径”查询 XDocument?

    我想查询一个XDocument给定路径的对象 例如 path to element I want 但我不知道如何继续 您可以使用以下方法System Xml XPath Extensions http msdn microsoft com
  • 包含从代码隐藏 (ASP.NET C#) 到 ASPX 中的图像概述的图像列表 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 在两个点之间创建一条曲线,每个点都具有标准化向量

    因此 我需要一种写入方法来在两点之间创建一条曲线 每个点都有一个指向任意方向的归一化向量 我一直在尝试设计这样一种方法 但一直无法理解数学 在这里 由于一张图片胜过一千个文字 这就是我所需要的 在图中 矢量垂直于红线 我相信向量需要进行相同
  • 线程安全的有限大小队列,不使用锁

    我正在尝试编写一个主题队列 但遇到死锁和其他多线程问题 我想用Interlocked CompareExchange避免lock用法 但这段代码并没有按预期工作 它只是擦除整个队列 我在这里做错了什么 public class FixedS

随机推荐

  • 不同计算机上的 Android 设备之间的通信

    是否可以使 Eclipse 上的两个 Android 模拟器从通过快速以太网链路连接的两台不同机器进行通信 感谢您的回复 是的 传出端可以正常工作 但传入端 无论哪一个正在接收连接 都有点复杂 您可以设置模拟器或 adb 端口转发 但这只会
  • 重用 Java 方法的最佳方法

    我正在学习 Java 和 OOP 并且一直在做问题欧拉计划 http projecteuler net index php section problems用于练习 顺便说一句 很棒的网站 我发现自己一遍又一遍地做许多相同的事情 例如 检查
  • 电子在没有任何信息的情况下死亡,现在怎么办?

    我正在构建的应用程序 当我编译它以使用电子构建器打包它进行分发时 时不时地会死掉 显示空白屏幕和断开连接的开发工具 有什么想法或者如何开始弄清楚这里发生了什么吗 听听uncaughtException事件并记录您收到的任何错误 这将使您深入
  • Msil 以动态类型发出静态数组

    我正在尝试使用 Reflection Emit 在 c 中 创建一个新类型 我想要创建的代码类似于 public class public static int A new int 1 2 3 我首先尝试定义一个字段 然后设置它的值 var
  • 在 CSS 中指定后备字体大小?

    有没有办法指定不同的字体sizesCSS 中的后备字体 我想做这样的事情 这显然不起作用 div font family Arial Narrow Arial Helvetica sans serif font size 20px 18px
  • BigInteger 的困难

    我正在尝试使用递归和 BigInteger 进行阶乘 但 eclipse 抱怨 BigInteger 我知道这个程序应该很简单 但它让我头疼 这是代码 import java util Scanner import java math Bi
  • 使用 spring-java-config 创建“决策步骤循环”

    我正在尝试将 spring batch 作业 在 xml 中定义 移植到基于 java config 的作业 这是我的作业配置文件的片段
  • 在哪里可以找到并提交有关 Google Chrome 浏览器的错误报告?

    对于想要为 chrome 浏览器进行开发的开发人员来说 能够审查现有的错误 以避免太多的麻烦 并添加新的错误 以改进 是很重要的 但我似乎找不到该项目的错误跟踪 它is开源 对吗 谷歌正在称呼它Chromium http code goog
  • 内存地址是否指向一个字节的信息?

    以下是 DTS 文件的摘录 linux arch powerpc boot dts 板名 dts memory device type memory reg lt 0x00000000 0x40000000 gt 1GB at 0 嵌入式设
  • Feathers 中的任意响应内容类型

    我有一项自定义服务 必须以 CSV 格式返回数据 我无法使用标准 Express 路线 因为我需要在该端点上使用 Feathers 的钩子 我找不到返回非 HTML 非 JSON 数据的 Feathers 服务的示例 并且找不到指定响应内容
  • 如何查找出现在括号之间的所有单词?

    我有一个文件 其中包含括号中的一些单词 我想编制一个出现在那里的所有独特单词的列表 例如 This is some text This text has some words in parenthesis Sometimes there a
  • 在 osx 上安装 pycrypto 时出现问题

    我正在尝试将 Django 项目安装到我的 OSX 计算机上 这需要 PyCrypto 我收到以下错误 running install running build running build py running build ext run
  • 如何在Qt中设置编译器?

    我对 Qt 完全陌生 我下载了离线版本 Qt 5 3 2 for Windows 64 bit VS 2013 OpenGL 573 MB 我无法编译我的项目 I have Qt Creator 3 2 1 开源 基于Qt 5 3 2 MS
  • 为什么要为具有重要析构函数的类声明 constrexpr 构造函数(例如 unique_ptr、std::variant)

    据我了解 至少对于c 14 析构函数不能是constexpr如果它不是微不足道的 隐式生成或 default 声明的意义何在constexpr具有非平凡析构函数的结构的构造函数 struct X int a constexpr X int
  • JavaScript 中的全局函数

    我是 js 新手 试图了解全局和私有函数 我了解全局变量和局部变量 但是如果我有一个名为test html和 2 个名为test1 js and test2 js 现在我包括test1 js and test2 js in test htm
  • Android 广播接收器中的 StartActivity

    我在manifest xml中注册接收短信广播 如何在广播的 receive 方法中启动新的活动 是否有任何意图要设置的标志或其他什么 use FLAG ACTIVITY NEW TASK像这样 Override public void o
  • (cons 'a (cons 'b 'c)) 和 (cons 'a '(b.c)) 之间的 Lisp 区别

    有什么区别 cons a cons b c A B C and cons a b c A B C 我需要使用 cons 创建以下列表 a b c 所以我试图理解 是什么 代表 L E 我有以下内容 cons cons a b c 但它产生
  • Java 开发人员在 Mac OS 上遇见 Objective-C

    很多年前我就用 C 进行过开发 但现在我主要是一名 Java 软件工程师 鉴于我拥有一部 iPhone 准备下个月购买 MacBook 并且总体上对开始 Mac OS 开发 使用 Objective C 感兴趣 我想我应该提出这个问题 下一
  • OnCreateOptionsMenu() 未在 Fragment 中调用

    我有一个应用程序 它有一个活动 其中有两个水平放置的片段 在我的活动中 我使用了膨胀菜单onCreateOptionsMenu 使用它我可以显示操作栏选项菜单 但是 当我尝试从我的片段之一更新操作栏菜单项时 onCreateoptionsm
  • Win32:将窗口置于顶部

    我有一个 Windows 程序 其中有两个 2 窗口 hwnd main interface hwnd2 toplevel window no parent created by hwnd 当我双击 hwnd 时 我需要弹出 hwnd2 并