首页 > 其他分享 >[AHK2] 借助vlc设置桌面动态背景

[AHK2] 借助vlc设置桌面动态背景

时间:2024-06-20 19:44:07浏览次数:23  
标签:exe 桌面 AHK2 ahk vlc uint vlcId ptr

概述

网上可以找到许多设置桌面动态背景的c++代码,我们将它用ahk实现即可。
我已经使用了很长一段时间,体验十分不错,所以推荐给大家。

完整脚本请看最后一节。

  1. 发送消息
SendMsgToProgman() {
  DllCall('SendMessageTimeout',
    'ptr', WinGetID('ahk_class Progman'),
    'uint', 0x052c, 'uint', 0, 'uint', 0,
    'uint', 0x0000, 'uint', 0x3e8, 'ptr*', &out := 0
  )
}
  1. 隐藏WorkerW窗口
DetectHiddenWindows true
workerWId := WinGetList('ahk_class WorkerW').at(-1)
WinHide('ahk_id' workerWId)
  1. 设置vlc为progman子窗口
WinWaitActive('ahk_exe' 'vlc.exe', , 5)
if !WinExist('ahk_exe' 'vlc.exe')
  throw Error('无法启动vlc')
vlcId := WinGetID('ahk_exe' 'vlc.exe'), progmanId := WinGetID('ahk_class Progman')
beforeParent := DllCall('SetParent', 'ptr', vlcId, 'ptr', progmanId)

只需此三步即可完成设置。

在细节方面:

  • 首先使用cmd运行vlc,同时传递必要的运行参数和视频列表;参数是固定的,视频路径我选择命令行传递给ahk脚本(我会使用工具调用此脚本,并传递参数)
options := ['--video-wallpaper', '--no-video-title-show', '--no-loop', '-R'], videoList := []
if IsEmpty(A_Args)
  ExitApp()
for v in A_Args
  videoList.Push(v)
RunWait(JoinStr(A_Space, A_ComSpec, '/c start F:\VLC\vlc.exe', options.join(A_Space), videoList.join(A_Space)), , 'min')
  • 然后,发送消息;并隐藏WorkerW窗口
SendMsgToProgman()

脚本

除了以上基础功能,我们还加上了托盘选项,【隐藏,编辑,重置,退出】;以及退出时恢复状态。

#Requires AutoHotkey v2.0
#SingleInstance Ignore

#Include G:\AHK\git-ahk-lib\Extend.ahk
#Include G:\AHK\git-ahk-lib\Tip.ahk

; 2024/04/03
/**
 * 使用 VLC 作为播放器,通过传递命令行参数控制vlc显示及播放列表
 */
Persistent

options := ['--video-wallpaper', '--no-video-title-show', '--no-loop', '-R'], videoList := []
if IsEmpty(A_Args)
  ExitApp()
for v in A_Args
  videoList.Push(v)
_log .= '-参数: `n>' videoList.join('`n>'), Tip.ShowTip(_log)

RunWait(JoinStr(A_Space, A_ComSpec, '/c start F:\VLC\vlc.exe', options.join(A_Space), videoList.join(A_Space)), , 'min')
SendMsgToProgman()

_log .= '`n-等待vlc窗口(5s)', Tip.ShowTip(_log)
WinWaitActive('ahk_exe' 'vlc.exe', , 5)
if !WinExist('ahk_exe' 'vlc.exe')
  throw Error('无法启动vlc')
vlcId := WinGetID('ahk_exe' 'vlc.exe'), progmanId := WinGetID('ahk_class Progman')
beforeParent := DllCall('SetParent', 'ptr', vlcId, 'ptr', progmanId)

DetectHiddenWindows true
workerWId := WinGetList('ahk_class WorkerW').at(-1)
WinHide('ahk_id' workerWId)

_log .= '`n-完成', Tip.ShowTip(_log)

switchItems := ['隐藏', '显示']
m := A_TrayMenu
  , m.Delete()
  , m.Add(switchItems[1], Toggle)
  , m.Add('重置', (*) => (DllCall('SetParent', 'ptr', vlcId, 'ptr', WinGetID('ahk_class Progman')), WinHide('ahk_id' workerWId)))
  , m.Add()
  , m.Add('编辑', (*) => Edit())
  , m.Add('退出', (*) => ExitApp())

Toggle(*) {
  static flag := false
  if !WinExist('ahk_id' vlcId)
    return Tip.ShowTip('vlc已被关闭')
  if flag := !flag
    m.Rename(switchItems[1], switchItems[2]), WinHide('ahk_id' vlcId), Tip.ShowTip(switchItems[1])
  else m.Rename(switchItems[2], switchItems[1]), WinShow('ahk_id' vlcId), Tip.ShowTip(switchItems[2])
}

OnExit((*) => (WinClose('ahk_id' vlcId), WinShow('ahk_id' workerWId)))

PullVCL(*) {
  global vlcId, beforeParent
  if !WinExist('ahk_id' vlcId)
    return Tip.ShowTip('vlc已被关闭')
  DllCall('SetParent', 'ptr', vlcId, 'ptr', beforeParent), WinMinimize('ahk_id' vlcId)
}

SendMsgToProgman() {
  DllCall('SendMessageTimeout',
    'ptr', WinGetID('ahk_class Progman'),
    'uint', 0x052c, 'uint', 0, 'uint', 0,
    'uint', 0x0000, 'uint', 0x3e8, 'ptr*', &out := 0
  )
}

