1// Copyright 2013 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 BASE_WIN_MESSAGE_WINDOW_H_
6#define BASE_WIN_MESSAGE_WINDOW_H_
7
8#include <windows.h>
9
10#include "base/base_export.h"
11#include "base/basictypes.h"
12#include "base/callback.h"
13#include "base/compiler_specific.h"
14#include "base/strings/string16.h"
15#include "base/threading/non_thread_safe.h"
16
17namespace base {
18namespace win {
19
20// Implements a message-only window.
21class BASE_EXPORT MessageWindow : public base::NonThreadSafe {
22 public:
23  // Used to register a process-wide message window class.
24  class WindowClass;
25
26  // Implement this callback to handle messages received by the message window.
27  // If the callback returns |false|, the first four parameters are passed to
28  // DefWindowProc(). Otherwise, |*result| is returned by the window procedure.
29  typedef base::Callback<bool(UINT message,
30                              WPARAM wparam,
31                              LPARAM lparam,
32                              LRESULT* result)> MessageCallback;
33
34  MessageWindow();
35  ~MessageWindow();
36
37  // Creates a message-only window. The incoming messages will be passed by
38  // |message_callback|. |message_callback| must outlive |this|.
39  bool Create(const MessageCallback& message_callback);
40
41  // Same as Create() but assigns the name to the created window.
42  bool CreateNamed(const MessageCallback& message_callback,
43                   const string16& window_name);
44
45  HWND hwnd() const { return window_; }
46
47  // Retrieves a handle of the first message-only window with matching
48  // |window_name|.
49  static HWND FindWindow(const string16& window_name);
50
51 private:
52  // Give |WindowClass| access to WindowProc().
53  friend class WindowClass;
54
55  // Contains the actual window creation code.
56  bool DoCreate(const MessageCallback& message_callback,
57                const wchar_t* window_name);
58
59  // Invoked by the OS to process incoming window messages.
60  static LRESULT CALLBACK WindowProc(HWND hwnd, UINT message, WPARAM wparam,
61                                     LPARAM lparam);
62
63  // Invoked to handle messages received by the window.
64  MessageCallback message_callback_;
65
66  // Handle of the input window.
67  HWND window_;
68
69  DISALLOW_COPY_AND_ASSIGN(MessageWindow);
70};
71
72}  // namespace win
73}  // namespace base
74
75#endif  // BASE_WIN_MESSAGE_WINDOW_H_
76