把网易云当前播放歌曲名字输出到OBS

借用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了,你们自己写吧。

#更新:

下载地址,需.net 4.61

分享到: