Dialog 为什么在显示自绘制的无模式对话框时出现任务栏。。有时

Dialog 为什么在显示自绘制的无模式对话框时出现任务栏。。有时,dialog,taskbar,modeless,Dialog,Taskbar,Modeless,我有一个有趣(但令人沮丧)的问题。我有一个使用全屏的应用程序(这是为了模拟第三方全屏POS应用程序) 我的应用程序在全屏应用程序顶部显示一系列非模态对话框。它显示一个,隐藏它,然后显示下一个,隐藏它等等。在第三次显示后,Windows任务栏大约1秒后出现。我不明白为什么 我已经将我的代码剥离回来,看看我在OnNcActivate处理程序(我用它来绘制蒙皮窗口)中是否在做什么,但我不认为是这样,因为问题似乎与时间有关。我自己也试过运行Spy++以及在WindowsProc中转储消息,但仍然看不到任

我有一个有趣(但令人沮丧)的问题。我有一个使用全屏的应用程序(这是为了模拟第三方全屏POS应用程序)

我的应用程序在全屏应用程序顶部显示一系列非模态对话框。它显示一个,隐藏它,然后显示下一个,隐藏它等等。在第三次显示后,Windows任务栏大约1秒后出现。我不明白为什么

我已经将我的代码剥离回来,看看我在OnNcActivate处理程序(我用它来绘制蒙皮窗口)中是否在做什么,但我不认为是这样,因为问题似乎与时间有关。我自己也试过运行Spy++以及在WindowsProc中转储消息,但仍然看不到任何能给我任何线索的奇怪信息

我的日志中有一些ID为0x36e的消息,但我无法找到它们应该是什么。我检查了各种邮件ID列表,但找不到它们。它们不应该是我自己的任何消息ID,因为WM_用户直到0x400才启动

我知道我可以通过自动隐藏任务栏来解决这个问题,但我不能要求我们的客户将他们的任务栏配置为自动隐藏来解决我的问题

你知道为什么任务栏会出现在我的非模态对话框中吗

编辑:我完全去掉了我自己绘制的GUI代码,我仍然有同样的问题。我可能错了,但当我首先调用ShowWindow(SW_HIDE)时,Windows会尝试激活“另一个窗口”(如MSDN中所述)。我认为在这种情况下,是激活任务栏而不是POS应用程序。另一方面,如果我在第二个窗口调用ShowWindow(SW_HIDE)之前打开了第二个窗口,那么它似乎会自动运行

干杯
Sparky经过长时间的讨论,我得出结论,破坏窗口不是问题所在。最后我发现显示一个对话框。。单击POS,然后单击返回有时会出现任务栏的对话框。我花了整整一周的时间试图找到所有这些的原因,但都没有用。我认为将POS窗口指定为所有者可以解决问题,但事实并非如此。最后,我的问题的解决方案是在显示我的对话框之前确定任务栏是否完全被遮挡。如果是,则在对话框显示期间隐藏任务栏(将其位置设置为SW_hide),然后在关闭对话框时将其设置为SW_SHOW。任务栏不再弹出,也不再让人烦恼。对于其他人的应用程序来说,这可能不是一个很好的解决方案,但对我们的客户来说却是完美的。

没错。注意力需要转移到某个地方。要使Windows拾取主窗口,请将其设置为无模式对话框的所有者。本文是关于模态窗口和启用的,但原理是一样的。这很有道理,但是如果你没有真正拥有“主窗口”——在我的例子中是POS应用程序——该怎么办呢。我们的软件可以在许多不同的POS应用程序上运行,因此我没有办法确定POS的窗口句柄是什么。我知道如何为特定的POS执行此操作,但我无法预测未来的POS应用程序行为等。肯定有办法断开应用程序与桌面的连接?我确实有一个主对话框窗口,它也是非模态的。我抱怨的所有弹出对话框都有(隐藏的)“主对话框”窗口作为其所有者。但是,如果我按热键显示主对话框,那么每次都会显示任务栏和主对话框窗口。当然,可以创建与任务栏/桌面无关的无模式对话框??这并不是说Windows知道“嘿,这个POS窗口很特别,当没有明显的焦点位置时,应该获得焦点。”有人需要说“下一步这个窗口应该获得焦点。”而那个人就是你。凭直觉,您如何识别POS窗口?也许你能认出它是在你显示对话框之前有焦点的窗口。也许你能认出它是最上面的全屏窗口。也许您会将其识别为属于POS.EXE的唯一可见窗口。不管你的方法是什么,把它转换成代码。窗口管理器寻找一个窗口并选择一些非全屏窗口。任务栏显示“由于焦点不在全屏窗口上,我将出现。”您的窗口与任务栏没有“关联”。任务栏只是遵循它的规则。如果你想脱离桌面,你可以创建自己的桌面,但你会发现这远比它的价值复杂得多。