【问题标题】:Intercept WM_COMMAND (sent from an accelerator) on Internet Explorer_Server (IWebBrowser2)在 Internet Explorer_Server (IWebBrowser2) 上拦截 WM_COMMAND(从加速器发送)
【发布时间】:2012-09-30 08:14:54
【问题描述】:

我需要拦截发送到我的 CHtmlView 对象的粘贴消息。根据 Spy++,它作为 WM_COMMAND 消息发送 - 但根据 Spy++,消息不是发送到 CHtmlView 对象,而是发送到它包装的 Internet Explorer_Server(或 IWebBrowser2)对象。在任何其他父对象中都看不到有问题的 WM_COMMAND 消息(我通过观察和 Spy++ 发现了这一点)。

我如何截获这个(或者说,一个全选)消息?我查看了 AfxCallWndProc 以获得正确的 WM_COMMAND 消息,但它没有显示在那里。

【问题讨论】:

    标签: c++ internet-explorer mfc atl


    【解决方案1】:

    要拦截消息(例如:WM_COMMAND),您需要通过调用以下方式子类化窗口(在您的情况下为 Internet Explorer_Server):

    BOOL SetWindowSubclass(
      _In_  HWND hWnd,
      _In_  SUBCLASSPROC pfnSubclass,
      _In_  UINT_PTR uIdSubclass,
      _In_  DWORD_PTR dwRefData
    );
    

    http://msdn.microsoft.com/en-us/library/windows/desktop/bb773183(v=vs.85).aspx#set_windowsubclass

    之后,您自己的 windows 过程首先获得控制权,然后您可以决定如何处理该消息。

    【讨论】:

    • 我最终选择了SetWindowLongPtr(),但这让我走上了正轨。谢谢。
    • 几十年来我一直使用SetWindowLongPtr()。它工作正常。 SetWindowSubclass 有什么问题?它在幕后做同样的事情。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-25
    • 2023-03-18
    相关资源
    最近更新 更多