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
13
#define DLLEXPORT __declspec(dllexport)
18
static char THIS_FILE[] = __FILE__;
23
int WINAPI DllMain(HINSTANCE hinst, unsigned long reason, void*)
30
// The following global data is SHARED among all instances of the DLL
31
// (processes); i.e., these are system-wide globals.
33
#pragma data_seg (".IdleUI") // you must define as SHARED in .def
34
HHOOK g_hHookKbd = NULL; // one instance for all processes
35
HHOOK g_hHookMouse = NULL; // one instance for all processes
36
DWORD g_dwLastInputTick = 0; // tick time of last input event
40
// Get tick count of last keyboard or mouse event
42
DLLEXPORT DWORD IdleUIGetLastInputTime()
44
return g_dwLastInputTick;
48
// Keyboard hook: record tick count
50
LRESULT CALLBACK MyKbdHook(int code, WPARAM wParam, LPARAM lParam)
52
if (code==HC_ACTION) {
53
g_dwLastInputTick = GetTickCount();
55
return ::CallNextHookEx(g_hHookKbd, code, wParam, lParam);
59
// Mouse hook: record tick count
61
LRESULT CALLBACK MyMouseHook(int code, WPARAM wParam, LPARAM lParam)
63
if (code==HC_ACTION) {
64
g_dwLastInputTick = GetTickCount();
66
return ::CallNextHookEx(g_hHookMouse, code, wParam, lParam);
70
// Initialize DLL: install kbd/mouse hooks.
72
DLLEXPORT BOOL IdleUIInit()
74
if (g_hHookKbd == NULL) {
75
HINSTANCE hInst = myInstance;
76
g_hHookKbd = SetWindowsHookEx(WH_KEYBOARD, MyKbdHook, hInst, 0);
77
g_hHookMouse = SetWindowsHookEx(WH_MOUSE, MyMouseHook, hInst, 0);
78
g_dwLastInputTick = GetTickCount(); // init count
86
// Terminate DLL: remove hooks.
88
DLLEXPORT void IdleUITerm()
90
BOOL bRet1 = UnhookWindowsHookEx(g_hHookKbd);
91
BOOL bRet2 = UnhookWindowsHookEx(g_hHookMouse);
92
assert(bRet1 && bRet2);