【问题标题】:Handling Messages in Console Apps/DLLs in C++ Win32在 C++ Win32 中处理控制台应用程序/DLL 中的消息
【发布时间】:2010-04-24 21:04:05
【问题描述】:

我希望能够在控制台应用程序和/或独立 DLL 中处理 Win32 消息。

我已经能够通过以下文章在 .NET 中完成此操作,并且它在控制台应用程序和独立 DLL 中的 C# 中运行良好
http://msdn.microsoft.com/en-us/magazine/cc163417.aspx

有没有办法用 C/C++ Win32 API 来做同样的事情?我已经尝试过 RegisterClassEx(...) 和 CreateWindow(...) 甚至将 HWND_MESSAGE 传递给 hWndParent 但问题是在创建“不可见”窗口后,可能由于缺少消息泵,消息未得到处理.

如果您有一个 DLL 入口点,消息泵会去哪里?我尝试在 DLL 中创建另一个线程并将 while(GetMesage(..)) 放在那里,但这也不起作用。

有什么想法吗?

【问题讨论】:

  • 您是否将消息泵与您的 CreateWindow 调用放在同一线程上?
  • 只是好奇,您需要来自控制台应用程序的哪种 Win32 消息?
  • @Gabe 我没有尝试这样做,接下来会尝试 @Romain 我正在尝试在调用 RegisterDeviceNotification 后接收 WM_DEVICECHANGE 消息。
  • 谢谢加布。就是这样 WM_DEVICECHANGE 消息现在正在通过!

标签: c++ dll winapi


【解决方案1】:

是的,您需要一个消息泵。该窗口还具有线程关联性,因此需要在运行消息泵的同一线程上创建它。基本方法是合理的,如果您包含更多代码,可能会清楚问题所在。

【讨论】:

    【解决方案2】:

    除了 Logan Capaldo 所说的之外,您还有一个问题,即作为 DLL,您在编译时不知道在运行时将加载您的进程类型。

    • 如果您是由控制台应用程序 (/SUBSYSTEM:CONSOLE) 加载的,那么创建自己的隐藏窗口并在同一线程上设置消息泵就可以正常工作(只要您是创建的第一个窗口)。
    • 如果您是由 Windows 应用程序 (/SUBSYSTEM:WINDOWS) 加载的,那么您在获取消息时可能会遇到问题。它们将被发送到层次结构中的顶层窗口,该窗口不是您创建的。您需要获取 hWnd of the main process 并将其子类化(如果您还没有)。
    • 如果您正在被服务加载,那么您根本不会收到窗口消息。你需要使用RegisterServiceCtrlHandlerEx Function

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-10-21
      • 2022-11-14
      • 2011-10-10
      • 1970-01-01
      • 1970-01-01
      • 2010-11-04
      • 1970-01-01
      • 2010-10-20
      相关资源
      最近更新 更多