Powershell可以检测特定程序当前是否正在播放声音吗?

时间:2019-11-18 21:13:44

标签: powershell audio

我正在尝试找到一种方法来检测某个特定程序是否正在播放声音。长话短说,我工作场所中的所有计算机都有一个名为ReSoin.exe的程序,如果该程序运行正常,则应始终在播放声音。如果ReSoin处于活动状态但未播放声音,则需要关闭然后重新打开ReSoin。我想使这个过程自动化。

使用Persistent13 here描述的方法以及对Powershell的最基本的了解,我创建了一个循环来确定Windows计算机是否在播放声音。如果Resoin处于活动状态,并且计算机上没有声音播放,则循环将关闭并重新打开ReSoin。

import matplotlib
import matplotlib.style as mplstyle
matplotlib.use('TkAgg')
import pandas as pd
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2Tk
from matplotlib.figure import Figure
import matplotlib.pyplot as plt
import os, sys, time
import tkinter as tk
from tkinter import messagebox as msg
from tkinter import ttk, filedialog


mplstyle.use('fast')

class Graphs(tk.Tk):
    def __init__(self, *args, **kwargs):
        tk.Tk.__init__(self, *args, **kwargs)
        container = tk.Frame(self)
        container.pack(side='top', fill='both', expand=1)

        container.grid_rowconfigure(0, weight=1)
        container.grid_columnconfigure(0, weight=1)

        self.protocol('WM_DELETE_WINDOW', self._destroyWindow)

        self.frames = {}

        frame = StartPage(parent=container, controller=self)
        self.frames[StartPage] = frame

        frame.grid(row=0, column=0, sticky='nsew')
        self.show_frame(StartPage)

    def show_frame(self, cont):
        frame = self.frames[cont]
        frame.tkraise()

    def _destroyWindow(self):
        self.quit()    # stops mainloop
        self.destroy()


class StartPage(tk.Frame):
    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)

        # initialize Data Frame
        self.df = pd.DataFrame()

        self.nb = None
        self.fig = None
        self.canvas = None
        self.toolbar = None

        # create LOAD button
        self.btn = tk.Button(self, text = 'Load file', command=self.load_csv)
        self.btn.pack()

    def load_csv(self):
        ''' Close the plots;
            Reset Data Frame;
            Destroy notebook if exists;
            Load CSV file.
        '''

        # Setting interactive mode off
        if plt.isinteractive():
            plt.ioff()

        plt.close("all")

        # reset Data Frame
        self.df = pd.DataFrame()

        # initialize list
        self.hdrs = []

        try:
            # destroy notebook if exists
            self.nb.pack_forget()
            self.nb.destroy()
        except:
            pass

        self.nb = None

        # Select CSV file
        self.file_path = filedialog.askopenfilename()

        if not self.file_path:
            msg.showinfo('Select CSV file', "No file chosen.")
            return
        try:
            # read csv file (exemple.csv)
            self.df = pd.read_csv(self.file_path, header=0)
        except:
            msg.showinfo('Select CSV file', 'Not a csv file / corrupt file.')
            return

        # get dimensions
        self.m, self.n = self.df.shape

        # build the abscissa x from first column
        self.x = self.df.iloc[:,0]

        # create the notebook
        self.nb = ttk.Notebook(self)

        # allow Tab navigation
        self.nb.enable_traversal()

        # add Tabs
        for k in range(1, self.n):
            hdr = self.df.columns[k]
            self.hdrs.append(hdr)

            tab = tk.Frame(self.nb, name=hdr.lower())
            self.nb.add(tab, text=hdr)

            self.fig = plt.figure(num=hdr.lower(), clear=True, figsize=(7, 5), dpi=100)
            # self.ax = self.fig.add_subplot()
            self.canvas = FigureCanvasTkAgg(self.fig, master=tab)
            self.canvas.get_tk_widget().pack(side=tk.TOP, fill=tk.BOTH, expand=1)

            toolbar = NavigationToolbar2Tk(self.canvas, tab)
            toolbar.update()
            self.canvas._tkcanvas.pack(side=tk.TOP, fill=tk.BOTH, expand=1)

        self.nb.pack(fill='both', expand=1)

        # virtual event after a new tab is selected
        self.nb.bind("<<NotebookTabChanged>>", self.plotTH)

    def plotTH(self, event):
        '''
            Plot each Column from Data Frame on its own Tab/Figure
        '''

        # Setting interactive mode on is essential: plt.ion()
        if not plt.isinteractive():
            plt.ion()

        # tab index
        i = self.nb.index('current')

        # tab text
        tab_text = self.nb.select().split('.')[-1]

        # set current figure
        cf = plt.figure(tab_text)
        plt.clf()        

        # plotting
        ax = plt.subplot(111)  

        ax.plot(self.x, self.df.iloc[:,i+1], 'b-', linewidth=1, label=tab_text)
        ax.set_xlabel('index')
        ax.set_title(self.hdrs[i], fontsize = 8)
        ax.legend(loc='best')
        ax.grid()

        cf.canvas.draw()

app = Graphs()
app.title('CSV Plots')
app.geometry('800x600+400+150')
app.resizable(True, True)

app.mainloop()

这是功能性的,但是有明显的缺陷。如果有其他程序在播放噪音,则计算机将认为ReSoin正在运行。有没有办法对此进行调整,以使其仅检测ReSoin是否正在播放噪音?我是Powershell和批处理脚本的业余爱好者,但是如果有人有其他想法,我很乐于尝试其他脚本方法。如果我的目标无法实现,或者对StackOverflow社区提出的目标太难了,请告诉我。任何帮助将不胜感激。

0 个答案:

没有答案