先看效果
完全在图标下面,占用资源也比较少。
介绍下原理
愿意自己动手试试更好,毕竟有人愿意分享出来#_#
首先我必须承认,原理上大部分是照搬的别人的,我用VB.NET实现了同样功能。这里我把来龙去脉理一理。
一次逛知乎,看到了这篇文章
https://zhuanlan.zhihu.com/p/37877070
看到后就觉得这个应该没有什么大问题,就差自己动手了,毕竟别人都实现了。
后面继续了解,找到了这个原理的出处
https://www.codeproject.com/Articles/856020/Draw-Behind-Desktop-Icons-in-Windows-plus
这个应该是目前公认的最早公开提出来实现原理的文章出处,感谢别人的无偿分享,自己也分享一下。
这个原理后续有很多人继续细解,我也不再赘述了,再推荐一个我觉得很详细的文章
https://jrhar.blog.csdn.net/article/details/79893134
我也在文下留言,再次感谢博主的详细讲解。个人水平不足,用了一些野路子做到了,大家自己可以做些改进一下,尽可能分享出来,为VB加把力。
Private Declare Function timeGetTime Lib "winmm.dll" () As Long '延时
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As IntPtr, ByVal wMsg As Integer, ByVal wParam As Integer, lParam As String) As Long
Private Declare Function SetParent Lib "user32" (ByVal hWndChild As IntPtr, ByVal hWndNewParent As IntPtr) As IntPtr
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As IntPtr
Public Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hwnd1 As IntPtr, ByVal hWnd2 As IntPtr, ByVal lpsz1 As String, ByVal lpsz2 As String) As IntPtr
Public Declare Function GetNextWindow Lib "user32" Alias "GetWindow" (ByVal hwnd As IntPtr, ByVal wFlag As Integer) As IntPtr
Private Declare Function GetClassName Lib "user32" Alias "GetClassNameA" (ByVal hwnd As IntPtr, ByVal lpClassName As String, ByVal nMaxCount As IntPtr) As Long
这是本软件引用的所有API
每个的功能我也讲不好,大家自行搜索,我重点说下要注意的地方,VB6.0句柄好像是long类型,在.NET下要改为IntPtr类型
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
ys(2000) '担心电脑相应不过来,延迟启动
Dim WorkerWhwnd1 As IntPtr, WorkerWhwnd2 As IntPtr, Prgmhwnd As IntPtr, cname As New String(ChrW(0), 255) '这里不理解
Prgmhwnd = FindWindow(vbNullString, "Program Manager")
SendMessage(Prgmhwnd, 1324, 0, 0)
ys(1500)
WorkerWhwnd1 = GetNextWindow(Prgmhwnd, 3) '3向上查一个窗口,2向下查一个窗口
WorkerWhwnd2 = GetNextWindow(WorkerWhwnd1, 3)
GetClassName(WorkerWhwnd2, cname, 255)
cname = Microsoft.VisualBasic.Left(cname, 7)
SetParent(Me.Handle, Prgmhwnd)
If cname = "WorkerW" Then SendMessage(WorkerWhwnd1, 16, 0, Nothing) '关闭指定窗口
End Sub
以上就可以将窗口程序放在桌面图标一下了。
如果置入浏览器就可以播放网页了,也很炫酷,但是内置的Webbrowser不好用,用第三方的消耗资源很严重,于是
我采用了Axwindowsmediaplayer,循环播放视频。
需要解决的问题依次有
- 播放器隐藏控件
- 循环播放闪烁一下
这些操作留给大家自己发挥吧。 不想自己动手的小伙伴直接下载源码吧,里面备注很详细。
源码下载地址
https://download.csdn.net/download/Pwwwqq/82194528