Он делает это в большинстве случаев, но не всегда, и мне не удалось установить закономерность в тех немногих случаях, когда он не выдавал ошибку. Кроме того, он делает это только для первого воспроизводимого файла, а не для последующих файлов. И он ускользает от Try catch для обработки ошибок.
Public Sub playSelected(ByVal fileStr As String)
If File.Exists(fileStr) Then
Debugging.DebugPrint(" Play: " & fileStr)
MediaPlayer.URL = fileStr
Try
MediaPlayer.Ctlcontrols.play()
Catch ex As Exception
MessageBox.Show("Could Not play the selected File please try again. Exception : " + ex.Message)
End Try
Else
Debugging.DebugPrint(" File Does not Exist: " & fileStr)
End If
End Sub
Благодаря jornare за информацию и толчок в правильном направлении, я объясню свое решение и код ниже, надеюсь, что это поможет.
Сначала мне пришлось изменить рекомендуемый ответ несколькими различными способами. Следующие две строки объявлены в классе, который вызывает описанный выше метод playSelected.
Public Declare Function SetErrorMode Lib "kernel32.dll" (ByVal uMode As System.UInt32) As System.UInt32
Private Const SEM_FAILCRITICALERRORS As System.UInt32 = &H1
вы увидите добавленную переменную Const с именем SEM_FAILCRITICALERRORS, это необходимо для установки значения переменной в 1, в этом случае имя переменной очень специфично, так как оно соответствует имени переменной флага в SetErrorMode метод, если для этого флага установлено значение true, он отключает отображение CriticalErrors. Я также добавил расширение .dll к вызову Lib, хотя это может и не понадобиться.
Ниже мой новый метод playSelected
Public Sub playSelected(ByVal fileStr As String)
If File.Exists(fileStr) Then
If isVista Then
oldErrMode = SetErrorMode(SEM_FAILCRITICALERRORS)
End If
Debugging.DebugPrint(" Play: " & fileStr)
MediaPlayer.URL = fileStr
Try
MediaPlayer.Ctlcontrols.play()
Catch ex As Exception
MessageBox.Show("Could Not play the selected File please try again. Exception : " + ex.Message)
End Try
If isVista Then
criticalFailureTimer.Interval = 2000
criticalFailureTimer.AutoReset = False
criticalFailureTimer.Start()
End If
Else
Debugging.DebugPrint(" File Does not Exist: " & fileStr)
End If
End Sub
теперь это важно! Первоначально я установил ErrorMode обратно в oldErrMode после вызова ctlcontrols.play, но обнаружил, что это не предотвратило ошибку. Я установил свой VS в режим отладки на моей машине с Win7 и прошел код построчно.Я обнаружил, что код на самом деле не пытался воспроизвести файл до тех пор, пока не закончилась подпрограмма. Вот почему вы видите вызовы таймера. Я установил 2-секундный таймер, чтобы дать себе буфер, чтобы он мог начать процесс воспроизведения с правильно установленным режимом ошибки. ниже приведен код, который я использовал для события истечения таймера
'in my Constructor
If My.Computer.Info.OSFullName.Contains("Vista") Then
isVista = True
AddHandler criticalFailureTimer.Elapsed, AddressOf criticalTimerExpired
End If
'end of Constructor portion
Private Sub criticalTimerExpired(sender As Object, e As ElapsedEventArgs)
SetErrorMode(oldErrMode)
End Sub
. Последнее предостережение, которое я дам по этому поводу. Насколько я понимаю, этот процесс отключает отображение критических ошибок, поэтому будьте осторожны, в моем случае я не смог найти какой-либо конкретной ошибки или нестабильности системы, вызванной возникшей ошибкой, поэтому я временно отключил это, чтобы повысить удобство использования программы. Я не рекомендую делать это каждый раз, когда у вас возникает системная ошибка, так как часто эта ошибка указывает на недостаток/ошибку в программе, которую следует исправить. Кроме того, на мой взгляд, вам никогда не нужно постоянно отключать критические ошибки, а это означает, что вы должны включить их снова, когда закончите. Я надеюсь, что эта информация поможет, и ценю время и знания тех, кто ответил или проголосовал за вопрос.