// 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 #include "base/base_export.h" #include "base/callback.h" #include "base/compiler_specific.h" #include "base/threading/thread_checker.h" #include "base/win/windows_types.h" // Protect against windows.h being included before this header. #undef FindWindow 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; // NOLINT MessageWindow(); MessageWindow(const MessageWindow&) = delete; MessageWindow& operator=(const MessageWindow&) = delete; ~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 std::wstring& window_name); HWND hwnd() const { return window_; } // Retrieves a handle of the first message-only window with matching // |window_name|. static HWND FindWindow(const std::wstring& 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_ = nullptr; THREAD_CHECKER(thread_checker_); }; } // namespace win } // namespace base #endif // BASE_WIN_MESSAGE_WINDOW_H_