|  | // Copyright 2013 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 BASE_WIN_MESSAGE_WINDOW_H_ | 
|  | #define BASE_WIN_MESSAGE_WINDOW_H_ | 
|  |  | 
|  | #include <windows.h> | 
|  |  | 
|  | #include "base/base_export.h" | 
|  | #include "base/callback.h" | 
|  | #include "base/compiler_specific.h" | 
|  | #include "base/macros.h" | 
|  | #include "base/strings/string16.h" | 
|  | #include "base/threading/thread_checker.h" | 
|  |  | 
|  | namespace base { | 
|  | namespace win { | 
|  |  | 
|  | // Implements a message-only window. | 
|  | class BASE_EXPORT MessageWindow { | 
|  | public: | 
|  | // Used to register a process-wide message window class. | 
|  | class WindowClass; | 
|  |  | 
|  | // Implement this callback to handle messages received by the message window. | 
|  | // If the callback returns |false|, the first four parameters are passed to | 
|  | // DefWindowProc(). Otherwise, |*result| is returned by the window procedure. | 
|  | using MessageCallback = base::RepeatingCallback< | 
|  | bool(UINT message, WPARAM wparam, LPARAM lparam, LRESULT* result)>; | 
|  |  | 
|  | MessageWindow(); | 
|  | ~MessageWindow(); | 
|  |  | 
|  | // Creates a message-only window. The incoming messages will be passed by | 
|  | // |message_callback|. |message_callback| must outlive |this|. | 
|  | bool Create(MessageCallback message_callback); | 
|  |  | 
|  | // Same as Create() but assigns the name to the created window. | 
|  | bool CreateNamed(MessageCallback message_callback, | 
|  | const string16& window_name); | 
|  |  | 
|  | HWND hwnd() const { return window_; } | 
|  |  | 
|  | // Retrieves a handle of the first message-only window with matching | 
|  | // |window_name|. | 
|  | static HWND FindWindow(const string16& window_name); | 
|  |  | 
|  | private: | 
|  | // Give |WindowClass| access to WindowProc(). | 
|  | friend class WindowClass; | 
|  |  | 
|  | // Contains the actual window creation code. | 
|  | bool DoCreate(MessageCallback message_callback, const wchar_t* window_name); | 
|  |  | 
|  | // Invoked by the OS to process incoming window messages. | 
|  | static LRESULT CALLBACK WindowProc(HWND hwnd, UINT message, WPARAM wparam, | 
|  | LPARAM lparam); | 
|  |  | 
|  | // Invoked to handle messages received by the window. | 
|  | MessageCallback message_callback_; | 
|  |  | 
|  | // Handle of the input window. | 
|  | HWND window_; | 
|  |  | 
|  | THREAD_CHECKER(thread_checker_); | 
|  |  | 
|  | DISALLOW_COPY_AND_ASSIGN(MessageWindow); | 
|  | }; | 
|  |  | 
|  | }  // namespace win | 
|  | }  // namespace base | 
|  |  | 
|  | #endif  // BASE_WIN_MESSAGE_WINDOW_H_ |