【问题标题】:SendMessage with an int as a parameter for lParam or wParam?带有 int 的 SendMessage 作为 lParam 或 wParam 的参数?
【发布时间】:2013-03-13 23:16:12
【问题描述】:

假设我想向我的 WndProc 发送消息,但我还想发送一个整数。

SendMessage (m_hWnd, WM_DISPLAYCHANGE, NULL, int?);

我的 WndProc 会收到它吗?然后我想将该 lParam(integer) 发送到一个函数。

case WM_DISPLAYCHANGE:
    {
         pD2DResources->OnRender(lParam);
    }
    break;

如何将整数作为 lParam 或 wParam 发送,然后将该整数作为参数重新发送到函数?

【问题讨论】:

  • 我认为如果你基本上尝试你在问题中的建议(给予或接受一些演员及其后果),你会感到惊喜......也就是说,你不应该发送WM_DISPLAYCHANGE,Windows 应该。从您可以发送的消息范围中选择一些内容。
  • LPARAM 是一个 typedef(目前 LONG_PTR 它本身就是一个 typedef,根据 msdn.microsoft.com/en-us/library/cc230349.aspx 是“用于指针精度的长类型。它用于将指针转换为long 类型来执行指针运算。”你做数学;)
  • 谢谢!没想到这么简单。

标签: c++ function wndproc lparam


【解决方案1】:

LPARAM 和 WPARAM 只是长期的 typedef。所以一个 int 可以按原样发送。

SendMessage(m_hWnd, WM_DISPLAYCHANGE, NULL, (LPARAM)yourInt)

在你的 wnd 过程中你可以做

pD2DResource->Render((int)lParam)

当您将这些自定义信息作为标准窗口消息的一部分(WM_USER 下方的消息号)发送时,您应该小心不要将您在窗口过程中收到的 LPARAM 值直接传递给 DefWindowProc(默认窗口过程) - 因为 yourInt对于特定的标准 Windows 消息,可能具有特殊含义。您可以将一个固定值从您的窗口 proc 传递到 DefWindowProc,或者查看其他方法来通过 LPARAM/WPARAM 传递超过 4 字节的信息。由于 SendMessage 是同步的,您可以传递结构的地址 - 就像许多标准 Windows 消息一样。

【讨论】:

  • 或者只是不使用系统的消息,它们可能对消息挂钩有特殊的意义。
  • @ta.speot.is - 是的,有效点。一个 wndproc 钩子可能期望 LPARAM 中的 WM_DISPLAYCHANGE 消息的分辨率信息,但如果它在 LPARAM 中看到自定义 int 值 1,它可能会变得不稳定。但是应该编写挂钩以期待任何事情。此外,跨进程边界发送消息将涉及一些参数编组,这也可能会变得不稳定。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-06-01
  • 2017-10-02
  • 1970-01-01
  • 1970-01-01
  • 2011-01-31
  • 1970-01-01
  • 2013-07-24
相关资源
最近更新 更多