Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(247)

Unified Diff: components/keyboard_lock/platform_key_hook_win.cc

Issue 2879033002: Keyboard Lock Host implementation
Patch Set: Remove useless files Created 3 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: components/keyboard_lock/platform_key_hook_win.cc
diff --git a/components/keyboard_lock/platform_key_hook_win.cc b/components/keyboard_lock/platform_key_hook_win.cc
new file mode 100644
index 0000000000000000000000000000000000000000..1a00e58a516a32df6849112f3eabad1bfe6cc381
--- /dev/null
+++ b/components/keyboard_lock/platform_key_hook_win.cc
@@ -0,0 +1,111 @@
+// 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 "components/keyboard_lock/platform_key_hook.h"
+
+#include <windows.h>
+
+#include <utility>
+
+#include "base/bind.h"
+#include "base/callback.h"
+#include "base/logging.h"
+#include "components/keyboard_lock/register_once_key_hook.h"
+#include "ui/events/platform/platform_event_types.h"
+
+namespace {
+
+class WinKeyHook final : public keyboard_lock::RegisterOnceKeyHook {
+ public:
+ WinKeyHook(base::Callback<bool(const ui::PlatformEvent&)>&& callback);
+ ~WinKeyHook() = default;
+
+ static WinKeyHook* instance();
+
+ private:
+ static LRESULT ProcessKeyEvent(int code, WPARAM w_param, LPARAM l_param);
+ bool Register() override;
+ bool Unregister() override;
+
+ static WinKeyHook* me;
+ const base::Callback<bool(const ui::PlatformEvent&)> callback_;
+ HHOOK hook_ = nullptr;
+};
+
+// static
+WinKeyHook* WinKeyHook::me = nullptr;
+
+WinKeyHook::WinKeyHook(
+ base::Callback<bool(const ui::PlatformEvent&)>&& callback)
+ : callback_(std::move(callback)) {
+ DCHECK(callback_);
+ DCHECK(me == nullptr);
+ me = this;
+}
+
+// static
+WinKeyHook* WinKeyHook::instance() {
+ return me;
+}
+
+bool WinKeyHook::Register() {
+ LOG(ERROR) << "Going to SetWindowsHookEx";
+ hook_ = SetWindowsHookEx(
+ WH_KEYBOARD_LL,
+ static_cast<HOOKPROC>(&WinKeyHook::ProcessKeyEvent),
+ NULL,
+ NULL);
+ return hook_ != NULL;
+}
+
+bool WinKeyHook::Unregister() {
+ LOG(ERROR) << "Going to UnhookWindowsHookEx";
+ if (hook_) {
+ return UnhookWindowsHookEx(hook_) != 0;
+ }
+ return true;
+}
+
+// static
+LRESULT WinKeyHook::ProcessKeyEvent(int code, WPARAM w_param, LPARAM l_param) {
+ DCHECK(me);
+ KBDLLHOOKSTRUCT* ll_hooks = reinterpret_cast<KBDLLHOOKSTRUCT*>(l_param);
+ MSG msg = { nullptr,
+ w_param,
+ ll_hooks->vkCode,
+ (ll_hooks->scanCode << 16) | (ll_hooks->flags & 0xFFFF),
+ ll_hooks->time };
+ if (code == 0 && me->callback_.Run(msg)) {
+ return 1;
+ }
+ return CallNextHookEx(nullptr, code, w_param, l_param);
+}
+
+} // namespace
+
+namespace keyboard_lock {
+
+PlatformKeyHook::PlatformKeyHook(Browser* owner, KeyEventFilter* filter)
+ : owner_(owner),
+ filter_(filter) {
+ if (!WinKeyHook::instance()) {
+ new WinKeyHook(base::Bind(&PlatformKeyEventFilter::OnPlatformEvent,
+ base::Unretained(&filter_)));
+ }
+}
+
+PlatformKeyHook::~PlatformKeyHook() = default;
+
+bool PlatformKeyHook::RegisterKey(const std::vector<ui::KeyboardCode>& codes) {
+ LOG(ERROR) << "Register " << codes.size() << " key codes";
+ return WinKeyHook::instance()->RegisterKey(codes);
+}
+
+bool PlatformKeyHook::UnregisterKey(
+ const std::vector<ui::KeyboardCode>& codes) {
+ LOG(ERROR) << "Unregister " << codes.size() << " key codes";
+ return WinKeyHook::instance()->UnregisterKey(codes);
+}
+
+} // namespace keyboard_lock
« no previous file with comments | « components/keyboard_lock/platform_key_hook_null.cc ('k') | components/keyboard_lock/platform_key_hook_x11.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698