Home | History | Annotate | Download | only in win
      1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #ifndef UI_BASE_WIN_HWND_SUBCLASS_H_
      6 #define UI_BASE_WIN_HWND_SUBCLASS_H_
      7 
      8 #include <windows.h>
      9 #include <vector>
     10 
     11 #include "base/gtest_prod_util.h"
     12 #include "base/memory/scoped_ptr.h"
     13 #include "ui/base/ui_base_export.h"
     14 #include "ui/base/view_prop.h"
     15 
     16 namespace ui {
     17 
     18 // Classes implementing this interface get the opportunity to handle and consume
     19 // messages before they are sent to their target HWND.
     20 class UI_BASE_EXPORT HWNDMessageFilter {
     21  public:
     22   virtual ~HWNDMessageFilter();
     23 
     24   // A derived class overrides this method to perform filtering of the messages.
     25   // Return true to prevent other HWNDMessageFilter's of the target HWND and the
     26   // system message handler |original_wnd_proc_| from receiving the message.
     27   // Return false to propagate the message further to other HWNDMessageFilters
     28   // and eventually to |original_wnd_proc|.
     29   // The order in which HWNDMessageFilters are added in HWNDSubclass::AddFilter
     30   // determines which filter gets to see the message first (a filter added first
     31   // will see the message first).
     32   virtual bool FilterMessage(HWND hwnd,
     33                              UINT message,
     34                              WPARAM w_param,
     35                              LPARAM l_param,
     36                              LRESULT* l_result) = 0;
     37 };
     38 
     39 // An object that instance-subclasses a window. If the window has already been
     40 // instance-subclassed, that subclassing is lost.
     41 class UI_BASE_EXPORT HWNDSubclass {
     42  public:
     43   ~HWNDSubclass();
     44 
     45   // Adds |filter| to the HWNDSubclass of |target|. Caller retains ownership of
     46   // |filter|. See the comment about the order in which filters are added in
     47   // HWNDMessageFilter::FilterMessage.
     48   static void AddFilterToTarget(HWND target, HWNDMessageFilter* filter);
     49 
     50   // Removes |filter| from any HWNDSubclass that has it.
     51   static void RemoveFilterFromAllTargets(HWNDMessageFilter* filter);
     52 
     53   // Returns a non-null HWNDSubclass corresponding to the HWND |target|. Creates
     54   // one if none exists. Retains ownership of the returned pointer.
     55   static HWNDSubclass* GetHwndSubclassForTarget(HWND target);
     56 
     57   // Adds |filter| if not already added to this HWNDSubclass. Caller retains
     58   // ownership of |filter|. See the comment about the order in which filters are
     59   // added in HWNDMessageFilter::FilterMessage.
     60   void AddFilter(HWNDMessageFilter* filter);
     61 
     62   // Removes |filter|  from this HWNDSubclass instance if present.
     63   void RemoveFilter(HWNDMessageFilter* filter);
     64 
     65   LRESULT OnWndProc(HWND hwnd, UINT message, WPARAM w_param, LPARAM l_param);
     66 
     67  private:
     68   class HWNDSubclassFactory;
     69   friend class HWNDSubclassFactory;
     70 
     71   explicit HWNDSubclass(HWND target);
     72 
     73   HWND target_;
     74   std::vector<HWNDMessageFilter*> filters_;
     75   WNDPROC original_wnd_proc_;
     76   ui::ViewProp prop_;
     77 
     78   DISALLOW_COPY_AND_ASSIGN(HWNDSubclass);
     79 };
     80 
     81 }  // namespace ui
     82 
     83 #endif  // UI_BASE_WIN_HWND_SUBCLASS_H_
     84