如何让窗体始终在桌面显示

imho888 2009-04-15 03:38:52

让窗体保持在桌面,其它程序可以在窗体的上面

就是在按"显示桌面"的时候不最小化,还是保持在桌面

以下两种方法我都试过,没达到我想要的功能:

1.SetWindowPos(Form1.handle,HWND_TOPMOST,Form1.left,Form1.top,Form1.width,Form1.height,SWP_SHOWWINDOW);

这样是可以不被最小化,但是却终始在其它窗体的前面挡着


2.

hProgMan:=FindWindowEx(0, 0, 'Progman', 'Program Manager');
SetParent(Form1.handle,hProgMan);

这样可以不被最小化,但是在始终在桌面,不能到其它程序的前面来

不知道有没有其它的方法.非常感谢

...全文
473 32 打赏 收藏 转发到动态 举报
写回复
用AI写文章
32 条回复
切换为时间正序
请发表友善的回复…
发表回复
无条件为你 2009-04-26
  • 打赏
  • 举报
回复
楼主的朋友,楼主的方法肯定是要用AttachThreadInput这个函数。而且我在22楼也说了,方法绝对有,而且不止一种,绝对让其它程序跳不到前面来,本程序一直处于当前活动窗口。

楼主未加分,而且关键是我这几天没有再关注这个贴子。
grass1928 2009-04-22
  • 打赏
  • 举报
回复
[Quote=引用 30 楼 imho888 的回复:]
找到解决办法了,散分
[/Quote]
兄台,为什么你一找到办法就收工啦,能不能把你的成果分享一下,看看到底是什么样的东东啊.呵呵.
goldqq 2009-04-17
  • 打赏
  • 举报
回复
[Quote=引用 26 楼 ahjoe 的回复:]
他就是在普通窗体的情况下,加个不想要最小化。
[/Quote]
不是不要最小化,而是让“显示桌面”对它不起作用。
ahjoe 2009-04-17
  • 打赏
  • 举报
回复
他就是在普通窗体的情况下,加个不想要最小化。
imho888 2009-04-17
  • 打赏
  • 举报
回复
找到解决办法了,散分
imho888 2009-04-17
  • 打赏
  • 举报
回复
[Quote=引用 25 楼 xjjrocker 的回复:]
唉,感觉你思维定势了。
我提供的方法只是嵌入桌面,你想坐前面的时候你执行置前的操作呀!
Form1.ParentWindow:= 0;
Form1.Show;
SetWindowPos(Form1.handle, HWND_TOPMOST, Form1.Left, Form1.Top, Form1.Width, Form1.Height,0);

桌面秀的置前和嵌入本来就是两个不能同时满足的条件,我就是模仿写出来的模拟程序。
呵呵
其他的自己想办法吧。
[/Quote]


想做前面是可以这样,但是坐完前面后,他又按"显示桌面"怎么办? 这样写程序好像不太好吧
yhwww 2009-04-17
  • 打赏
  • 举报
回复
很简单啊,只要在“显示桌面”时执行Form1.Show就可以了啊。就是在form被最小化后又还原回来不就行了。
imho888 2009-04-16
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 genispan 的回复:]
我记得有种电子日历的小工具好像有楼主所说的功能 但我不晓得实现方法 哈哈
[/Quote]

大家一起研究一下啊,应该可以实现吧
imho888 2009-04-16
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 DelphiJavaDominoVB 的回复:]
//uses shellapi;
setwindowpos(form1.Handle,HWND_TOPMOST,0,0,0,0,SWP_NOMOVE+SWP_NOSIZE);
[/Quote]

你这样会永远档在其它窗口上面的
genispan 2009-04-16
  • 打赏
  • 举报
回复
我记得有种电子日历的小工具好像有楼主所说的功能 但我不晓得实现方法 哈哈
DelphiJavaDominoVB 2009-04-16
  • 打赏
  • 举报
回复
//uses shellapi;
setwindowpos(form1.Handle,HWND_TOPMOST,0,0,0,0,SWP_NOMOVE+SWP_NOSIZE);
imho888 2009-04-16
  • 打赏
  • 举报
