【问题标题】:Delphi - a Message form as another task's WindowDelphi - 作为另一个任务窗口的消息表单
【发布时间】:2011-02-24 11:45:11
【问题描述】:

我们有一个处理我们自己的消息的应用程序 - 一个定时程序为他们读取数据库。 找到一条记录,然后我们以模态方式显示一个表格。

这不是一个好的解决方案,因为用户可能会打字、看到任何东西等,并且表单会中止此操作。

我想我有时会看到,对话框、窗口与应用程序分离,它们似乎是另一个任务(这次任务栏有两个元素)。 但是这些事情很少发生,而且它们是错误...

但是我想找到一种方法来引起同样的事情。

计时器正在检查数据库,如果找到记录,那么我们将在后台显示一个表单,这似乎是另一个任务,并且它正在闪烁,并且它正在定期更改它的标题。 当用户点击它时,它会自行销毁,并以模态方式显示原始的“消息”形式。

我们可以用 Win32 技巧来做这件事吗? 怎么做?

谢谢: dd


感谢您的第一个回答。

我尝试创建一个简单的示例。你可以在这里看到:

type
    TC = class(TPanel)
        private
        protected
            procedure WMActivate(var Message: TWMActivate); message WM_ACTIVATE;

        public
            procedure CreateParams(var Params: TCreateParams); override;

end;

procedure TForm1.Button2Click(Sender: TObject);
var
    t : TC;
begin
    t := TC.Create(Self);
    t.Width := 100;
    t.Height := 100;
    t.Caption := 'aaaa';
    ShowWindow(t.Handle, sw_SHOW);
end;


{ TC }

procedure TC.CreateParams(var Params: TCreateParams);
begin
    inherited;
    Params.ExStyle := Params.ExStyle or WS_EX_APPWINDOW;
    Params.WndParent := GetDesktopwindow;
end;

procedure TC.WMActivate(var Message: TWMActivate);
begin
    if Message.Active <> WA_INACTIVE
        then begin
            SHowMessage('b');
            SHowWindow(Self.Handle, sw_HIDE);
        end;
end;

这是可行的,但我有一个问题。 任务的图标与应用程序相同。 如果有人随机点击它,可能点击了错误的项目。 如何重新定义子窗口的图标?

谢谢: dd

【问题讨论】:

  • 如果你想在屏幕上显示一些东西,但又不想偷取焦点,那么你需要一个工具提示。
  • 我正在做类似的事情。我强烈建议您将所有数据库读取和消息对话框处理移动到单独的线程,因为例如当您的数据库连接发生问题并且您没有停止刷新计时器时,您的主表单将处于连接超时的无限循环中,从用户的角度来看,这是一个程序滞后。
  • 而且由于您将它放在单独的线程中,您可以显示您在该线程的同步方法中创建的消息表单。

标签: delphi forms message task


【解决方案1】:

不是一个完整的解决方案,而是您可能需要的一个难题:要显示带有自己的任务栏按钮的表单,您可以覆盖 CreateParams

procedure TForm1.CreateParams(var Params: TCreateParams);
begin
  inherited CreateParams(Params);
  Params.ExStyle := Params.ExStyle or WS_EX_APPWINDOW;
end;

【讨论】:

  • Params.WndParent := GetDesktopWindow?这是明智的吗?
  • @David Heffernan 即使主表单被隐藏,它也允许表单保持打开状态。 Delphi 中的表单管理并没有让这些事情变得简单,这就是我设法解决它的方式。当然,可能有更好的方法。 OP 可能不需要它,所以我将继续编辑它。
  • 问题是表单窃取了焦点。我认为工具提示是通知的东西。
  • 使用工具提示我有问题,这是链接到一个控件。但是我们没有常用的控件。我们需要一个单独的表格。但这并不是一件太容易的事情……
  • @durumdara 我以为有Windows API可以显示这种通知工具提示,但我越搜索越觉得你必须以非焦点窃取的方式自己做。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-20
  • 2010-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多