ShowModa窗体l如何一定要显示在前面

zuilu5339 2018-06-27 04:44:33
application.CreateForm(TFrm_editBom,Frm_editBom);
Frm_editBom.ShowModal;
Frm_editBom.Free;
正常来说都是显示在最前面,有时候我感觉是有点卡就显示不在最前面,然后只能退出,重来
...全文
575 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
doloopcn 2018-07-28
  • 打赏
  • 举报
回复
DELPHI 自带的SHOW或者是SHOWMODE都是不能够在Windows下面确保在最前,想确定窗口一定在Windows下保持最前的,就只能用“BlueStorm"的方法吧
不值一提 2018-07-10
  • 打赏
  • 举报
回复
试试formStyle属性设置
BlueStorm 2018-07-09
  • 打赏
  • 举报
回复
SetForegroundWindow只是请求windows系统把该form显示最前面而已,windows让不让它显示在最前面,那还得看情况。
xiaocongzhi 2018-07-09
  • 打赏
  • 举报
回复
用WINAPI: SetForegroundWindow
BlueStorm 2018-06-28
  • 打赏
  • 举报
回复

示例
unit Unit4;

interface

uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs;

const
WM_AFTER_SHOW = WM_USER + 1;

type
TFrm_editBom = class(TForm)
procedure FormShow(Sender: TObject);
private
procedure WmAfterShow (var Msg: TMessage); message WM_AFTER_SHOW;
public
{ Public declarations }
end;

var
Frm_editBom: TFrm_editBom;

function ForceForegroundWindow(hWnd: THandle): Boolean;

implementation

{$R *.dfm}

procedure TFrm_editBom.FormShow(Sender: TObject);
begin
PostMessage(Handle, WM_AFTER_SHOW, 0, 0);
end;

procedure TFrm_editBom.WmAfterShow(var Msg: TMessage);
begin
Application.ProcessMessages;
ForceForegroundWindow(Handle);
end;

function ForceForegroundWindow(hWnd: THandle): Boolean;
var
HelpForm: TForm;
begin
HelpForm := TForm.Create(nil);
try
HelpForm.BorderStyle := bsNone;
HelpForm.SetBounds(0, 0, 1, 1);
HelpForm.FormStyle := fsStayOnTop;
HelpForm.Show;
mouse_event(MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
mouse_event(MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
SetForegroundWindow(hWnd);
finally
HelpForm.Free;
end;
Result := True;
end;

end.

BlueStorm 2018-06-28
  • 打赏
  • 举报
回复

或者:
function ForceForegroundWindow(hWnd: THandle): Boolean;
var
HelpForm: TForm;
begin
HelpForm := TForm.Create(nil);
try
HelpForm.BorderStyle := bsNone;
HelpForm.SetBounds(0, 0, 1, 1);
HelpForm.FormStyle := fsStayOnTop;
HelpForm.Show;
mouse_event(MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
mouse_event(MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
SetForegroundWindow(hWnd);
finally
HelpForm.Free;
end;
Result := True;
end;
BlueStorm 2018-06-28
  • 打赏
  • 举报
回复
function ForceForegroundWindow(hWnd: THandle): Boolean;
const
SPI_GETFOREGROUNDLOCKTIMEOUT = $2000;
SPI_SETFOREGROUNDLOCKTIMEOUT = $2001;
var
ForegroundThreadID: DWORD;
ThisThreadID: DWORD;
timeout: DWORD;
begin
if GetForegroundWindow = hWnd then
Result := True
else
begin
Result := False;
ForegroundThreadID := GetWindowThreadProcessID(GetForegroundWindow, nil);
ThisThreadID := GetWindowThreadPRocessId(hWnd, nil);
if AttachThreadInput(ThisThreadID, ForegroundThreadID, True) then
begin
BringWindowToTop(hWnd);
SetForegroundWindow(hWnd);
AttachThreadInput(ThisThreadID, ForegroundThreadID, False);
Result := (GetForegroundWindow = hWnd);
end;
if not Result then
begin
SystemParametersInfo(SPI_GETFOREGROUNDLOCKTIMEOUT, 0, @timeout, 0);
SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT, 0, TObject(0),
SPIF_SENDCHANGE);
BringWindowToTop(hWnd);
SetForegroundWindow(hWnd);
SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT, 0, TObject(timeout), SPIF_SENDCHANGE);
end;
Result := (GetForegroundWindow = hWnd);
end;
end;
zuilu5339 2018-06-28
  • 打赏
  • 举报
回复
还有没有办法
BlueStorm 2018-06-28
  • 打赏
  • 举报
回复
我试过了,是可以的。

最好用第一个function ForceForegroundWindow(hWnd: THandle): Boolean; 第二个ForceForegroundWindow不太完善。
代码是加在被showModal出来的form里面,因此show和ShowModal都工作正常。

你觉得太复杂,那我就没办法了,我找不到其他可靠又更简单的方法。
zuilu5339 2018-06-28
  • 打赏
  • 举报
回复
引用 6 楼 BlueStorm 的回复:

示例
unit Unit4;

interface

uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs;

const
WM_AFTER_SHOW = WM_USER + 1;

type
TFrm_editBom = class(TForm)
procedure FormShow(Sender: TObject);
private
procedure WmAfterShow (var Msg: TMessage); message WM_AFTER_SHOW;
public
{ Public declarations }
end;

var
Frm_editBom: TFrm_editBom;

function ForceForegroundWindow(hWnd: THandle): Boolean;

implementation

{$R *.dfm}

procedure TFrm_editBom.FormShow(Sender: TObject);
begin
PostMessage(Handle, WM_AFTER_SHOW, 0, 0);
end;

procedure TFrm_editBom.WmAfterShow(var Msg: TMessage);
begin
Application.ProcessMessages;
ForceForegroundWindow(Handle);
end;

function ForceForegroundWindow(hWnd: THandle): Boolean;
var
HelpForm: TForm;
begin
HelpForm := TForm.Create(nil);
try
HelpForm.BorderStyle := bsNone;
HelpForm.SetBounds(0, 0, 1, 1);
HelpForm.FormStyle := fsStayOnTop;
HelpForm.Show;
mouse_event(MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
mouse_event(MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
SetForegroundWindow(hWnd);
finally
HelpForm.Free;
end;
Result := True;
end;

end.




你的太复杂了
而且我是ShowModal, 不是show,光加fsStayOnTop;好像没用
  • 打赏
  • 举报
回复
不先AttachThreadInput在win10上调用SetForegroundWindow会失败
zuilu5339 2018-06-27
  • 打赏
  • 举报
回复
引用 1 楼 BlueStorm 的回复:

//这样不是更好吗:
with TFrm_editBom.Create(nil) do
begin
ShowModal;
Free;
end;


好是好,但好像没解决问题,只是代码省略了
BlueStorm 2018-06-27
  • 打赏
  • 举报
回复

//这样不是更好吗:
with TFrm_editBom.Create(nil) do
begin
ShowModal;
Free;
end;

16,748

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