#define STRICT #include struct KZ_Data { WNDPROC oldWndProc; int subs; HWND sub[20]; }; static KZ_Data * __loadds GetKZ_Data(HWND hwnd) { HGLOBAL hglob=(HGLOBAL)GetProp(hwnd,"KZ_Data"); if(hglob==0) return 0; void FAR *ptr = GlobalLock(hglob); return (KZ_Data *)ptr; } static void __loadds ReleaseKZ_Data(HWND hwnd) { HGLOBAL hglob=(HGLOBAL)GetProp(hwnd,"KZ_Data"); if(hglob==0) return; GlobalUnlock(hglob); } static void __loadds DestroyKZ_Data(HWND hwnd) { HGLOBAL hglob=(HGLOBAL)GetProp(hwnd,"KZ_Data"); if(hglob==0) return; GlobalFree(hglob); RemoveProp(hwnd,"KZ_Data"); } static KZ_Data *CreateKZ_Data(HWND hwnd) { HGLOBAL hglob = GlobalAlloc(GMEM_MOVEABLE,sizeof(KZ_Data)); if(hglob==0) return 0; void FAR *ptr = GlobalLock(hglob); if(ptr==0) { GlobalFree(hglob); return 0; } if(!SetProp(hwnd,"KZ_Data",hglob)) { GlobalUnlock(hglob); GlobalFree(hglob); return 0; } KZ_Data *p=(KZ_Data *)ptr; p->oldWndProc=0; p->subs=0; return p; } LONG CALLBACK KZ_WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { if(msg==WM_ACTIVATE) { KZ_Data *p=GetKZ_Data(hWnd); if(!p) goto def; if(wParam!=WA_INACTIVE) { HWND hwndBehind; hwndBehind = GetWindow(hWnd,GW_HWNDPREV); if(hwndBehind==NULL) hwndBehind=HWND_TOP; for(int i=0; isubs; i++) { if(IsWindow(p->sub[i])) { SetWindowPos(p->sub[i],hwndBehind,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE|SWP_NOACTIVATE); } else { for(int j=i; jsubs-1; j++) p->sub[j]=p->sub[j+1]; p->subs--; i--; } } } ReleaseKZ_Data(hWnd); } if(msg==WM_NCDESTROY) { KZ_Data *p=GetKZ_Data(hWnd); WNDPROC wp=p->oldWndProc; ReleaseKZ_Data(hWnd); DestroyKZ_Data(hWnd); if((WNDPROC)GetWindowLong(hWnd,GWL_WNDPROC)==KZ_WndProc) SetWindowLong(hWnd,GWL_WNDPROC,(LONG)wp); return CallWindowProc(wp,hWnd,msg,wParam,lParam); } def: KZ_Data *p=GetKZ_Data(hWnd); WNDPROC wp=p->oldWndProc; ReleaseKZ_Data(hWnd); return CallWindowProc(wp,hWnd,msg,wParam,lParam); } extern "C" UINT CALLBACK __export KeepWindowAbove(HWND hwnd, HWND hwndAbove) { KZ_Data *p=GetKZ_Data(hwndAbove); if(!p) { p=CreateKZ_Data(hwndAbove); if(!p) return 1; p->oldWndProc = (WNDPROC)SetWindowLong(hwndAbove,GWL_WNDPROC,(LONG)KZ_WndProc); } for(int i=0; isubs; i++) if(p->sub[i]==hwnd) return 2; if(p->subs>=20) return 3; p->sub[p->subs++]=hwnd; ReleaseKZ_Data(hwnd); return 0; } int CALLBACK LibMain(HINSTANCE, WORD, WORD, LPSTR) { return 1; }