两个窗口配合,如何让一个窗体只在本程序内是置顶的?
时间: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就都到后面去?
我想在主窗口上浮动一个窗口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;
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
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28