別のアプリケーションのボリュームを変更するアプリケーションを作成しており、そのためにCoreAudioApi
dll を使用しています。次のコード ブロックはメイン スレッドで完全に機能しますが、別のスレッドで呼び出されると anInvalidCastException
が発生します。これが 2 つのスレッドが同じリソースにアクセスしようとしているだけの問題である場合に備えて、Mutex を投入しましたが、そうではないようです。問題が何であるかについてのアイデアはありますか?私は新しい C# プログラマーとして困惑しています。メインスレッドのみがCoreAudioApiなどのCOMオブジェクトにアクセスできることが示唆されている他の質問を読んだので、メインスレッドに何らかのメッセージを送信する必要があります。これが正しい場合、これを行う最善の方法は何ですか?
例外 (最初の Math.abs if ステートメントで発生):
Unable to cast COM object of type 'System.__ComObject' to interface type 'CoreAudioApi.Interfaces.IMMDevice'. This operation failed because the QueryInterface call on the COM component for the interface with IID '{D666063F-1587-4E43-81F1-B948E807363F}' failed due to the following error: No such interface supported (Exception from HRESULT: 0x80004002 (E_NOINTERFACE)).
コード:
muteSoundMutex.WaitOne();
AudioSessionControl sASC = sInfo.getSAudioSession();
if (Math.Abs(sASC.SimpleAudioVolume.MasterVolume -
(0.05f / defaultDevice.AudioEndpointVolume.MasterVolumeLevelScalar)) < 0.0001
&& savedVol > 0)
{
... // other code here. all mutexes are released correctly.