+ -
当前位置:首页 → 问答吧 → 两个窗口配合,如何让一个窗体只在本程序内是置顶的?

两个窗口配合,如何让一个窗体只在本程序内是置顶的?

时间:2011-12-06

来源:互联网

主窗口:Form_Main
我想在主窗口上浮动一个窗口Form_Mask

在Create事件里创建Form_Mask如下:

  Form_Mask:=TForm_Mask.Create(Form_Main);
  setwindowpos(Form_Mask.handle,Hwnd_Topmost,0,0,0,0,SWP_NOACTIVATE or SWP_NOMOVE or SWP_NOSIZE);//窗口置顶
  Form_Mask.Show;

但是当我点其它程序的窗口(比如我的电脑)时,Form_Mask还是在上面,结果我的电脑夹在了两个窗口中间!

如何才能使Form_Mask一直在Form_Main之上,但我点其它程序时,Form_Main和Form_Mask就都到后面去?

作者: gaolin16   发布时间: 2011-12-06

哎~~~暂时解决了。

procedure WMActivate(var Msg: TMessage); message WM_ACTIVATE;

procedure TForm_Main.WMActivate(var Msg: TMessage);
begin
  inherited;
  //如果当前线程是激活的
  if IsCurrentProcess then
  begin
  setwindowpos(Form_Mask.handle,Hwnd_Topmost,0,0,0,0,SWP_NOACTIVATE or SWP_NOMOVE or SWP_NOSIZE);
  end
  else
  begin
  //要用两次,先移到后面再放到前面,不然会出现我说的直接把其它窗口拖过来会夹在中间:(
  setwindowpos(Form_Mask.handle,Hwnd_Bottom,0,0,0,0,SWP_NOACTIVATE or SWP_NOMOVE or SWP_NOSIZE);
  setwindowpos(Form_Mask.handle,Hwnd_NoTopmost,0,0,0,0,SWP_NOMOVE or SWP_NOSIZE);
  end;
end;

//下面是判断当前是线程是否是活动的
function TForm_Main.IsCurrentProcess: Boolean;
var
  Fore_hWnd:HWND;
  dwProcessID:integer;
  tutuProcessID:integer;
begin
  //获取当前窗口
  Fore_hWnd := GetForegroundWindow();
  //获取当前窗口的进程ID
  GetWindowThreadProcessId(Fore_hWnd,@dwProcessID);
  GetWindowThreadProcessId(Application.Handle,@tutuProcessID);

  if dwProcessID=tutuProcessID then
  result:=true
  else
  result:=false;
end;

作者: gaolin16   发布时间: 2011-12-06

热门下载

更多