【问题标题】:In MFC, in wizard-generated WindowProc, how do I determine message sender window handle?在 MFC 中,在向导生成的 WindowProc 中,如何确定消息发送方窗口句柄?
【发布时间】:2021-01-15 16:29:02
【问题描述】:

我有一个最初用 Visual C++ 6 编写的旧版 MFC 应用程序。我需要对其进行一些小改动,但 MFC 对我来说是一个黑盒子。

这个显然是由向导生成的函数来处理消息

LRESULT CMainFrame::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
    // TODO: Add your specialized code here and/or call the base class

    switch (message)
    {
    case WM_CLOSE:
        ...;
  ...
  etc.
}

对于某些消息,我需要获取发送者窗口句柄(来自不同的进程)。在 Windows API 中,标准 WindowProc 将此句柄作为第一个参数,但在 MFC 中它在哪里?

编辑:谢谢雷蒙德和马克。我发现我误解了它的工作原理。

【问题讨论】:

  • WndProc 的第一个参数不是发送者句柄。它是接收器句柄。未提供发件人句柄,尽管某些消息(如 WM_COMMAND)具有在额外参数之一中传递发件人的约定。
  • 消息的发送者甚至不需要窗口句柄。任意代码都可以调用SendMessage
  • 知道发送方窗口句柄的唯一方法是它是否以某种方式编码在 WPARAM 或 LPARAM 参数中……例如 WN_NOTIFY 消息中的 NMHDR* 指针。否则,谁知道呢?正如 Mark 所说,发送者甚至不需要窗口句柄。

标签: mfc message handle sender


【解决方案1】:

此信息不可用。标准窗口过程中的第一个参数是接收者,而不是发送者。这也是有道理的,因为SendMessagePostMessage 通过窗口句柄来识别接收者。另一方面,发送者可以是任何线程,包括不拥有任何窗口的线程。

如果您需要在接收消息的代码中识别消息的发送者,则必须明确传递一个 ID。当跨越进程边界时,您将不得不编组任何引用的内存。系统不会对自定义消息执行此操作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多