summaryrefslogtreecommitdiff
path: root/chromium/tools/win/chromeexts/commands/hwnd_command.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/tools/win/chromeexts/commands/hwnd_command.cc')
-rw-r--r--chromium/tools/win/chromeexts/commands/hwnd_command.cc68
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