代码之家  ›  专栏  ›  技术社区  ›  Mark Heath

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

  •  0
  • Mark Heath  · 技术社区  · 16 年前

    我正在用C#播放音频,使用 waveOut WndProc MM_WOM_DONE 信息。

    result = WaveInterop.waveOutOpen(out hWaveOut, devNumber, waveStream.WaveFormat, waveOutWindow.Handle, 0, WaveInterop.CallbackWindow);
    

    waveOutWindow 从未收到任何 WOM_ waveOutOpen

    waveOutWindow.Show();
    Debug.Assert(waveOutWindow.IsHandleCreated, "Handle not created!");
    Debug.Assert(waveOutWindow.Created, "Window not created!");
    

    我要说的是 和最初的计划一样成功 waveOutWrite 电话,但我从来没有得到我的回调知道何时排队更多的音频。

    我是否遗漏了一些非常明显的关于后台线程上表单的内容?

    3 回复  |  直到 16 年前
        1
  •  1
  •   Luis Abreu    16 年前

    您是否在第二个线程上发送消息?

        2
  •  0
  •   majkinetor    16 年前

    您应该通过以下方式监视消息输入: WinSpector . 您不知道音频库是如何实现消息处理的——也许它会发送到主应用程序窗口过程。也许您甚至可以用另一种方式来构建它,以提供窗口的hwnd,即接收通知。

        3
  •  0
  •   Mark Heath    16 年前

    好吧,我现在明白了,当然这是显而易见的。车窗的信息泵未运行。让我偏离正轨的是当你打电话的时候 waveOutOpen ,运行窗口的WndProc,并显示各种消息,如 WM_CREATE , WM_ACTIVATE 等得到处理。但是,WndProc函数在离开后不会继续运行 (当然,因为该线程正在运行其他代码)。