回复
难道真的没有人知道吗?分不够可以加,在线等待
imho888 2009-04-16
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 xjjrocker 的回复:]
你的意思是窗体嵌入桌面。类似桌面秀,唯一的不同就是他的窗体没有透明化处理,可是透明化了反而看不到窗体了。
[/Quote]

其实很简单,就是不要响应"显示桌面"的事件
xjjrocker 2009-04-16
  • 打赏
  • 举报
回复
唉,感觉你思维定势了。
我提供的方法只是嵌入桌面,你想坐前面的时候你执行置前的操作呀!
Form1.ParentWindow:= 0;
Form1.Show;
SetWindowPos(Form1.handle, HWND_TOPMOST, Form1.Left, Form1.Top, Form1.Width, Form1.Height,0);

桌面秀的置前和嵌入本来就是两个不能同时满足的条件,我就是模仿写出来的模拟程序。
呵呵
其他的自己想办法吧。
imho888 2009-04-16
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 xjjrocker 的回复:]
如果是始终在桌面,并且不响应显示桌面,其他窗体能够在此窗体的前面,那么就是窗体嵌入桌面的效果呀。
如果是这个效果,给段代码

Delphi(Pascal) code
//嵌入桌面
TmpHandle:= FindWindow(pchar('Progman'),nil);
if TmpHandle > 0 then
begin
Form1.ParentWindow:= TmpHandle;
Form1.Show;
end;



取消效果自然就是

Delphi(Pascal) code
Form1.ParentWindow:= 0;
Form1.S…
[/Quote]


你这个方法和我第二个效果一样的吧,这样程序只能在最低层了,想到上面就不行了




[Quote=引用 23 楼 owlet_leo 的回复:]
前面扑倒这么多前辈,那么,依小白我的理解,我揣测你是希望窗口不响应最小化事件吧?
if ThatIsTrue then
尝试拦截WM_SIZE,WM_SYSCOMMAND必要的话也拦截WM_SHOWWINDOW。{Maybe it 's OK。。。}
else
我也没辙了~~~
end;
[/Quote]

我也试着用Hook来拦截,但是还是不行的,不信你可以试试看

真不知道有些程序是怎么实现的



[Quote=引用 22 楼 mwy654321 的回复:]
方法肯定是有的,只是不知道楼主是否可以加点分。
窗体永远是最前端的,电脑锁定器就是这个原理,只不过他是一个全屏窗体,永远置前。
[/Quote]

加分是没问题的,可以再加400分都行
只是我要的效果并不是你说的"窗体永远是最前端"

owlet_leo 2009-04-16
  • 打赏
  • 举报
回复
前面扑倒这么多前辈,那么,依小白我的理解,我揣测你是希望窗口不响应最小化事件吧?
if ThatIsTrue then
尝试拦截WM_SIZE,WM_SYSCOMMAND必要的话也拦截WM_SHOWWINDOW。{Maybe it's OK。。。}
else
我也没辙了~~~
end;
无条件为你 2009-04-16
  • 打赏
  • 举报
回复
方法肯定是有的,只是不知道楼主是否可以加点分。
窗体永远是最前端的,电脑锁定器就是这个原理,只不过他是一个全屏窗体,永远置前。
xjjrocker 2009-04-16
  • 打赏
  • 举报
回复
你用我的代码实验吧,应该就是你想要的效果了。
xjjrocker 2009-04-16
  • 打赏
  • 举报
回复
如果是始终在桌面,并且不响应显示桌面,其他窗体能够在此窗体的前面,那么就是窗体嵌入桌面的效果呀。
如果是这个效果,给段代码

//嵌入桌面
TmpHandle:= FindWindow(pchar('Progman'),nil);
if TmpHandle > 0 then
begin
Form1.ParentWindow:= TmpHandle;
Form1.Show;
end;

取消效果自然就是

Form1.ParentWindow:= 0;
Form1.Show;

xjjrocker 2009-04-15
  • 打赏
  • 举报
回复
你的意思是窗体嵌入桌面。类似桌面秀,唯一的不同就是他的窗体没有透明化处理,可是透明化了反而看不到窗体了。
加载更多回复(12)

5,388

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