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.
5 #include "remoting/host/win/message_window.h"
7 #include "base/logging.h"
8 #include "base/process_util.h"
9 #include "base/stringprintf.h"
10 #include "base/utf_string_conversions.h"
11 #include "base/win/wrapped_window_proc.h"
13 const char kClassNameFormat
[] = "Chromoting_MessageWindow_%p";
18 MessageWindow::MessageWindow()
22 class_name_
= base::StringPrintf(kClassNameFormat
, this);
23 instance_
= base::GetModuleFromAddress(static_cast<WNDPROC
>(
24 &base::win::WrappedWindowProc
<WindowProc
>));
27 MessageWindow::MessageWindow(const std::string
& class_name
, HINSTANCE instance
)
29 class_name_(class_name
),
34 MessageWindow::~MessageWindow() {
35 DCHECK(CalledOnValidThread());
37 if (window_
!= NULL
) {
38 DestroyWindow(window_
);
43 UnregisterClass(MAKEINTATOM(atom_
), instance_
);
48 bool MessageWindow::Create(Delegate
* delegate
) {
49 DCHECK(CalledOnValidThread());
53 // Register a separate window class for each instance of |MessageWindow|.
54 string16 class_name
= UTF8ToUTF16(class_name_
);
55 WNDCLASSEX window_class
;
56 window_class
.cbSize
= sizeof(window_class
);
57 window_class
.style
= 0;
58 window_class
.lpfnWndProc
= &base::win::WrappedWindowProc
<WindowProc
>;
59 window_class
.cbClsExtra
= 0;
60 window_class
.cbWndExtra
= 0;
61 window_class
.hInstance
= instance_
;
62 window_class
.hIcon
= NULL
;
63 window_class
.hCursor
= NULL
;
64 window_class
.hbrBackground
= NULL
;
65 window_class
.lpszMenuName
= NULL
;
66 window_class
.lpszClassName
= class_name
.c_str();
67 window_class
.hIconSm
= NULL
;
68 atom_
= RegisterClassEx(&window_class
);
70 LOG_GETLASTERROR(ERROR
)
71 << "Failed to register the window class '" << class_name_
<< "'";
75 window_
= CreateWindow(MAKEINTATOM(atom_
), 0, 0, 0, 0, 0, 0, HWND_MESSAGE
, 0,
78 LOG_GETLASTERROR(ERROR
) << "Failed to create a message-only window";
86 LRESULT CALLBACK
MessageWindow::WindowProc(HWND hwnd
,
90 Delegate
* delegate
= NULL
;
92 // Set up the delegate before handling WM_CREATE.
93 if (message
== WM_CREATE
) {
94 CREATESTRUCT
* cs
= reinterpret_cast<CREATESTRUCT
*>(lparam
);
95 delegate
= reinterpret_cast<Delegate
*>(cs
->lpCreateParams
);
97 // Store pointer to the delegate to the window's user data.
98 SetLastError(ERROR_SUCCESS
);
99 LONG_PTR result
= SetWindowLongPtr(
100 hwnd
, GWLP_USERDATA
, reinterpret_cast<LONG_PTR
>(delegate
));
101 CHECK(result
!= 0 || GetLastError() == ERROR_SUCCESS
);
103 delegate
= reinterpret_cast<Delegate
*>(GetWindowLongPtr(hwnd
,
107 // Handle the message.
109 LRESULT message_result
;
110 if (delegate
->HandleMessage(hwnd
, message
, wparam
, lparam
, &message_result
))
111 return message_result
;
114 return DefWindowProc(hwnd
, message
, wparam
, lparam
);
118 } // namespace remoting