mirror of https://github.com/lianthony/NT4.0
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
187 lines
4.6 KiB
187 lines
4.6 KiB
/*
|
|
* TopHook.c
|
|
*
|
|
* Main module for hook dll for use with TopDesk.exe
|
|
*
|
|
* 2/22/92 Sanford Staab created
|
|
*/
|
|
|
|
#include <windows.h>
|
|
#include <port1632.h>
|
|
#include "tophook.h"
|
|
|
|
HWND hwndHookTopDesk = NULL;
|
|
HWND hwndHookMrShadow = NULL;
|
|
HWND hwndDT = NULL;
|
|
DWORD pidTopDesk = 0xFFFFFFFF;
|
|
DWORD pidMrShadow = 0xFFFFFFFF;
|
|
HHOOK hCBTHookTopDesk = NULL;
|
|
HHOOK hCBTHookMrShadow = NULL;
|
|
UINT wmRefreshMsg = 0;
|
|
|
|
|
|
/*
|
|
* Passes significant window events onto TopDesk for automatic updating
|
|
* and desktop jumping.
|
|
*/
|
|
DWORD FAR PASCAL CBTHookProcTopDesk(
|
|
int code,
|
|
UINT wParam,
|
|
DWORD lParam)
|
|
{
|
|
BOOL fJumpDesktop = FALSE;
|
|
|
|
switch (code) {
|
|
case HCBT_ACTIVATE:
|
|
// wParam = hwndActivating
|
|
// lParam = LPCBTACTIVATESTRUCT
|
|
fJumpDesktop = TRUE;
|
|
|
|
case HCBT_MOVESIZE:
|
|
// wParam = hwndMoving
|
|
// lParam = PRECT
|
|
|
|
case HCBT_CREATEWND:
|
|
// wParam = hwndCreated
|
|
// lParam = LPCBT_CREATEWND
|
|
|
|
case HCBT_DESTROYWND:
|
|
// wParam = hwndDestroyed
|
|
|
|
case HCBT_MINMAX:
|
|
// wParam = hwndMinMax
|
|
// LOWORD(lParam) = SW_*
|
|
|
|
if (IsWindow((HWND)wParam) && // seems to be a bug in the hook
|
|
IsWindow(hwndHookTopDesk) &&
|
|
(HWND)wParam != hwndHookTopDesk) {
|
|
HWND hwndParent = GetParent((HWND)wParam);
|
|
if (hwndParent == hwndDT || hwndParent == NULL) {
|
|
PostMessage(hwndHookTopDesk, wmRefreshMsg, wParam, fJumpDesktop);
|
|
}
|
|
}
|
|
}
|
|
return(CallNextHookEx(hCBTHookTopDesk, code, wParam, lParam));
|
|
}
|
|
|
|
|
|
/*
|
|
* Passes significant window events onto TopDesk for automatic updating
|
|
* and desktop jumping.
|
|
*/
|
|
DWORD FAR PASCAL CBTHookProcMrShadow(
|
|
int code,
|
|
UINT wParam,
|
|
DWORD lParam)
|
|
{
|
|
switch (code) {
|
|
case HCBT_ACTIVATE:
|
|
// wParam = hwndActivating
|
|
// lParam = LPCBTACTIVATESTRUCT
|
|
|
|
case HCBT_MOVESIZE:
|
|
// wParam = hwndMoving
|
|
// lParam = PRECT
|
|
|
|
case HCBT_CREATEWND:
|
|
// wParam = hwndCreated
|
|
// lParam = LPCBT_CREATEWND
|
|
|
|
case HCBT_DESTROYWND:
|
|
// wParam = hwndDestroyed
|
|
|
|
case HCBT_MINMAX:
|
|
// wParam = hwndMinMax
|
|
// LOWORD(lParam) = SW_*
|
|
|
|
if (IsWindow((HWND)wParam) && // seems to be a bug in the hook
|
|
IsWindow(hwndHookMrShadow) &&
|
|
(HWND)wParam != hwndHookMrShadow) {
|
|
HWND hwndParent = GetParent((HWND)wParam);
|
|
if (hwndParent == hwndDT || hwndParent == NULL) {
|
|
PostMessage(hwndHookMrShadow, wmRefreshMsg, wParam, 0);
|
|
}
|
|
}
|
|
}
|
|
return(CallNextHookEx(hCBTHookMrShadow, code, wParam, lParam));
|
|
}
|
|
|
|
|
|
|
|
INT APIENTRY LibMain(
|
|
HANDLE hInst,
|
|
DWORD dwReason,
|
|
LPVOID lpReserved)
|
|
{
|
|
UNREFERENCED_PARAMETER(hInst);
|
|
UNREFERENCED_PARAMETER(lpReserved);
|
|
|
|
if (dwReason == DLL_PROCESS_ATTACH) {
|
|
return(TRUE); // all hooked processes will call us - let them in
|
|
} else if (dwReason == DLL_PROCESS_DETACH) {
|
|
if (pidTopDesk == GetCurrentProcessId()) {
|
|
pidTopDesk = (DWORD)-1;
|
|
UnhookWindowsHookEx(hCBTHookTopDesk);
|
|
}
|
|
if (pidMrShadow == GetCurrentProcessId()) {
|
|
pidMrShadow = (DWORD)-1;
|
|
UnhookWindowsHookEx(hCBTHookMrShadow);
|
|
}
|
|
return(TRUE);
|
|
}
|
|
return(FALSE);
|
|
}
|
|
|
|
|
|
|
|
BOOL FAR PASCAL SetTopDeskHooks(
|
|
HWND hwnd)
|
|
{
|
|
if (pidTopDesk != -1) {
|
|
return(FALSE); // only ONE GUY allowed!
|
|
}
|
|
pidTopDesk = GetCurrentProcessId();
|
|
if (!wmRefreshMsg) {
|
|
wmRefreshMsg = RegisterWindowMessage(szMYWM_REFRESH);
|
|
hwndDT = GetDesktopWindow();
|
|
}
|
|
hwndHookTopDesk = hwnd;
|
|
hCBTHookTopDesk = SetWindowsHookEx(WH_CBT, (HOOKPROC)CBTHookProcTopDesk,
|
|
GetModuleHandle("tophook"), 0);
|
|
return(TRUE);
|
|
}
|
|
|
|
|
|
|
|
BOOL FAR PASCAL SetMrShadowHooks(
|
|
HWND hwnd)
|
|
{
|
|
if (pidMrShadow != -1) {
|
|
return(FALSE); // only ONE GUY allowed!
|
|
}
|
|
pidMrShadow = GetCurrentProcessId();
|
|
if (!wmRefreshMsg) {
|
|
wmRefreshMsg = RegisterWindowMessage(szMYWM_REFRESH);
|
|
hwndDT = GetDesktopWindow();
|
|
}
|
|
hwndHookMrShadow = hwnd;
|
|
hCBTHookMrShadow = SetWindowsHookEx(WH_CBT, (HOOKPROC)CBTHookProcMrShadow,
|
|
GetModuleHandle("tophook"), 0);
|
|
return(TRUE);
|
|
}
|
|
|
|
|
|
BOOL FAR PASCAL ClearMrShadowHooks(
|
|
HWND hwnd)
|
|
{
|
|
if (pidMrShadow != GetCurrentProcessId()) {
|
|
return(FALSE);
|
|
}
|
|
if (UnhookWindowsHookEx(hCBTHookMrShadow)) {
|
|
pidMrShadow = (DWORD)-1;
|
|
hCBTHookMrShadow = NULL;
|
|
hwndHookMrShadow = NULL;
|
|
return(TRUE);
|
|
}
|
|
return(FALSE);
|
|
}
|