在工作线程上创建的WinForms窗口未收到所有预期的消息

时间:2009-04-24 11:26:46

标签: c# winforms multithreading audio

我正在使用带有回调方法的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调用一样成功,但我从来没有收到回调知道何时排队更多音频。

我是否遗漏了关于后台线程中表单的明显内容?

3 个答案:

答案 0 :(得分:1)

您是否在辅助线程上发送消息?

答案 1 :(得分:0)

您应该通过WinSpector监控消息输入。 您不知道音频库如何实现消息处理 - 也许它会发送到主应用程序窗口过程。也许你甚至可以用另一种方式构建它来接收要接收通知的窗口的hwnd。

无论如何,如果发送了任何消息,您将在WinSpector中看到它。

答案 2 :(得分:0)

好吧,我现在已经弄明白了,当然这很明显。窗口的消息泵未运行。让我离开正确轨道的是,当您致电waveOutOpen时,窗口的WndProc会运行,并会处理各种消息,例如WM_CREATEWM_ACTIVATE等。但是,在离开waveOutOpen后,WndProc函数不会继续运行(当然,因为此线程正在运行其他代码)。