借用OBS Studio自带从文件读取文本的功能,两行代码实现歌曲名称输出。当然是.NET框架咯。
有新版了:点此。当然这个也很好用,不想折腾的还是用这个吧。
基础的代码就这么两行:
'按照进程名称获取当前运行的进程 '网易云是cloudmusic Dim cloudmusic_proc As Process() = Process.GetProcessesByName("cloudmusic") '网易云会把当前播放的音乐放到主窗口标题里 '获取窗口标题 Dim current_music As String = cloudmusic_proc(0).MainWindowTitle '所以如果这样写的话上面两行就可以缩短成一行 Dim current_music As String = Process.GetProcessesByName("cloudmusic")(0).MainWindowTitle '把窗口标题写到C:\text.txt System.IO.File.WriteAllText("C:\text.txt", current_music)
理论上把这些代码直接扔到一个Timer控件里就可以搞定了。
当然如果每隔那么几十毫秒就写一下txt未免太丧病,所以可以做一些简单的判断:
'设置一个全局变量存储上一次获取的值 Dim last_music As String last_music = current_music '在Timer的Tick事件里判断 '如果歌名变化了再写txt If (current_music <> last_music) Then last_music = current_music System.IO.File.WriteAllText("C:\text.txt", current_music) End If
针对网易云的话还有个问题,就是网易云客户端在你把鼠标挪到播放按钮上面的时候标题会消失,不知道为什么是这么设定的,所以还得多判断一下,如果突然变成空字符串就不改:
'字符串长度大于零才进行修改 If (current_music <> last_music And current_music.Length > 0) Then last_music = current_music System.IO.File.WriteAllText("C:\text.txt", current_music) End If
但是如果你是退了网易云导致获取不到歌名呢?这时候因为进程不见了所以压根就会直接报错,所以无所谓直接在获取歌名之前try…catch:
Try current_music = Process.GetProcessesByName("cloudmusic")(0).MainWindowTitle Catch ex As Exception '停掉Timer,通知用户获取不到网易云进程 End Try
但是实际上网易云启动起来之后有好几个进程,只有一个进程带歌曲名,所以还得判断一下是哪个:
For Each proc As Process In Process.GetProcessesByName("cloudmusic") If (proc.MainWindowTitle.Length > 0) Then current_music = proc.MainWindowTitle Exit For End If Next
接下来就是做个界面把这堆东西组合到一起的事儿。
总之……反正……能写到txt之后,在OBS里新建一个文本,勾上“从文件读取”,选择C:\text.txt,就可以实现歌名同步了。
由于是个程序员看到文章标题之后都知道该怎么写了,我就不放exe了,你们自己写吧。
然而我不是程序员啊
偶然看到,觉得很好用,比那些插件方便多了。有的时候,歌名太长,能不能把歌名和歌手分成两个文件,并且删除其他诸如电视剧名称这类注释的文字。这类信息大多数是在书名号或者括号间。
可以分成两个文件,不过我觉得大概加个文本框提供正则匹配更好点?
不错的干货,但是为什么我现在使用不论是化用作者给的参考代码自己重写或是下载作者的exe都只能读到”桌面歌词”这个结果?
对哦……我忘了桌面歌词这事儿了……
因为那也是个带Title的窗口,解决方法要么关掉桌面歌词,要么判断窗口标题里有没有“-”……
谢谢制作,能加入滚动和最小化到任务栏右边就完美啦。
康康介个https://github.com/dlrudie/Snip
snip 7.0 作者取消了对除了spotify 和 itunes以外软件的所有支持 没时间维护
屌(我不是周董