繁体   English   中英

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

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

我正在写一个包装一些Media Foundation功能的库。 我希望能够通过回调将网络摄像头何时连接到系统/从系统断开连接来通知图书馆用户。 MSDN描述了如何知道何时断开摄像机 ,但它使用消息循环让您知道这一点。 我不太了解Windows消息循环,但是我在MSDN文章中读到的内容告诉我,必须有一个窗口才能有消息循环,这对于库是不可接受的。

因此,我有几个问题:

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

  2. 我可以在不创建任何窗口的情况下做到这一点吗? 这是一个库,所以如果一个库用户叫setCameraChangeCallback(...)并突然出现一个窗口,那将是很奇怪的。 同样,非常欢迎您提供有关如何执行此操作的说明(函数名称,要使用的特定参数等)。

  3. 我的库可以在Windows应用程序中正常使用吗? 这意味着将要使用我的库的Windows应用程序可能已经创建了一个窗口,并且正在运行其自己的消息循环。 我在单独线程中运行的消息循环是否会干扰库用户的消息循环? 如果是这样,如何避免这种情况?

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

这篇MSDN文章告诉我,必须有一个窗口才能有消息循环,这对于库是不可接受的。

不是这样 创建仅消息窗口 ,甚至创建一个隐藏窗口。 让该窗口接收通知消息,然后转发它们。

如果愿意,可以选择在专用线程内执行此操作。 执行创建窗口的代码的任何线程都被视为窗口的拥有线程。 消息发送到该线程。 该线程必须调度消息,以便窗口接收消息。

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

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

显然,您可以在这里做出一些选择。 但最重要的是,您不应该相信库代码一定不能创建窗口。 Windows不必是可见的,实际上只有消息的窗口是专门为您的使用方案设计的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM