application.CreateForm(TFrm_editBom,Frm_editBom);
Frm_editBom.ShowModal;
Frm_editBom.Free;
正常來說都是顯示在最前面,有時候我感覺是有點卡就顯示不在最前面,然后只能退出,重來
uj5u.com熱心網友回復:
//這樣不是更好嗎:
with TFrm_editBom.Create(nil) do
begin
ShowModal;
Free;
end;
uj5u.com熱心網友回復:
好是好,但好像沒解決問題,只是代碼省略了
uj5u.com熱心網友回復:
還有沒有辦法uj5u.com熱心網友回復:
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;
uj5u.com熱心網友回復:
或者:
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;
uj5u.com熱心網友回復:
示例
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.
uj5u.com熱心網友回復:
不先AttachThreadInput在win10上呼叫SetForegroundWindow會失敗uj5u.com熱心網友回復:
你的太復雜了
而且我是ShowModal, 不是show,光加fsStayOnTop;好像沒用
uj5u.com熱心網友回復:
我試過了,是可以的。最好用第一個function ForceForegroundWindow(hWnd: THandle): Boolean; 第二個ForceForegroundWindow不太完善。
代碼是加在被showModal出來的form里面,因此show和ShowModal都作業正常。
你覺得太復雜,那我就沒辦法了,我找不到其他可靠又更簡單的方法。
uj5u.com熱心網友回復:
用WINAPI: SetForegroundWindowuj5u.com熱心網友回復:
SetForegroundWindow只是請求windows系統把該form顯示最前面而已,windows讓不讓它顯示在最前面,那還得看情況。uj5u.com熱心網友回復:
試試formStyle屬性設定uj5u.com熱心網友回復:
DELPHI 自帶的SHOW或者是SHOWMODE都是不能夠在Windows下面確保在最前,想確定視窗一定在Windows下保持最前的,就只能用“BlueStorm"的方法吧轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/39566.html
標籤:語言基礎/算法/系統設計
