Воспроизведение музыки c в PowerShell останавливается при назначении кнопки - PullRequest
0 голосов
/ 09 апреля 2020

Я столкнулся с проблемой, которую я не могу решить или понять, играя в Musi c из Powershell, я сделал WPF GUI поверх сценария mys Powershell. Все работает отлично, за исключением того, что когда я нажимаю кнопку воспроизведения musi c, я запускаю musi c, но через несколько секунд останавливается. Или при наведении мыши на WPF GUI музыка c останавливается, и я не могу ее решить. Когда я кидаю код для воспроизведения музыки c в проекте, он работает безупречно, только когда я назначаю ему кнопку, начинаются проблемы.

Итак, я сделал урезанную версию с простой старой формой и Кнопка ничего больше, сделал событие add_Click для подключения кнопки к коду и снова протестировал. Снова та же проблема: musi c перестает играть либо через несколько секунд, либо когда вы наводите указатель мыши на форму.

Теперь у меня по-прежнему висит старая машина Windows 7 с Powershell V2 на ней, и угадайте, что сработало безупречно! затем я обновил Powershell v2 до V5 на этой машине, и у меня возникла та же проблема, что и на ноутбуке с Win 10 (1909 с PS 5.1), поэтому с Powershell между V2 и V2 что-то изменилось, что вызывает такое поведение, но я не могу найти, что ...

Некоторые примеры, когда я добавляю эти строки кода в проект, он работает:

    Add-Type -AssemblyName presentationcore
    $location = (C:\users\myuserid\test.mp3)
    $PlaySound = New-Object System.Windows.Media.MediaPlayer
    $PlaySound.open($location)
    $PlaySound.Play()

Но как только я назначаю ему кнопку, появляется проблема, как описано выше

Так что раздели все до голых костей, чтобы исключить как можно больше:

Add-Type -AssemblyName System.Windows.Forms    
Add-Type -AssemblyName System.Drawing
Add-Type -AssemblyName presentationcore

    # Build Form
    $Form = New-Object System.Windows.Forms.Form
    $Form.Text = "My Form"
    $Form.Size = New-Object System.Drawing.Size(200,200)
    $Form.StartPosition = "CenterScreen"
    $Form.Topmost = $True

    # Add Button
    $Button = New-Object System.Windows.Forms.Button
    $Button.Location = New-Object System.Drawing.Size(35,35)
    $Button.Size = New-Object System.Drawing.Size(120,23)
    $Button.Text = "Play music"

    $Form.Controls.Add($Button)

    #Add Button event 
    $Button.Add_Click({


        $location = 'D:\test\test.mp3'
        $PlaySound = New-Object System.Windows.Media.MediaPlayer
        $PlaySound.open($location)
        $PlaySound.Play()

    })

    #Show the Form 
    $form.ShowDialog()| Out-Null 

Так что при изменении размера формы при воспроизведении музыки c она остановится в 95% случаев , Но когда я добавляю код для воспроизведения музыки c без кнопки, как эта, она никогда не ломается ..

Add-Type -AssemblyName System.Windows.Forms    
Add-Type -AssemblyName System.Drawing
Add-Type -AssemblyName presentationcore

    # Build Form
    $Form = New-Object System.Windows.Forms.Form
    $Form.Text = "My Form"
    $Form.Size = New-Object System.Drawing.Size(200,200)
    $Form.StartPosition = "CenterScreen"
    $Form.Topmost = $True

    # Add Button
    $Button = New-Object System.Windows.Forms.Button
    $Button.Location = New-Object System.Drawing.Size(35,35)
    $Button.Size = New-Object System.Drawing.Size(120,23)
    $Button.Text = "Play music"

    $Form.Controls.Add($Button)

    #Add Button event 
    $Button.Add_Click({


        #Button now does nothing.. and music plays without breaking...ever

    })

        #Now it will always play to the end no matter what :-S
        $location = 'D:\test\test.mp3'
        $PlaySound = New-Object System.Windows.Media.MediaPlayer
        $PlaySound.open($location)
        $PlaySound.Play()


    #Show the Form 
    $form.ShowDialog()| Out-Null 

Надеюсь, кто-нибудь ответит мне на этот вопрос, искал и форумы для решения но я не могу найти его, спасибо заранее!

Редактировать, я сам решил проблему, хитрость заключается в том, чтобы загрузить плеер в начале вашего сценария, как это:

#Clear the Console
CLS

#Determine Script location
$SCRIPT_PARENT = Split-Path -Parent $MyInvocation.MyCommand.Definition

#Add in the presentation core
Add-Type -AssemblyName presentationframework, presentationcore

#Load music player and set location here!
$location = ($SCRIPT_PARENT + "\Music.mp3")
$PlaySound = New-Object System.Windows.Media.MediaPlayer

###############################################################
#  here comes a whole lot of code (XAML for WPF GUI etc etc)  #
###############################################################

# Then in your event system only put:

#Play button action 
$MainGUI.Playmusic.add_Click({

     #Open file and play music
     $PlaySound.open($location)
     $PlaySound.Play()

})

Это решена игровая проблема на 100%: -)

...