解决方案 »
- delphi fastreport中bit类型字段的显示问题
- Listview很奇怪的问题!!!!在线给分.........................
- MSCOMM 收到btye型数据后不会显示
- 关于shfileoperation的怪问题,不知道是不是delphi包装api的bug!
- 请问怎么判断软件在当前计算机的第一次运行?
- 如何在DBEXPRESS下设置数据库查询超时值?
- 在哪里能找到BDE的的下载包,急
- Sailor![Send To Delphier]
- 如何动态生成多个独立响应事件的控件?
- 怎样从TDateTime的一个变量中提取年、月、日
- 删除.exe程序
- 求Rad Studio XE6的fastreport报表控件安装
form1.FormStyle:=fsStayOnTop实现的不是很好
在你的程序之后再至顶显示的话肯定是要在你的程序上面。
SetWindowPos(handle,HWND_TOPMOST,Left,Top,Width,Height,SWP_SHOWWINDOW)
form1.FormStyle:=fsStayOnTop
如果管理器最大化,并且当前焦点在管理器的时候,这时候要求你的窗体还在任务管理器之上(只有disactive 状态)
这种应该应该是比较难做到的。
WindowList: Pointer;
ActiveWindow: HWnd;
begin
ActiveWindow := GetActiveWindow;
WindowList := DisableTaskWindows(ActiveWindow);
{*显示进程对话框*}
try
if dlgProgress = nil then
dlgProgress := TdlgProgress.Create(Application);
dlgProgress.FormStyle:=fsStayOnTop;
dlgProgress.Show; //CSH
dlgProgress.MessageText.Caption := msg_calculactioning;
dlgProgress.Update;
finally
EnableTaskWindows(WindowList);
if ActiveWindow <> 0 then SetActiveWindow(ActiveWindow);
end;
end;
1、桌面上只通用一个置顶(焦点)。
2、当窗体置顶后,随时被其它窗体迭代。
3、其它窗体置顶后,重新置顶,需要击发机制。
解决方案:
1、SetWindowPos(handle,HWND_TOPMOST,Left,Top,Width,Height,SWP_SHOWWINDOW) 消息置顶
2、form1.FormStyle:=fsStayOnTop 设置窗体置顶类型,打开才能置顶
3、在窗体中定时检查,不断发出消息置顶。
4、深层次不允许其它程序置顶。
加上一个事件应该差不多了onlostfocus
就是在窗口失去焦点的时候,把1.SetWindowPos函数运行一次
D7这一点和C#.Net的窗体比起来还是有点不足的,C#.Net的窗体事件比D7的要多,而且对焦点控制的也比较好。
SetWindowPos(self.Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE or SWP_NOSIZE);
XE的Form有一个styleform属性就可以搞定
不用Timer组件,用线程定时检查应该不会吧。
很容易实现的。unit frm_Main;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;type
TTopMostThread = class(TThread)
protected
FMainHandle: HWND;
procedure Execute; override;
public
constructor Create(AMainHandle: HWND);
end; TfrmMain = class(TForm)
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
{ Private declarations }
FSetTop: TTopMostThread;
public
{ Public declarations }
end;var
frmMain: TfrmMain;implementation{$R *.dfm}{ TTopMostThread }constructor TTopMostThread.Create(AMainHandle: HWND);
begin
FreeOnTerminate := True;
FMainHandle := AMainHandle;
inherited Create(False);
end;procedure TTopMostThread.Execute;
begin
while not Terminated do
begin
SetWindowPos(FMainHandle,HWND_TOPMOST,0,0,0,0,SWP_NOMOVE or SWP_NOSIZE);
Sleep(100); //可适当调整此值
end;
end;procedure TfrmMain.FormCreate(Sender: TObject);
begin
FSetTop := TTopMostThread.Create(Self.Handle);
end;procedure TfrmMain.FormDestroy(Sender: TObject);
begin
FSetTop.Terminate;
end;end.