15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef UI_BASE_WIN_HWND_SUBCLASS_H_ 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define UI_BASE_WIN_HWND_SUBCLASS_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <windows.h> 95d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include <vector> 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/gtest_prod_util.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ui/base/ui_base_export.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/view_prop.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ui { 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Classes implementing this interface get the opportunity to handle and consume 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// messages before they are sent to their target HWND. 205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class UI_BASE_EXPORT HWNDMessageFilter { 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~HWNDMessageFilter(); 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // A derived class overrides this method to perform filtering of the messages. 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Return true to prevent other HWNDMessageFilter's of the target HWND and the 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // system message handler |original_wnd_proc_| from receiving the message. 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Return false to propagate the message further to other HWNDMessageFilters 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // and eventually to |original_wnd_proc|. 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The order in which HWNDMessageFilters are added in HWNDSubclass::AddFilter 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // determines which filter gets to see the message first (a filter added first 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // will see the message first). 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool FilterMessage(HWND hwnd, 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UINT message, 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WPARAM w_param, 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LPARAM l_param, 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LRESULT* l_result) = 0; 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// An object that instance-subclasses a window. If the window has already been 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// instance-subclassed, that subclassing is lost. 415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class UI_BASE_EXPORT HWNDSubclass { 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~HWNDSubclass(); 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Adds |filter| to the HWNDSubclass of |target|. Caller retains ownership of 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |filter|. See the comment about the order in which filters are added in 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // HWNDMessageFilter::FilterMessage. 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void AddFilterToTarget(HWND target, HWNDMessageFilter* filter); 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Removes |filter| from any HWNDSubclass that has it. 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void RemoveFilterFromAllTargets(HWNDMessageFilter* filter); 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns a non-null HWNDSubclass corresponding to the HWND |target|. Creates 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // one if none exists. Retains ownership of the returned pointer. 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static HWNDSubclass* GetHwndSubclassForTarget(HWND target); 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Adds |filter| if not already added to this HWNDSubclass. Caller retains 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // ownership of |filter|. See the comment about the order in which filters are 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // added in HWNDMessageFilter::FilterMessage. 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void AddFilter(HWNDMessageFilter* filter); 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Removes |filter| from this HWNDSubclass instance if present. 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void RemoveFilter(HWNDMessageFilter* filter); 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LRESULT OnWndProc(HWND hwnd, UINT message, WPARAM w_param, LPARAM l_param); 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) class HWNDSubclassFactory; 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class HWNDSubclassFactory; 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit HWNDSubclass(HWND target); 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HWND target_; 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<HWNDMessageFilter*> filters_; 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WNDPROC original_wnd_proc_; 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::ViewProp prop_; 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(HWNDSubclass); 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace ui 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // UI_BASE_WIN_HWND_SUBCLASS_H_ 84