我正在使用带有回调方法的waveOut
函数在C#中播放音频,其中消息被发送回窗口句柄。我正在创建一个带有重叠WndProc
函数的Windows窗体来监听MM_WOM_DONE
消息。
result = WaveInterop.waveOutOpen(out hWaveOut, devNumber, waveStream.WaveFormat, waveOutWindow.Handle, 0, WaveInterop.CallbackWindow);
当我在我的应用程序的主GUI线程上时,所有这一切都完全可靠。但是如果后台线程试图这样做,waveOutWindow
永远不会收到任何WOM_
消息。我一开始认为可能窗口没有正确创建,并且它的消息队列没有得到服务,但即使我在waveOutOpen
之前放入以下代码,它仍然无效。
waveOutWindow.Show();
Debug.Assert(waveOutWindow.IsHandleCreated, "Handle not created!");
Debug.Assert(waveOutWindow.Created, "Window not created!");
我应该说,对waveOutOpen
的调用与初始waveOutWrite
调用一样成功,但我从来没有收到回调知道何时排队更多音频。
我是否遗漏了关于后台线程中表单的明显内容?
答案 0 :(得分:1)
您是否在辅助线程上发送消息?
答案 1 :(得分:0)
您应该通过WinSpector监控消息输入。 您不知道音频库如何实现消息处理 - 也许它会发送到主应用程序窗口过程。也许你甚至可以用另一种方式构建它来接收要接收通知的窗口的hwnd。
无论如何,如果发送了任何消息,您将在WinSpector中看到它。
答案 2 :(得分:0)
waveOutOpen
时,窗口的WndProc会运行,并会处理各种消息,例如WM_CREATE
,WM_ACTIVATE
等。但是,在离开waveOutOpen
后,WndProc函数不会继续运行(当然,因为此线程正在运行其他代码)。