强制应用程序在 OnCreate 过程中显示任务栏图标
Force application to show TaskBar Icon during OnCreate procedure
我用的是delphi XE2。在我的主窗体 OnCreate 过程中,我 运行 一些重要的元素,如登录过程等。我的问题是,当我显示登录表单(由 OnCreate 过程调用)时,我的应用程序在 TaskBar 上不可见 - 当主表单可见时它变得可见。问题是,当用户用另一个应用程序覆盖我的登录表单时,任务栏上没有图标,他可能不知道我的应用程序已经 运行s 并尝试重新启动它。他必须使用 ctrl+tab 来获取我的应用程序登录表单。
现在的问题...如何强制应用程序/OS 在 OnCreate 程序未完成时在任务栏上显示应用程序图标?
问候
马里奥
当主窗体的 window 创建并可见时,将显示任务栏按钮。那发生在 OnCreate
之后。简单的解决方案是稍后显示登录表单。显而易见的选择是 OnShow
。确保你只在第一次 OnShow
触发时这样做。
当然,这假设您希望主窗体在显示登录窗体时可见。如果没有,那么您需要确保登录表单有一个任务栏按钮。通过使其无主来做到这一点。覆盖 CreateParams
并将 WndParent
设置为 0
。但是,如果这样做,您将获得一个与登录表单标题同名的任务栏按钮。当登录表单关闭时,任务栏按钮将消失,主表单按钮将出现。您可能对它的外观不满意。
我想您可以尝试将 Application.MainFormOnTaskbar
设置为 False
。这样做,应用程序 window 就是任务栏按钮后面的 window。这也许是一个相当剧烈的变化。而且我不能 100% 确定如果主窗体未显示,任务栏按钮是否会显示,所以这可能是一个死胡同。
您可以覆盖登录表单的 CreateParams
以包含 WS_EX_APPWINDOW
ex-style。
type
TLoginForm = class(TForm)
..
protected
procedure CreateParams(var Params: TCreateParams); override;
...
end;
procedure TLoginForm.CreateParams(var Params: TCreateParams);
begin
inherited;
Params.ExStyle := Params.ExStyle or WS_EX_APPWINDOW;
end;
你可能想看看我的这个答案:
Delphi Change main form while application is running
在其中我展示了如何实现登录表单(在我的例子中实际上是主表单)和工作表单(这是你现在作为主表单的东西)的一些不同方法。
我的方法的主要优点:
- 因为工作人员表单是在成功登录后创建的,它允许您根据特定用户凭据(不同级别的访问权限)轻松地动态创建自定义组件布局
- 它让您可以轻松地注销当前用户,而无需关闭整个应用程序。这是可能的,因为 worker 表单不是应用程序的主表单,因此可以随时销毁而不会导致应用程序终止。而作为应用程序主窗体的登录窗体仅在特定用户登录时隐藏。
我用的是delphi XE2。在我的主窗体 OnCreate 过程中,我 运行 一些重要的元素,如登录过程等。我的问题是,当我显示登录表单(由 OnCreate 过程调用)时,我的应用程序在 TaskBar 上不可见 - 当主表单可见时它变得可见。问题是,当用户用另一个应用程序覆盖我的登录表单时,任务栏上没有图标,他可能不知道我的应用程序已经 运行s 并尝试重新启动它。他必须使用 ctrl+tab 来获取我的应用程序登录表单。
现在的问题...如何强制应用程序/OS 在 OnCreate 程序未完成时在任务栏上显示应用程序图标?
问候 马里奥
当主窗体的 window 创建并可见时,将显示任务栏按钮。那发生在 OnCreate
之后。简单的解决方案是稍后显示登录表单。显而易见的选择是 OnShow
。确保你只在第一次 OnShow
触发时这样做。
当然,这假设您希望主窗体在显示登录窗体时可见。如果没有,那么您需要确保登录表单有一个任务栏按钮。通过使其无主来做到这一点。覆盖 CreateParams
并将 WndParent
设置为 0
。但是,如果这样做,您将获得一个与登录表单标题同名的任务栏按钮。当登录表单关闭时,任务栏按钮将消失,主表单按钮将出现。您可能对它的外观不满意。
我想您可以尝试将 Application.MainFormOnTaskbar
设置为 False
。这样做,应用程序 window 就是任务栏按钮后面的 window。这也许是一个相当剧烈的变化。而且我不能 100% 确定如果主窗体未显示,任务栏按钮是否会显示,所以这可能是一个死胡同。
您可以覆盖登录表单的 CreateParams
以包含 WS_EX_APPWINDOW
ex-style。
type
TLoginForm = class(TForm)
..
protected
procedure CreateParams(var Params: TCreateParams); override;
...
end;
procedure TLoginForm.CreateParams(var Params: TCreateParams);
begin
inherited;
Params.ExStyle := Params.ExStyle or WS_EX_APPWINDOW;
end;
你可能想看看我的这个答案:
Delphi Change main form while application is running
在其中我展示了如何实现登录表单(在我的例子中实际上是主表单)和工作表单(这是你现在作为主表单的东西)的一些不同方法。
我的方法的主要优点:
- 因为工作人员表单是在成功登录后创建的,它允许您根据特定用户凭据(不同级别的访问权限)轻松地动态创建自定义组件布局
- 它让您可以轻松地注销当前用户,而无需关闭整个应用程序。这是可能的,因为 worker 表单不是应用程序的主表单,因此可以随时销毁而不会导致应用程序终止。而作为应用程序主窗体的登录窗体仅在特定用户登录时隐藏。