home *** CD-ROM | disk | FTP | other *** search
/ Freelog 54 / Freelog054.iso / Bas / Détente / WinPenguins / Winmon / Winmon.cpp < prev    next >
C/C++ Source or Header  |  2001-04-03  |  4KB  |  195 lines

  1. /**
  2.  * $Id: Winmon.cpp,v 1.1.1.1 2001/04/03 19:29:43 mvines Exp $
  3.  *
  4.  *  Copyright (C) 2000  Michael Vines
  5.  *
  6.  *  This program is free software; you can redistribute it and/or modify
  7.  *  it under the terms of the GNU General Public License as published by
  8.  *  the Free Software Foundation; either version 2 of the License, or
  9.  *  (at your option) any later version.
  10.  *
  11.  *  This program is distributed in the hope that it will be useful,
  12.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  13.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14.  *  GNU General Public License for more details.
  15.  *
  16.  *  You should have received a copy of the GNU General Public License
  17.  *  along with this program; if not, write to the Free Software
  18.  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  19.  *
  20.  *  As a special exception, Michael Vines gives permission to link this program
  21.  *  with the Microsoft Visual C++ Runtime/MFC Environment, and distribute the
  22.  *  resulting executable, without including the source code for the Microsoft 
  23.  *  Visual C++ Runtime/MFC Environment in the source distribution
  24.  */
  25.  
  26. #include "stdafx.h"
  27. #include "winmon.h"
  28. #include <assert.h>
  29. #include <stdio.h>
  30.  
  31. HINSTANCE hMod;
  32. HANDLE hSem;
  33.  
  34. BOOL APIENTRY DllMain( HINSTANCE hModule,  
  35.                        DWORD  ul_reason_for_call, 
  36.                        LPVOID lpReserved
  37.                      )
  38. {
  39.     hMod = hModule;
  40.     switch (ul_reason_for_call)
  41.     {
  42.         case DLL_PROCESS_ATTACH:
  43.             hSem = OpenSemaphore(SEMAPHORE_ALL_ACCESS, FALSE,
  44.                                  "WinPenguins-DeskPaintSem");
  45.             if (hSem == NULL) {
  46.                 hSem = CreateSemaphore(NULL, 1, 1, 
  47.                                        "WinPenguins-DeskPaintSem");
  48.                 assert(hSem != NULL);
  49.             }
  50.             break;
  51.  
  52.         case DLL_PROCESS_DETACH:
  53.             DeleteObject(hSem);
  54.             break;
  55.  
  56.         case DLL_THREAD_ATTACH:
  57.         case DLL_THREAD_DETACH:
  58.             break;
  59.  
  60.     }
  61.     return TRUE;
  62. }
  63.  
  64.  
  65. // Data in the sdata segment is shared between all winmon instances
  66. #pragma bss_seg("sdata")
  67. #pragma data_seg("sdata")
  68.  
  69. BOOL wndPosInvalid;  
  70. BOOL dskWndPainted;
  71. BOOL dskWndResized;
  72. RECT dskWndPaintedRect;
  73.  
  74. HHOOK hWndMsgHook, hWndRetHook;
  75. DWORD pidToIgnore;
  76. HWND desktopWnd;
  77.  
  78. #pragma data_seg(".data")
  79. #pragma bss_seg(".bss")
  80.  
  81.  
  82. LRESULT CALLBACK SysMsgHook(int nCode, WPARAM wParam, LPARAM lParam)
  83. {
  84.   MSG *cw = (MSG*)lParam;
  85.  
  86.   switch (cw->message) {
  87.   case WM_ERASEBKGND:
  88.   case WM_PAINT:
  89.       if (cw->hwnd == desktopWnd) {
  90.             RECT rt;
  91.             
  92.             if (!GetUpdateRect(cw->hwnd, &rt, false)) {
  93.                 ::GetClientRect(cw->hwnd, &rt);
  94.             }
  95.  
  96.             WaitForSingleObject(hSem, INFINITE);
  97.             UnionRect(&dskWndPaintedRect, &dskWndPaintedRect, &rt);
  98.             ReleaseSemaphore(hSem, 1, NULL);
  99.  
  100.             dskWndPainted = TRUE;
  101.       }
  102.       break;
  103.   default:
  104.       break;
  105.   }
  106.  
  107.   return CallNextHookEx(hWndMsgHook, nCode, wParam, lParam);
  108. }
  109.  
  110.  
  111. LRESULT CALLBACK SysMsgRetHook(int nCode, WPARAM wParam, LPARAM lParam)
  112. {
  113.   DWORD pid;
  114.   CWPRETSTRUCT *cw = (CWPRETSTRUCT*)lParam;
  115.  
  116.   GetWindowThreadProcessId(cw->hwnd, &pid);
  117.  
  118.   if (pid != pidToIgnore) {
  119.       switch (cw->message) {
  120.       case WM_WINDOWPOSCHANGED:
  121.           if (cw->hwnd == desktopWnd) {
  122.               dskWndResized = TRUE;
  123.           }
  124.  
  125.           wndPosInvalid = TRUE;
  126.           break;
  127.       default:
  128.           break;
  129.       }
  130.   }
  131.  
  132.   return CallNextHookEx(hWndRetHook, nCode, wParam, lParam);
  133. }
  134.  
  135.  
  136. WINMON_API void Winmon_LoadHook(DWORD myPid, HWND dskWnd)
  137. {
  138.     wndPosInvalid = TRUE;
  139.     dskWndPainted = TRUE;
  140.     dskWndResized = TRUE;
  141.  
  142.     pidToIgnore = myPid;
  143.     desktopWnd = dskWnd;
  144.  
  145.     GetClientRect(dskWnd, &dskWndPaintedRect);
  146.  
  147.     hWndMsgHook = SetWindowsHookEx(WH_GETMESSAGE, SysMsgHook, hMod, 0);
  148.     hWndRetHook = SetWindowsHookEx(WH_CALLWNDPROCRET, SysMsgRetHook, hMod, 0);
  149. }
  150.  
  151.  
  152.  
  153. WINMON_API BOOL Winmon_Moved(void)
  154. {
  155.     BOOL ret = wndPosInvalid;
  156.     wndPosInvalid = FALSE;
  157.  
  158.     return ret;
  159. }
  160.  
  161.  
  162. WINMON_API BOOL Winmon_DeskWndPainted(RECT *dskRt)
  163. {
  164.     BOOL ret = dskWndPainted;
  165.     dskWndPainted = FALSE;
  166.  
  167.     if (dskRt != NULL) {
  168.         WaitForSingleObject(hSem, INFINITE);
  169.         CopyRect(dskRt, &dskWndPaintedRect);
  170.         SetRectEmpty(&dskWndPaintedRect);
  171.         ReleaseSemaphore(hSem, 1, NULL);
  172.     }
  173.  
  174.     return ret;
  175. }
  176.  
  177.  
  178. WINMON_API BOOL Winmon_DesktopChanged(void)
  179. {
  180.     BOOL ret = dskWndResized;
  181.     dskWndResized = FALSE;
  182.  
  183.     return ret;
  184. }
  185.  
  186.  
  187.  
  188. WINMON_API void Winmon_UnloadHook(void)
  189. {
  190.     UnhookWindowsHookEx(hWndMsgHook);
  191.     UnhookWindowsHookEx(hWndRetHook);
  192. }
  193.  
  194.  
  195.