2010-04-24 112 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