1
////////////////////////////////////////////////////////////////
2
// 2000 Microsoft Systems Journal.
3
// If this program works, it was written by Paul DiLascia.
4
// If not, I don't know who wrote it.
5
// This program compiles with Visual C++ 6.0 on Windows 98
14
#define DLLEXPORT __declspec(dllexport)
19
static char THIS_FILE[] = __FILE__;
23
// The following global data is SHARED among all instances of the DLL
24
// (processes); i.e., these are system-wide globals.
26
#pragma data_seg (".IdleUI") // you must define as SHARED in .def
28
HHOOK g_keyboardHook = NULL; // one instance for all processes
29
HHOOK g_mouseHook = NULL; // one instance for all processes
30
DWORD g_lastInputTick = 0; // tick time of last input event
40
Flag indicating whether the DLL's owning process is the loading DLL.
42
bool g_isHandleOwner = false;
49
// Initialize DLL: install kbd/mouse hooks.
51
DLLEXPORT BOOL IdleUIInit()
57
// Terminate DLL: remove hooks.
59
DLLEXPORT void IdleUITerm()
64
// Get tick count of last keyboard or mouse event
66
DLLEXPORT DWORD IdleUIGetLastInputTime()
68
return g_lastInputTick;
76
// Keyboard hook: record tick count
78
LRESULT CALLBACK keyboardHookCallback(int code, WPARAM wParam, LPARAM lParam)
80
if (code == HC_ACTION)
82
g_lastInputTick = GetTickCount();
84
return ::CallNextHookEx(g_keyboardHook, code, wParam, lParam);
88
// Mouse hook: record tick count
90
LRESULT CALLBACK mouseHookCallback(int code, WPARAM wParam, LPARAM lParam)
92
if (code == HC_ACTION)
94
// Update timestamp if event indicates mouse action
96
if (wParam == WM_MOUSEMOVE && lParam != 0)
98
PMOUSEHOOKSTRUCT mhs = (PMOUSEHOOKSTRUCT) lParam;
99
if (mhs->pt.x != g_lastMousePos.x ||
100
mhs->pt.y != g_lastMousePos.y)
103
g_lastMousePos = mhs->pt;
112
g_lastInputTick = GetTickCount();
115
return ::CallNextHookEx(g_mouseHook, code, wParam, lParam);
118
void initialize(HINSTANCE module)
120
if (g_keyboardHook == 0)
122
g_keyboardHook = SetWindowsHookEx(WH_KEYBOARD, keyboardHookCallback, module, 0);
123
g_mouseHook = SetWindowsHookEx(WH_MOUSE, mouseHookCallback, module, 0);
124
g_lastInputTick = GetTickCount();
125
g_isHandleOwner = true;
127
assert(g_keyboardHook);
133
// Only handle-owning process may unhook
136
if (g_keyboardHook != 0)
138
UnhookWindowsHookEx(g_keyboardHook);
141
if (g_mouseHook != 0)
143
UnhookWindowsHookEx(g_mouseHook);
153
BOOL WINAPI DllMain(HINSTANCE module, DWORD reason, LPVOID reserved)
157
case DLL_PROCESS_ATTACH:
162
case DLL_PROCESS_DETACH:
167
case DLL_THREAD_ATTACH:
168
case DLL_THREAD_DETACH: