| // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef UI_BASE_WIN_HWND_SUBCLASS_H_ |
| #define UI_BASE_WIN_HWND_SUBCLASS_H_ |
| |
| #include <windows.h> |
| |
| #include <memory> |
| #include <vector> |
| |
| #include "base/macros.h" |
| #include "ui/base/ui_base_export.h" |
| #include "ui/base/view_prop.h" |
| |
| namespace ui { |
| |
| // Classes implementing this interface get the opportunity to handle and consume |
| // messages before they are sent to their target HWND. |
| class UI_BASE_EXPORT HWNDMessageFilter { |
| public: |
| virtual ~HWNDMessageFilter(); |
| |
| // A derived class overrides this method to perform filtering of the messages. |
| // Return true to prevent other HWNDMessageFilter's of the target HWND and the |
| // system message handler |original_wnd_proc_| from receiving the message. |
| // Return false to propagate the message further to other HWNDMessageFilters |
| // and eventually to |original_wnd_proc|. |
| // The order in which HWNDMessageFilters are added in HWNDSubclass::AddFilter |
| // determines which filter gets to see the message first (a filter added first |
| // will see the message first). |
| virtual bool FilterMessage(HWND hwnd, |
| UINT message, |
| WPARAM w_param, |
| LPARAM l_param, |
| LRESULT* l_result) = 0; |
| }; |
| |
| // An object that instance-subclasses a window. If the window has already been |
| // instance-subclassed, that subclassing is lost. |
| class UI_BASE_EXPORT HWNDSubclass { |
| public: |
| ~HWNDSubclass(); |
| |
| // Adds |filter| to the HWNDSubclass of |target|. Caller retains ownership of |
| // |filter|. See the comment about the order in which filters are added in |
| // HWNDMessageFilter::FilterMessage. |
| static void AddFilterToTarget(HWND target, HWNDMessageFilter* filter); |
| |
| // Removes |filter| from any HWNDSubclass that has it. |
| static void RemoveFilterFromAllTargets(HWNDMessageFilter* filter); |
| |
| // Returns a non-null HWNDSubclass corresponding to the HWND |target|. Creates |
| // one if none exists. Retains ownership of the returned pointer. |
| static HWNDSubclass* GetHwndSubclassForTarget(HWND target); |
| |
| // Adds |filter| if not already added to this HWNDSubclass. Caller retains |
| // ownership of |filter|. See the comment about the order in which filters are |
| // added in HWNDMessageFilter::FilterMessage. |
| void AddFilter(HWNDMessageFilter* filter); |
| |
| // Removes |filter| from this HWNDSubclass instance if present. |
| void RemoveFilter(HWNDMessageFilter* filter); |
| |
| LRESULT OnWndProc(HWND hwnd, UINT message, WPARAM w_param, LPARAM l_param); |
| |
| private: |
| class HWNDSubclassFactory; |
| friend class HWNDSubclassFactory; |
| |
| explicit HWNDSubclass(HWND target); |
| |
| HWND target_; |
| std::vector<HWNDMessageFilter*> filters_; |
| WNDPROC original_wnd_proc_; |
| ui::ViewProp prop_; |
| |
| DISALLOW_COPY_AND_ASSIGN(HWNDSubclass); |
| }; |
| |
| } // namespace ui |
| |
| #endif // UI_BASE_WIN_HWND_SUBCLASS_H_ |