| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2944 人关注过本帖
标题:怎么把这个窗口设置为桌面之上,所有程序之下?
只看楼主 加入收藏
不懂才问
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:大草原
等 级:贵宾
威 望:29
帖 子:1503
专家分:6593
注 册:2010-7-5
结帖率:91.53%
收藏
已结贴  问题点数:20 回复次数:11 
怎么把这个窗口设置为桌面之上,所有程序之下?
我要写个常驻桌面的工具栏程序,想让这个窗口程序在桌面之上,所有其他程序之下,也就是除了桌面,它不能盖住任何程序。不要像下图这样,跑到其他程序上面了。要怎么做呢?

放个时钟,总是执行主动失去焦点?有这样的事件吗?请各位大佬指点。谢谢

API太不熟了,要是必须用API,请讲的详细点,谢谢!

图片附件: 游客没有浏览图片的权限,请 登录注册
搜索更多相关主题的帖子: API 桌面 事件 其他 窗口 
2020-11-18 08:23
不懂才问
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:大草原
等 级:贵宾
威 望:29
帖 子:1503
专家分:6593
注 册:2010-7-5
收藏
得分:0 
昨天百度到一种方法,说是加载此窗口时,将其父窗口设置为桌面,可是在程序里,要怎么描述桌面呢?

报告老师,我低头不是因为我在装低调,是你问的问题,我真的不会答,,,
2020-11-18 08:24
lin5161678
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:45
帖 子:1136
专家分:3729
注 册:2011-12-3
收藏
得分:10 
GetDesktopWindow
获取桌面句柄

https://zh.
2020-11-18 09:19
吹水佬
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:451
帖 子:10607
专家分:43186
注 册:2014-5-20
收藏
得分:10 
Windows平台:
1、放到Z序列底部
   SetWindowPos(hWnd, HWND_BOTTOM, ......),但当点击窗口时会回到Z序列顶部
2、嵌入到桌面,先获取真实的桌面窗口句柄 hDesktop (可能有几层,要找对)
   SetParent(hWnd, hDesktop);
2020-11-18 12:04
不懂才问
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:大草原
等 级:贵宾
威 望:29
帖 子:1503
专家分:6593
注 册:2010-7-5
收藏
得分:0 
回复 4楼 吹水佬
Private Declare Function GetDesktopWindow Lib "user32" () As Long
Private Declare Function SetParent Lib "user32" (ByVal hWndChild As Long, ByVal hWndNewParent As Long) As Long


Private Sub Form_Load()
    Dim Q
    Q = SetParent(Me.hWnd, GetDesktopWindow())
End Sub


还是不能锁定到桌面上,是不是你说的“要找对”那个,我没找到正确的

报告老师,我低头不是因为我在装低调,是你问的问题,我真的不会答,,,
2021-05-05 17:33
不懂才问
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:大草原
等 级:贵宾
威 望:29
帖 子:1503
专家分:6593
注 册:2010-7-5
收藏
得分:0 
回复 4楼 吹水佬
Private Declare Function GetDesktopWindow Lib "user32" () As Long
Private Declare Function SetWindowPos Lib "user32" (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal x As Long, ByVal y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long

Private Sub Form_Load()
Dim Q
Q = SetWindowPos(GetDesktopWindow(), 1, 0, 0, 0, 0, 6)
End Sub


两个都试了,没看到我要的效果,还是要继续请教您啊!

报告老师,我低头不是因为我在装低调,是你问的问题,我真的不会答,,,
2021-05-05 18:15
不懂才问
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:大草原
等 级:贵宾
威 望:29
帖 子:1503
专家分:6593
注 册:2010-7-5
收藏
得分:0 
Private Declare Function GetWindow Lib "user32.dll" (ByVal a As Long, ByVal b As Long) As Long
Private Declare Function SetParent Lib "user32.dll" (ByVal a As Long, ByVal b As Long) As Long
Private Declare Function FindWindowA Lib "user32.dll" (ByVal a As String, ByVal b As Long) As Long
Private Declare Function SetLayeredWindowAttributes Lib "user32.dll" (ByVal hwnd As Long, ByVal tm As Long, ByVal c As Long, ByVal d As Long) As Long
Private Declare Function SetWindowLongA Lib "user32.dll" (ByVal hwnd As Long, ByVal item As Long, ByVal z As Long) As Long
Private Declare Function GetWindowLongA Lib "user32.dll" (ByVal hwnd As Long, ByVal sx As Long) As Long




Private Sub Form_Load()
  Label1.Caption = "本程序是121038做的,潜入桌面程序,做人就要有个目标,比如我的目标就是要为您服务,支持的就顶"
  Move 0, 0
  Dim bl As Long
  bl = GetWindowLongA(hwnd, -20)
  bl = bl Or 32 Or 800000
  SetWindowLongA hwnd, -20, bl
  SetLayeredWindowAttributes hwnd, 0, 120, 2
  bl = FindWindowA("ProgMan", 0)
  bl = GetWindow(bl, 5)
  SetParent hwnd, bl
End Sub


Private Sub Timer1_Timer()
  Label1.Move Label1.Left - 100
  If Label1.Left < -Label1.Width Then
     Label1.Left = Width
  End If
End Sub
https://bbs.bccn.net/viewthread.php?tid=123570&highlight=%D7%C0%C3%E6
找到了一个,学习一下,再回来

报告老师,我低头不是因为我在装低调,是你问的问题,我真的不会答,,,
2021-05-05 19:15
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9025
专家分:54030
注 册:2011-1-18
收藏
得分:0 
回复 7楼 不懂才问
总之:
 不是 GetDesktopWindow(),
 而是 GetDesktopWindow() 下面的一个子窗体(类名“Progman”,标题“Program Manager”)的子窗体(类名“SHELLDLL_DefView”,标题“”)
2021-05-06 09:18
不懂才问
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:大草原
等 级:贵宾
威 望:29
帖 子:1503
专家分:6593
注 册:2010-7-5
收藏
得分:0 
回复 8楼 rjsp
感谢您的全面解释。懂了不少。又研究了一天,又找了一些这方面的例子,“bl = bl Or 32 Or 800000”,这一句,比较重要。
一个例子中的位或结果是524288。整个窗口没边框,还可以操作上面的按钮,窗口即使设置了父窗口为桌面的progman,也不会在最底层,会在其它窗口之上。
但如果是800032,就不能操作上面的按钮,并且有一条比较白的边框,不会遮挡其它窗口。

所以,这个位或的值的取值范围,我很感兴趣。
有没有鱼和熊掌可以兼得的?
又可以操作上面的按钮,又保持不遮挡其它窗口。

还要麻烦您再给点提示。比如做个循环,在哪些取值范围内,都刷新几秒,标签上给个提示,让我每种取值都操作试试。

不过,不太可能是从0到几十万吧?是和2的几次方有关吗?

麻烦了,谢谢!

[此贴子已经被作者于2021-5-6 18:03编辑过]


报告老师,我低头不是因为我在装低调,是你问的问题,我真的不会答,,,
2021-05-06 18:00
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9025
专家分:54030
注 册:2011-1-18
收藏
得分:0 
VB看着难受,你是想问 SetWindowLongA( hwnd, GWL_EXSTYLE, 这里可以填哪些属性吗?
见 https://docs.
2021-05-06 21:15
快速回复:怎么把这个窗口设置为桌面之上,所有程序之下?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.016350 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved