2010-04-24 85 views
3

我希望能夠在控制檯應用程序和/或獨立DLL內處理Win32消息。使用C++處理控制檯應用程序/ DLL中的消息Win32

我已經能夠與下面的文章做在.NET和它在C#控制檯應用程序和獨立DLL
http://msdn.microsoft.com/en-us/magazine/cc163417.aspx

裏面的偉大工程,有沒有辦法做與C/C相當於++ Win32 APIs?我嘗試過使用RegisterClassEx(...)和CreateWindow(...),甚至將HWND_MESSAGE傳遞給hWndParent,但麻煩在於,在創建「不可見」窗口後,可能由於缺少消息泵。

如果您有一個DLL入口點,那麼消息泵將轉到哪裏?我試圖在DLL中創建另一個線程,並將(GetMesage(..))放在那裏,但那也不起作用。

任何想法?

+1

您是否將消息泵放在與CreateWindow調用相同的線程上? – Gabe 2010-04-24 21:23:48

+0

只是好奇,從控制檯應用程序你需要什麼樣的Win32消息? – 2010-04-25 05:03:31

+0

@Gabe我沒有嘗試這樣做,將嘗試下一步 @Romain我試圖在調用RegisterDeviceNotification後拿起WM_DEVICECHANGE消息。 – 2010-04-25 23:59:43

回答

2

您需要一個消息泵是。該窗口也具有線程相關性,因此需要在運行消息泵的同一線程上創建。基本方法是合理的,如果包含更多的代碼,它可能會清楚問題是什麼。

2

除了Logan Capaldo所說的之外,還有一個問題,作爲一個DLL,在編譯時你不知道什麼類型的進程會在運行時加載。

  • 如果你正在一個控制檯應用程序(/子系統:CONSOLE)加載,然後創建一個屬於自己的隱藏的窗口,並在同一線程建立一個消息泵將正常工作(只要你是第一個窗口創建)。
  • 如果您正在通過Windows應用程序加載(/ SUBSYSTEM:WINDOWS),那麼您可能會遇到問題獲取消息。它們將被髮送到您未創建的層次結構中的頂級窗口。你需要獲得hWnd of the main process並將其子類化(如果你還沒有的話)。
  • 如果你正在被一個服務加載,那麼你根本就不會獲得窗口消息。您需要使用RegisterServiceCtrlHandlerEx Function
相關問題