Merge pull request #3231 from omrilitov/master
Hooking windows messages
This commit is contained in:
commit
142f380376
7 changed files with 102 additions and 0 deletions
|
@ -189,6 +189,14 @@ void Window::OnExecuteWindowsCommand(const std::string& command_name) {
|
||||||
Emit("app-command", command_name);
|
Emit("app-command", command_name);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if defined(OS_WIN)
|
||||||
|
void Window::OnWindowMessage(UINT message, WPARAM w_param, LPARAM l_param) {
|
||||||
|
if (IsWindowMessageHooked(message)) {
|
||||||
|
messages_callback_map_[message].Run(w_param, l_param);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
// static
|
// static
|
||||||
mate::Wrappable* Window::New(v8::Isolate* isolate,
|
mate::Wrappable* Window::New(v8::Isolate* isolate,
|
||||||
const mate::Dictionary& options) {
|
const mate::Dictionary& options) {
|
||||||
|
@ -492,6 +500,29 @@ bool Window::IsMenuBarVisible() {
|
||||||
return window_->IsMenuBarVisible();
|
return window_->IsMenuBarVisible();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if defined(OS_WIN)
|
||||||
|
bool Window::HookWindowMessage(UINT message,
|
||||||
|
const MessageCallback& callback) {
|
||||||
|
messages_callback_map_[message] = callback;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Window::UnhookWindowMessage(UINT message) {
|
||||||
|
if (!ContainsKey(messages_callback_map_, message))
|
||||||
|
return;
|
||||||
|
|
||||||
|
messages_callback_map_.erase(message);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Window::IsWindowMessageHooked(UINT message) {
|
||||||
|
return ContainsKey(messages_callback_map_, message);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Window::UnhookAllWindowMessages() {
|
||||||
|
messages_callback_map_.clear();
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
#if defined(OS_MACOSX)
|
#if defined(OS_MACOSX)
|
||||||
void Window::ShowDefinitionForSelection() {
|
void Window::ShowDefinitionForSelection() {
|
||||||
window_->ShowDefinitionForSelection();
|
window_->ShowDefinitionForSelection();
|
||||||
|
@ -590,6 +621,12 @@ void Window::BuildPrototype(v8::Isolate* isolate,
|
||||||
&Window::SetVisibleOnAllWorkspaces)
|
&Window::SetVisibleOnAllWorkspaces)
|
||||||
.SetMethod("isVisibleOnAllWorkspaces",
|
.SetMethod("isVisibleOnAllWorkspaces",
|
||||||
&Window::IsVisibleOnAllWorkspaces)
|
&Window::IsVisibleOnAllWorkspaces)
|
||||||
|
#if defined(OS_WIN)
|
||||||
|
.SetMethod("hookWindowMessage", &Window::HookWindowMessage)
|
||||||
|
.SetMethod("isWindowMessageHooked", &Window::IsWindowMessageHooked)
|
||||||
|
.SetMethod("unhookWindowMessage", &Window::UnhookWindowMessage)
|
||||||
|
.SetMethod("unhookAllWindowMessages", &Window::UnhookAllWindowMessages)
|
||||||
|
#endif
|
||||||
#if defined(OS_MACOSX)
|
#if defined(OS_MACOSX)
|
||||||
.SetMethod("showDefinitionForSelection",
|
.SetMethod("showDefinitionForSelection",
|
||||||
&Window::ShowDefinitionForSelection)
|
&Window::ShowDefinitionForSelection)
|
||||||
|
|
|
@ -5,6 +5,7 @@
|
||||||
#ifndef ATOM_BROWSER_API_ATOM_API_WINDOW_H_
|
#ifndef ATOM_BROWSER_API_ATOM_API_WINDOW_H_
|
||||||
#define ATOM_BROWSER_API_ATOM_API_WINDOW_H_
|
#define ATOM_BROWSER_API_ATOM_API_WINDOW_H_
|
||||||
|
|
||||||
|
#include <map>
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
|
@ -75,6 +76,11 @@ class Window : public mate::TrackableObject<Window>,
|
||||||
void OnRendererResponsive() override;
|
void OnRendererResponsive() override;
|
||||||
void OnExecuteWindowsCommand(const std::string& command_name) override;
|
void OnExecuteWindowsCommand(const std::string& command_name) override;
|
||||||
|
|
||||||
|
#if defined(OS_WIN)
|
||||||
|
void OnWindowMessage(UINT message, WPARAM w_param,
|
||||||
|
LPARAM l_param) override;
|
||||||
|
#endif
|
||||||
|
|
||||||
// mate::Wrappable:
|
// mate::Wrappable:
|
||||||
bool IsDestroyed() const override;
|
bool IsDestroyed() const override;
|
||||||
|
|
||||||
|
@ -143,6 +149,18 @@ class Window : public mate::TrackableObject<Window>,
|
||||||
bool IsMenuBarVisible();
|
bool IsMenuBarVisible();
|
||||||
void SetAspectRatio(double aspect_ratio, mate::Arguments* args);
|
void SetAspectRatio(double aspect_ratio, mate::Arguments* args);
|
||||||
|
|
||||||
|
#if defined(OS_WIN)
|
||||||
|
typedef base::Callback<void(WPARAM, LPARAM)> MessageCallback;
|
||||||
|
typedef std::map<UINT, MessageCallback> MessageCallbackMap;
|
||||||
|
MessageCallbackMap messages_callback_map_;
|
||||||
|
|
||||||
|
bool HookWindowMessage(UINT message,
|
||||||
|
const MessageCallback& callback);
|
||||||
|
bool IsWindowMessageHooked(UINT message);
|
||||||
|
void UnhookWindowMessage(UINT message);
|
||||||
|
void UnhookAllWindowMessages();
|
||||||
|
#endif
|
||||||
|
|
||||||
#if defined(OS_MACOSX)
|
#if defined(OS_MACOSX)
|
||||||
void ShowDefinitionForSelection();
|
void ShowDefinitionForSelection();
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -464,6 +464,14 @@ void NativeWindow::NotifyWindowExecuteWindowsCommand(
|
||||||
OnExecuteWindowsCommand(command));
|
OnExecuteWindowsCommand(command));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if defined(OS_WIN)
|
||||||
|
void NativeWindow::NotifyWindowMessage(UINT message, WPARAM w_param,
|
||||||
|
LPARAM l_param) {
|
||||||
|
FOR_EACH_OBSERVER(NativeWindowObserver, observers_,
|
||||||
|
OnWindowMessage(message, w_param, l_param));
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
scoped_ptr<SkRegion> NativeWindow::DraggableRegionsToSkRegion(
|
scoped_ptr<SkRegion> NativeWindow::DraggableRegionsToSkRegion(
|
||||||
const std::vector<DraggableRegion>& regions) {
|
const std::vector<DraggableRegion>& regions) {
|
||||||
scoped_ptr<SkRegion> sk_region(new SkRegion);
|
scoped_ptr<SkRegion> sk_region(new SkRegion);
|
||||||
|
|
|
@ -210,6 +210,10 @@ class NativeWindow : public base::SupportsUserData,
|
||||||
void NotifyWindowLeaveHtmlFullScreen();
|
void NotifyWindowLeaveHtmlFullScreen();
|
||||||
void NotifyWindowExecuteWindowsCommand(const std::string& command);
|
void NotifyWindowExecuteWindowsCommand(const std::string& command);
|
||||||
|
|
||||||
|
#if defined(OS_WIN)
|
||||||
|
void NotifyWindowMessage(UINT message, WPARAM w_param, LPARAM l_param);
|
||||||
|
#endif
|
||||||
|
|
||||||
void AddObserver(NativeWindowObserver* obs) {
|
void AddObserver(NativeWindowObserver* obs) {
|
||||||
observers_.AddObserver(obs);
|
observers_.AddObserver(obs);
|
||||||
}
|
}
|
||||||
|
|
|
@ -11,6 +11,10 @@
|
||||||
#include "ui/base/window_open_disposition.h"
|
#include "ui/base/window_open_disposition.h"
|
||||||
#include "url/gurl.h"
|
#include "url/gurl.h"
|
||||||
|
|
||||||
|
#if defined(OS_WIN)
|
||||||
|
#include <windows.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
namespace atom {
|
namespace atom {
|
||||||
|
|
||||||
class NativeWindowObserver {
|
class NativeWindowObserver {
|
||||||
|
@ -55,6 +59,11 @@ class NativeWindowObserver {
|
||||||
virtual void OnWindowEnterHtmlFullScreen() {}
|
virtual void OnWindowEnterHtmlFullScreen() {}
|
||||||
virtual void OnWindowLeaveHtmlFullScreen() {}
|
virtual void OnWindowLeaveHtmlFullScreen() {}
|
||||||
|
|
||||||
|
// Called when window message received
|
||||||
|
#if defined(OS_WIN)
|
||||||
|
virtual void OnWindowMessage(UINT message, WPARAM w_param, LPARAM l_param) {}
|
||||||
|
#endif
|
||||||
|
|
||||||
// Called when renderer is hung.
|
// Called when renderer is hung.
|
||||||
virtual void OnRendererUnresponsive() {}
|
virtual void OnRendererUnresponsive() {}
|
||||||
|
|
||||||
|
|
|
@ -80,6 +80,8 @@ bool NativeWindowViews::ExecuteWindowsCommand(int command_id) {
|
||||||
|
|
||||||
bool NativeWindowViews::PreHandleMSG(
|
bool NativeWindowViews::PreHandleMSG(
|
||||||
UINT message, WPARAM w_param, LPARAM l_param, LRESULT* result) {
|
UINT message, WPARAM w_param, LPARAM l_param, LRESULT* result) {
|
||||||
|
NotifyWindowMessage(message, w_param, l_param);
|
||||||
|
|
||||||
switch (message) {
|
switch (message) {
|
||||||
case WM_COMMAND:
|
case WM_COMMAND:
|
||||||
// Handle thumbar button click message.
|
// Handle thumbar button click message.
|
||||||
|
|
|
@ -552,6 +552,30 @@ Enters or leaves the kiosk mode.
|
||||||
|
|
||||||
Returns whether the window is in kiosk mode.
|
Returns whether the window is in kiosk mode.
|
||||||
|
|
||||||
|
### `win.hookWindowMessage(message, callback)` _WINDOWS_
|
||||||
|
|
||||||
|
* `message` Integer
|
||||||
|
* `callback` Function
|
||||||
|
|
||||||
|
Hooks a windows message. The `callback` is called when
|
||||||
|
the message is received in the WndProc.
|
||||||
|
|
||||||
|
### `win.isWindowMessageHooked(message)` _WINDOWS_
|
||||||
|
|
||||||
|
* `message` Integer
|
||||||
|
|
||||||
|
Returns `true` or `false` depending on whether the message is hooked.
|
||||||
|
|
||||||
|
### `win.unhookWindowMessage(message)` _WINDOWS_
|
||||||
|
|
||||||
|
* `message` Integer
|
||||||
|
|
||||||
|
Unhook the window message.
|
||||||
|
|
||||||
|
### `win.unhookAllWindowMessages()` _WINDOWS_
|
||||||
|
|
||||||
|
Unhooks all of the window messages.
|
||||||
|
|
||||||
### `win.setRepresentedFilename(filename)` _OS X_
|
### `win.setRepresentedFilename(filename)` _OS X_
|
||||||
|
|
||||||
* `filename` String
|
* `filename` String
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue