C 如何使用winapi使子窗口(也称为自有窗口)的父窗口保持活动状态?

C 如何使用winapi使子窗口(也称为自有窗口)的父窗口保持活动状态?,c,winapi,parent,C,Winapi,Parent,我正在使用winapi编写一个小型C应用程序。我有一个带子窗口(工具箱)的窗口。我可以将它保持在这个窗口内,等等,但我的问题是:如果子窗口聚焦,如何保持主窗口处于活动状态 此时主窗口变灰 通过以下方式创建窗口: hMainWindow = DialogBoxParam(.......); hChildWindow = CreateDialogParam(..., hMainWindow, ...); ShowWindow (hChildWindow, SW_SHOW); 下面是两个窗口行为的

我正在使用winapi编写一个小型C应用程序。我有一个带子窗口(工具箱)的窗口。我可以将它保持在这个窗口内,等等,但我的问题是:如果子窗口聚焦,如何保持主窗口处于活动状态

此时主窗口变灰

通过以下方式创建窗口:

hMainWindow = DialogBoxParam(.......);
hChildWindow = CreateDialogParam(..., hMainWindow, ...); 
ShowWindow (hChildWindow, SW_SHOW);
下面是两个窗口行为的一个小图像:


将子窗口创建为非模态对话框,而不是模态对话框。因此,不要使用,而是使用

对不起,这只是Windows的工作方式:一次一个活动窗口

您可以在VisualStudio中看到这一点,如果将“查找和替换”作为工具窗口打开,您将看到它被激活,而主VS窗口变为非活动状态


试图同时激活它们可能会混淆用户和屏幕阅读器等辅助工具。

我发现,简单地将其创建为
WS\u CHILD
并显式地而不是
WS\u POPUP
就可以解决这一问题。它还将绝对窗口坐标转换为相对坐标,这样我就不必再通过移动父窗口来关心窗口位置


//已解决

AFAIK活动窗口是有焦点的窗口,因此如果子窗口有焦点,则主窗口也不能有焦点。可能不是这样,但我知道其他应用程序,如-您可能知道-Paint.NET是可能的。您可能想定义“活动”的含义?您正在使用MDI窗口吗?我没有使用MDI窗口。(不知道如何在C中实现)和“活动”=不像非活动窗口那样变灰。如果看到Paint.NET,请执行此操作。令人讨厌的黑客,它过滤Windows消息,使窗口确信它仍然处于活动状态,因此不会重新绘制标题栏。我记不清确切的细节,因此无法在这里重述。源代码不再可用,也许你可以在某个地方找到一个旧的副本。考虑一个字幕较少的工具窗口,而不是在客户端区域中画一个模拟标题栏。我已经这样做了。hPanel=CreateDialogParam(…);展示窗口(hPanel、SW_SHOW);那么我想我不明白这个问题。您只能有一个“活动”窗口。“最上面的窗口总是最集中的窗口。”关迈克的回答一直对我有用。您的意思是根本无法选择父窗口吗?或者你的意思是你根本不希望子窗口在创建时被聚焦?我已经做了一点修改。希望你现在能更好地理解这个问题。:)是的,你是对的,我可以把它做成一个面板吗?但是一个C语言的面板,我会用同样的方式,作为一个无标题的窗口。因此,问题依然存在。或者还有其他可能性吗?