; TransparentTaskBar(accent_state) {  ; 建议使用TB工具,而不是此函数
;   ;0:表示禁用玻璃效果和透明度,窗口不会有透明效果。
;   ;1:表示启用玻璃效果,通常以一种轻度透明的方式呈现窗口。
;   ;2:表示启用玻璃效果,通常以更明显的透明方式呈现窗口。
;   ;3:表示启用玻璃效果,通常以更明显的透明方式呈现窗口,并带有模糊效果。
;   WCA_ACCENT_POLICY := 19, pad := A_PtrSize = 8 ? 4 : 0, gradient_color := "0x01000000"
;   ACCENT_POLICY := Buffer(16, 0), WINCOMPATTRDATA := Buffer(4 + pad + A_PtrSize + 4 + pad, 0)
;   hTrayWnd := DllCall("User32\FindWindow", "str", "Shell_TrayWnd", "ptr", 0, "ptr")
;   NumPut("int", (accent_state > 0 && accent_state < 4) ? accent_state : 0, ACCENT_POLICY, 0)
;     , NumPut("int", gradient_color, ACCENT_POLICY, 8)
;     , NumPut("int", WCA_ACCENT_POLICY, WINCOMPATTRDATA, 0)
;     , NumPut("int*", ACCENT_POLICY.ptr, WINCOMPATTRDATA, 4 + pad)
;     , NumPut("uint", ACCENT_POLICY.size, WINCOMPATTRDATA, 4 + pad + A_PtrSize)
;   DllCall("user32\SetWindowCompositionAttribute", "ptr", hTrayWnd, "ptr", WINCOMPATTRDATA)
; }

标签:exe,桌面,AHK2,ahk,vlc,uint,vlcId,ptr
From: https://www.cnblogs.com/refiz/p/18259370

相关文章

  • 远程桌面提示"你的凭据不工作"解决方案
    这几天遇到用户名密码正确,但是使用远程桌面提示“你的凭据不工作”的问题,尝试了下面连接提到的方法,均未解决。https://www.cnblogs.com/wmxblog/p/17540648.html经过查找资料,发现是CredSSP的问题,有两个方案来解决这个问题。编辑远程桌面文件打开远程桌面,设置好信息以后,将其另......
  • EyeLink 1000 plus(桌面式)眼动仪使用指导
    一、简介眼动追踪是测量眼睛运行的过程。眼动追踪研究的最关注的事件是确定人类或者动物看的地方(比如:“注视点”或“凝视点”)。更准确来说是通过仪器设备进行图像处理技术,定位瞳孔位置,获取坐标,并通过一定的算法,计算眼睛注视或者凝视的点,让计算机知道你正在看哪里,何时看的,为什么看......
  • 电脑桌面文件夹删除不了怎么办?6种方法快速解决,建议收藏!
    桌面文件夹删不掉怎么办?有时会遇到桌面上的文件夹无法删除的问题,这是由于文件夹被系统进程或某些应用占用,或者是由于权限设置等原因造成的。以下是解决桌面文件夹无法删除问题的方法,帮助你有效地清理桌面环境。桌面文件夹删不掉,1、使用安全模式重启电脑;2、检查并修改权限设......
  • CentOS 7 配置 VNC 远程桌面连接
    文章目录前言1.图形化桌面配置VNC远程连接1.1.安装VNC服务1.2.临时启用VNC远程连接1.2.1.单终端启用VNC远程连接1.2.2.多终端启用VNC远程连接1.3.开机自启动VNC服务实现远程连接1.3.1.设置以root用户身份远程连接1.3.2.设置以普通用户身份远程连接2.最小化......
  • 部署监控公司电脑桌面并截图保存至阿里云OSS(定时功能)
    importsocketimportuuidimportscheduleimportdatetimeimportpyautoguiimportloggingimportoss2importctypesimportosimporttimeimportshutil#阿里云OSS配置信息access_key_id='your_id'access_key_secret='your_secret'bucket_na......
  • 项目运维时,某用户通过RDP远程桌面连接服务器...任务管理器显示用户状态断开连接!记录运
    目录问题出现解决方式测试参考  今天处理项目运维问题,发现服务器任务管理器出现用户状态断开连接......问题出现项目运维时,某用户通过rdp远程桌面连接Windowsserver服务器时,出现服务器发布的进度计划无法执行,打开服务器任务管理界面出现用户状态断开连接标志,如下......
  • 帮帮派桌面开发
    为了实现对数据库的内容的可视化操作,满足对数据的实时化管理,故此做一个c++的可视化帮帮派管理工具来帮助用户更好的管理,并增进体验感,特此设计此桌面应用软件。一、工具的准备visualstudio2022社区版数据库mysql5.7qtdesignerPySide2-5.11.2-5.11.2-cp35.cp36.cp37-none-wi......
  • 处理问题:windows server 2016由于没有远程桌面授权服务器可以提供许可证,远程会话被中
      windowsserver可以多用户同时登陆,默认最大远程登录数量为2,如果有更多人需要同时远程登录,则需要安装远程桌面授权服务,第一次安装后,免费期为120天,超过则无法正常远程登录。解决办法如下:Windowsserver2016服务器远程桌面登录时出现错误提示:“由于没有远程桌面授权服务器......
  • debian使用桌面管理器管理多个桌面系统
    环境:debian12.x前言:我安装了debian12版本的操作系统在虚拟机中,在安装的时候选择的是KDE桌面,便于以后日常使用linux操作系统在安装KDE桌面后,会自动安装一个sddm,sddm是一个显示管理器,以后安装了其他桌面操作系统可以通过这个工具来切换桌面系统。安装xfce桌面:sudoaptinsta......
  • C#开发的NoteNet桌面小贴士 - 开源研究系列文章 - 个人小作品
          十多年前编写过这个NoteNet小应用,不过当时用的是文本的保存方式,而且功能上也相对较多。这次重新编写这个小应用,用上新的技术和功能。现在先把源码发布出来,在另个系列的博文中(C#基于.netframework的应用开发实战编程(一)-编程手把手系列文章)将以此小应用为例子进行......