如何创建一个表单,在另一个模态窗口显示时不被禁用?

11

我有一个实用程序对话框(非模态和置顶),应该在使用应用程序时始终可访问(比如在使用应用程序时可以用来做笔记的对话框)即使模态对话框被显示

应用程序的其余部分不能更改。

这是否可能?我该怎么做?


在Windows中,“模态”确实可能会让人感到很烦。 (我能想到的最糟糕的例子是Microsoft Word 2010,如果其他Word窗口有模态对话框打开,则无法打开Word文档(例如通过双击*.docx文件)。)也许您的实用程序表格可以成为不同应用程序的一部分? - Andreas Rejbrand
@Andreas Rejbrand:我曾考虑将其制作为单独的应用程序,但我需要访问应用程序的内部(用于某些捕获/重放机制)。 - jpfollenius
使用命名管道在两个应用程序之间进行通信非常容易。可以查看cromis-ipc来开始学习。 - LU RD
@Andreas Rejbrand:你的意思是“不,不可能”吗? - jpfollenius
https://stackoverflow.com/questions/13140321/how-do-i-make-a-dialog-modal-with-respect-to-some-but-not-all-of-the-programs - undefined
https://stackoverflow.com/questions/463778/delphi-possible-to-make-a-form-modal-to-specific-parent-form-only/ - undefined
1个回答

18

当调用ShowModal时,所有现有的顶层窗口都被禁用。这就是模态工作的原理。如果您有一个可以进行交互的窗口,您只需要重新启用它即可。

例如,您可以将以下内容添加到您的实用程序窗口中:

type
  TMyUtilityForm = class(TForm)
  protected
    procedure WMEnable(var Message: TWMEnable); message WM_ENABLE;
  end;
....
procedure TMyUtilityForm.WMEnable(var Message: TWMEnable);
begin
  if not Message.Enabled then
    EnableWindow(Handle, True);
  inherited;
end;

这将确保您的实用程序窗口永远不会被禁用。


1
@AndreasRejbrand 说得真好,但我只能希望这是真的!;-) - David Heffernan
1
+1 David,非常感谢你!这个很好用,让我省了很多功夫。非常感谢! - jpfollenius
2
我会加上 if not IsWindowEnabled(Handle),因为否则它看起来像是一个无限循环,即使 EnableWindow(Handle, True) 可能不会导致发送 WM_ENABLE 消息,如果窗口已经启用。 - Thijs van Dien
@DavidHeffernan: 我知道这不是原始问题中的内容,但上述方法在 MDI(多文档界面)中无效。 在 MDI 中,非模态窗体的 WMEnable 处理程序似乎从未被调用。 有什么解决方法吗? - No'am Newman
@No'am 或许可以提出一个新问题? - David Heffernan
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接