代码之家  ›  专栏  ›  技术社区  ›  Vicken Simonian

C++ Win32中控制台应用程序/DLL中的消息处理

  •  4
  • Vicken Simonian  · 技术社区  · 14 年前

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

    我已经能够在.net中完成这项工作,这篇文章在控制台应用程序和独立dll中的c中非常有用
    http://msdn.microsoft.com/en-us/magazine/cc163417.aspx

    有没有办法与C/C++Win32 API等同?我试过使用registerclassex(…)和createwindow(…)甚至将hwnd_消息传递给hwndparent,但问题是创建“不可见”窗口后,消息可能由于缺少消息泵而无法处理。

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

    有什么想法吗?

    2 回复  |  直到 13 年前
        1
  •  2
  •   Logan Capaldo    14 年前

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

        2
  •  2
  •   Community Dunja Lalic    7 年前

    除了logan capaldo所说的之外,您还有一个问题,作为一个dll,您不知道在编译时什么样的进程将在运行时加载您。

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