2024年4月2日发(作者:)

踏雪无痕

Delphi 窗口置顶的方法

分类: Delphi 2011-08-02 14:27 441人阅读 评论(0) 收藏 举报

有几种窗口置顶的方法,简单的有:

ShowWindow(窗口句柄,sw_ShowNormal);

SetWindowPos(窗口句柄,HWND_NOTOPMOST,0,0,0,0,SWP_NOMOV OR SWP_NOSIZE OR SWP_SHOWWINDOW);

另一种方式是:

function ForceForegroundWindow(hwnd: THandle): boolean;

const

SPI_GETFOREGROUNDLOCKTIMEOUT = $2000;

SPI_SETFOREGROUNDLOCKTIMEOUT = $2001;

var

ForegroundThreadID: DWORD;

ThisThreadID : DWORD;

timeout : DWORD;

begin

if IsIconic(hwnd) then ShowWindow(hwnd, SW_RESTORE);

// Windows 98/2000 doesn't want to foreground a window when some other

// window has keyboard focus

if ((Win32Platform = VER_PLATFORM_WIN32_NT) and (Win32MajorVersion > 4))

or

((Win32Platform = VER_PLATFORM_WIN32_WINDOWS) and

((Win32MajorVersion > 4) or ((Win32MajorVersion = 4) and

(Win32MinorVersion > 0)))) then begin

// Code from Karl E. Peterson, /vb/

// Converted to Delphi by Ray Lischner

// Published in The Delphi Magazine 55, page 16

Result := false;

ForegroundThreadID := GetWindowThreadProcessID(GetForegroundWindow,nil);

ThisThreadID := GetWindowThreadPRocessId(hwnd,nil);

if AttachThreadInput(ThisThreadID, ForegroundThreadID, true) then begin

BringWindowToTop(hwnd); // IE 5.5 related hack

SetForegroundWindow(hwnd);

AttachThreadInput(ThisThreadID, ForegroundThreadID, false);

Result := (GetForegroundWindow = hwnd);

end;

if not Result then begin

// Code by Daniel P. Stasinski

SystemParametersInfo(SPI_GETFOREGROUNDLOCKTIMEOUT, 0, @timeout, 0);

SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT, 0, TObject(0), SPIF_SENDCHANGE);

BringWindowToTop(hwnd); // IE 5.5 related hack

SetForegroundWindow(hWnd);

SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT, 0, TObject(timeout), SPIF_SENDCHANGE);

end;

end

else begin

BringWindowToTop(hwnd); // IE 5.5 related hack

SetForegroundWindow(hwnd);

end;

Result := (GetForegroundWindow = hwnd);

end;

1

另外,主窗体有个置顶的属性FormStyle, 设置为fsStayOnTop就可以直接置顶了。

2