-
Notifications
You must be signed in to change notification settings - Fork 10
/
apputils.cpp
114 lines (89 loc) · 2.48 KB
/
apputils.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
#include "stdafx.h"
#include "util.h"
#include "options.h"
#include "apputils.h"
HWINEVENTHOOK EventHookWindowCreationMonitor::hook = 0;
HWND EventHookWindowCreationMonitor::wnd = 0;
int EventHookWindowCreationMonitor::msgId = 0;
void PendingWindows::add(HWND wnd)
{
Entry entry(wnd, GetTickCount());
entries.push_back(entry);
}
void PendingWindows::check(HWND wnd, const Options& opt)
{
for (int n = entries.size()-1; n >= 0; --n) {
if (timeToChkWnd(entries[n].time, opt)) {
if (checkWnd(entries[n].wnd, opt))
Util::App::pinWindow(wnd, entries[n].wnd, opt.trackRate.value, true);
entries.erase(entries.begin() + n);
}
}
}
bool PendingWindows::timeToChkWnd(DWORD t, const Options& opt)
{
// ticks are unsigned, so wrap-around is ok
return GetTickCount() - t >= DWORD(opt.autoPinDelay.value);
}
bool PendingWindows::checkWnd(HWND target, const Options& opt)
{
for (int n = 0; n < int(opt.autoPinRules.size()); ++n)
if (opt.autoPinRules[n].match(target))
return true;
return false;
}
bool EventHookWindowCreationMonitor::init(HWND wnd, int msgId)
{
if (!hook) {
hook = SetWinEventHook(EVENT_OBJECT_CREATE, EVENT_OBJECT_CREATE,
0, proc, 0, 0, WINEVENT_OUTOFCONTEXT);
if (hook) {
this->wnd = wnd;
this->msgId = msgId;
}
}
return hook != 0;
}
bool EventHookWindowCreationMonitor::term()
{
if (hook && UnhookWinEvent(hook)) {
hook = 0;
}
return !hook;
}
VOID CALLBACK EventHookWindowCreationMonitor::proc(HWINEVENTHOOK hook, DWORD event,
HWND hwnd, LONG idObject, LONG idChild, DWORD dwEventThread, DWORD dwmsEventTime)
{
if (hook == EventHookWindowCreationMonitor::hook &&
event == EVENT_OBJECT_CREATE &&
idObject == OBJID_WINDOW)
{
PostMessage(wnd, msgId, (WPARAM)hwnd, 0);
}
}
bool HookDllWindowCreationMonitor::init(HWND wnd, int msgId)
{
if (!dll) {
dll = LoadLibrary(L"dphook.dll");
if (!dll)
return false;
}
dllInitFunc = initF(GetProcAddress(dll, "init"));
dllTermFunc = termF(GetProcAddress(dll, "term"));
if (!dllInitFunc || !dllTermFunc) {
term();
return false;
}
return dllInitFunc(wnd, msgId);
}
bool HookDllWindowCreationMonitor::term()
{
if (!dll)
return true;
if (dllTermFunc)
dllTermFunc();
bool ok = !!FreeLibrary(dll);
if (ok)
dll = 0;
return ok;
}