使用 Windows 消息循环接收我正在编写的库中的事件

Use Windows message loop to receive an event in a library I'm writing

我正在编写一个包含一些媒体基础功能的库。我希望能够通过网络摄像头何时 connected/disconnected to/from 系统的回调通知图书馆用户。 MSDN describes how to know when a camera is disconencted, but it uses message loop to let you know of that. I don't know Windows message loops too well, but what I have read in this MSDN article 告诉我必须有一个 window 才能有一个消息循环,这对于库来说是不可接受的。

所以,我有几个问题:

  1. 我可以在新线程中创建消息循环并接收第一个 link 描述的那些通知消息吗? (我希望它在一个新线程中,这样它就不会阻塞库用户的线程,然后库用户调用 setCameraChangeCallback(...),这会在内部启动消息循环。)如果是这样,用于创建消息循环的函数应该我用?

  2. 我可以在不创建任何 windows 的情况下做到这一点吗?这是一个图书馆,所以如果突然出现一个叫setCameraChangeCallback(...)和一个window的图书馆用户,那就很奇怪了。同样,非常欢迎解释如何执行此操作(函数名称、要使用的特定参数等)。

  3. 我的库可以在 Windows 应用程序中正常使用吗?这意味着将使用我的库的 Windows 应用程序很可能已经创建了 window 和它自己的消息循环 运行。我在单独线程中的消息循环 运行 会干扰图书馆用户的消息循环吗?如果是这样,如何避免?

  4. 有什么能阻止我创建两个或更多消息循环线程,每个线程都注册以获得相机更改事件的通知吗?

This MSDN article tells me that I must have a window in order to have a message loop, which is unacceptable for a library.

不是这样。创建一个 message only window,甚至只是一个隐藏的 window。让那个window收到通知信息然后转发。

您可以选择是否在专用线程内执行此操作。执行创建 window 代码的线程都被视为 window 的拥有线程。消息被发送到该线程。该线程必须发送消息以便 window 接收它们。

从表面上看,您可能认为在专用线程中创建 window 并将其与主机应用程序隔离开来会更干净。这有好处,但代价是您需要考虑当您希望转发通知事件时会发生什么。您收到的消息将到达您的专用线程。如果您直接转发事件,那么您的库的主机将最终在您的专用线程中异步执行代码。那真的是你想要的吗?

一种更常见的方法是在最初请求接收通知的主机线程中触发事件。这意味着您的库必须要求主机应用程序发送消息。

很明显,您可以在这里做出一些选择。但最重要的是,你不应该相信库代码不能创建 windows。 Windows 不需要可见,实际上只有消息 windows 是专门为您的使用场景设计的。