簡體   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