diff options
Diffstat (limited to 'chromium/tools/win/chromeexts/commands/hwnd_command.cc')
-rw-r--r-- | chromium/tools/win/chromeexts/commands/hwnd_command.cc | 68 |
1 files changed, 68 insertions, 0 deletions
diff --git a/chromium/tools/win/chromeexts/commands/hwnd_command.cc b/chromium/tools/win/chromeexts/commands/hwnd_command.cc new file mode 100644 index 00000000000..7fb914171a6 --- /dev/null +++ b/chromium/tools/win/chromeexts/commands/hwnd_command.cc @@ -0,0 +1,68 @@ +// Copyright 2017 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. + +#include "tools/win/chromeexts/commands/hwnd_command.h" + +#include <dbgeng.h> +#include <windows.h> + +namespace tools { +namespace win { +namespace chromeexts { + +namespace { +constexpr size_t kMaxWindowStringLength = 256; +} // namespace + +HwndCommand::HwndCommand() = default; + +HwndCommand::~HwndCommand() = default; + +HRESULT HwndCommand::Execute() { + // While sizeof(HWND) can change between 32-bit and 64-bit platforms, Windows + // only cares about the lower 32-bits. We evaluate as 64-bit as a convenience + // and truncate the displayed hwnds to 32-bit below. + // See https://msdn.microsoft.com/en-us/library/aa384203.aspx + DEBUG_VALUE value; + HRESULT hr = debug_control()->Evaluate(args().c_str(), DEBUG_VALUE_INT64, + &value, nullptr); + if (FAILED(hr)) { + PrintErrorf("Unable to evaluate %s\n", args().c_str()); + return hr; + } + + HWND hwnd = reinterpret_cast<HWND>(value.I64); + if (!IsWindow(hwnd)) { + PrintErrorf("Not a window: %s\n", args().c_str()); + return E_FAIL; + } + + wchar_t title[kMaxWindowStringLength]; + GetWindowText(hwnd, title, ARRAYSIZE(title)); + Printf("Title: %ws\n", title); + wchar_t window_class[kMaxWindowStringLength]; + GetClassName(hwnd, window_class, ARRAYSIZE(window_class)); + Printf("Class: %ws\n", window_class); + Printf("Hierarchy: \n"); + Printf(" Owner: %08x Parent: %08x\n", GetWindow(hwnd, GW_OWNER), + GetParent(hwnd)); + Printf(" Prev: %08x Next: %08x\n", GetNextWindow(hwnd, GW_HWNDPREV), + GetNextWindow(hwnd, GW_HWNDNEXT)); + Printf("Styles: %08x (Ex: %08x)\n", GetWindowLong(hwnd, GWL_STYLE), + GetWindowLong(hwnd, GWL_EXSTYLE)); + RECT window_rect; + if (GetWindowRect(hwnd, &window_rect)) { + Printf("Bounds: (%d, %d) %dx%d\n", window_rect.left, window_rect.top, + window_rect.right - window_rect.left, + window_rect.bottom - window_rect.top); + } else { + DWORD last_error = GetLastError(); + PrintErrorf("Bounds: Unavailable (Last Error = %d)\n", last_error); + } + return S_OK; +} + +} // namespace chromeexts +} // namespace win +} // namespace tools |