1*6777b538SAndroid Build Coastguard Worker // Copyright 2013 The Chromium Authors 2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be 3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file. 4*6777b538SAndroid Build Coastguard Worker 5*6777b538SAndroid Build Coastguard Worker #ifndef BASE_WIN_MESSAGE_WINDOW_H_ 6*6777b538SAndroid Build Coastguard Worker #define BASE_WIN_MESSAGE_WINDOW_H_ 7*6777b538SAndroid Build Coastguard Worker 8*6777b538SAndroid Build Coastguard Worker #include <string> 9*6777b538SAndroid Build Coastguard Worker 10*6777b538SAndroid Build Coastguard Worker #include "base/base_export.h" 11*6777b538SAndroid Build Coastguard Worker #include "base/compiler_specific.h" 12*6777b538SAndroid Build Coastguard Worker #include "base/functional/callback.h" 13*6777b538SAndroid Build Coastguard Worker #include "base/threading/thread_checker.h" 14*6777b538SAndroid Build Coastguard Worker #include "base/win/windows_types.h" 15*6777b538SAndroid Build Coastguard Worker 16*6777b538SAndroid Build Coastguard Worker // Protect against windows.h being included before this header. 17*6777b538SAndroid Build Coastguard Worker #undef FindWindow 18*6777b538SAndroid Build Coastguard Worker 19*6777b538SAndroid Build Coastguard Worker namespace base { 20*6777b538SAndroid Build Coastguard Worker namespace win { 21*6777b538SAndroid Build Coastguard Worker 22*6777b538SAndroid Build Coastguard Worker // Implements a message-only window. 23*6777b538SAndroid Build Coastguard Worker class BASE_EXPORT MessageWindow { 24*6777b538SAndroid Build Coastguard Worker public: 25*6777b538SAndroid Build Coastguard Worker // Used to register a process-wide message window class. 26*6777b538SAndroid Build Coastguard Worker class WindowClass; 27*6777b538SAndroid Build Coastguard Worker 28*6777b538SAndroid Build Coastguard Worker // Implement this callback to handle messages received by the message window. 29*6777b538SAndroid Build Coastguard Worker // If the callback returns |false|, the first four parameters are passed to 30*6777b538SAndroid Build Coastguard Worker // DefWindowProc(). Otherwise, |*result| is returned by the window procedure. 31*6777b538SAndroid Build Coastguard Worker using MessageCallback = 32*6777b538SAndroid Build Coastguard Worker base::RepeatingCallback<bool(UINT message, 33*6777b538SAndroid Build Coastguard Worker WPARAM wparam, 34*6777b538SAndroid Build Coastguard Worker LPARAM lparam, 35*6777b538SAndroid Build Coastguard Worker LRESULT* result)>; // NOLINT 36*6777b538SAndroid Build Coastguard Worker 37*6777b538SAndroid Build Coastguard Worker MessageWindow(); 38*6777b538SAndroid Build Coastguard Worker 39*6777b538SAndroid Build Coastguard Worker MessageWindow(const MessageWindow&) = delete; 40*6777b538SAndroid Build Coastguard Worker MessageWindow& operator=(const MessageWindow&) = delete; 41*6777b538SAndroid Build Coastguard Worker 42*6777b538SAndroid Build Coastguard Worker ~MessageWindow(); 43*6777b538SAndroid Build Coastguard Worker 44*6777b538SAndroid Build Coastguard Worker // Creates a message-only window. The incoming messages will be passed by 45*6777b538SAndroid Build Coastguard Worker // |message_callback|. |message_callback| must outlive |this|. 46*6777b538SAndroid Build Coastguard Worker bool Create(MessageCallback message_callback); 47*6777b538SAndroid Build Coastguard Worker 48*6777b538SAndroid Build Coastguard Worker // Same as Create() but assigns the name to the created window. 49*6777b538SAndroid Build Coastguard Worker bool CreateNamed(MessageCallback message_callback, 50*6777b538SAndroid Build Coastguard Worker const std::wstring& window_name); 51*6777b538SAndroid Build Coastguard Worker hwnd()52*6777b538SAndroid Build Coastguard Worker HWND hwnd() const { return window_; } 53*6777b538SAndroid Build Coastguard Worker 54*6777b538SAndroid Build Coastguard Worker // Retrieves a handle of the first message-only window with matching 55*6777b538SAndroid Build Coastguard Worker // |window_name|. 56*6777b538SAndroid Build Coastguard Worker static HWND FindWindow(const std::wstring& window_name); 57*6777b538SAndroid Build Coastguard Worker 58*6777b538SAndroid Build Coastguard Worker private: 59*6777b538SAndroid Build Coastguard Worker // Give |WindowClass| access to WindowProc(). 60*6777b538SAndroid Build Coastguard Worker friend class WindowClass; 61*6777b538SAndroid Build Coastguard Worker 62*6777b538SAndroid Build Coastguard Worker // Contains the actual window creation code. 63*6777b538SAndroid Build Coastguard Worker bool DoCreate(MessageCallback message_callback, const wchar_t* window_name); 64*6777b538SAndroid Build Coastguard Worker 65*6777b538SAndroid Build Coastguard Worker // Invoked by the OS to process incoming window messages. 66*6777b538SAndroid Build Coastguard Worker static LRESULT CALLBACK WindowProc(HWND hwnd, 67*6777b538SAndroid Build Coastguard Worker UINT message, 68*6777b538SAndroid Build Coastguard Worker WPARAM wparam, 69*6777b538SAndroid Build Coastguard Worker LPARAM lparam); 70*6777b538SAndroid Build Coastguard Worker 71*6777b538SAndroid Build Coastguard Worker // Invoked to handle messages received by the window. 72*6777b538SAndroid Build Coastguard Worker MessageCallback message_callback_; 73*6777b538SAndroid Build Coastguard Worker 74*6777b538SAndroid Build Coastguard Worker // Handle of the input window. 75*6777b538SAndroid Build Coastguard Worker HWND window_ = nullptr; 76*6777b538SAndroid Build Coastguard Worker 77*6777b538SAndroid Build Coastguard Worker THREAD_CHECKER(thread_checker_); 78*6777b538SAndroid Build Coastguard Worker }; 79*6777b538SAndroid Build Coastguard Worker 80*6777b538SAndroid Build Coastguard Worker } // namespace win 81*6777b538SAndroid Build Coastguard Worker } // namespace base 82*6777b538SAndroid Build Coastguard Worker 83*6777b538SAndroid Build Coastguard Worker #endif // BASE_WIN_MESSAGE_WINDOW_H_ 84