SKELETON.C
上传用户:bangxh
上传日期:2007-01-31
资源大小:42235k
文件大小:9k
源码类别:

Windows编程

开发平台:

Visual C++

  1. #define WIN31
  2. #include <windows.h>
  3. #include <scrnsave.h>
  4. #include "cparrow.h"
  5. #include "comstrin.h"
  6. #include "uniconv.h"
  7. /* Global variables... */
  8. HANDLE  hMainInst;
  9. HWND    hMainWindow;
  10. TCHAR   szName[TITLEBARNAMELEN];
  11. TCHAR   szAppName[APPNAMEBUFFERLEN];       // Section name in CONTROL.INI
  12. TCHAR   szIniFile[MAXFILELEN];
  13. TCHAR   szScreenSaver[22];
  14. TCHAR   szHelpFile[MAXFILELEN];
  15. TCHAR   szNoHelpMemory[BUFFLEN];
  16. UINT    MyHelpMessage;
  17. /* Local Function definitions... */
  18. BOOL AppInit           (HANDLE hInst, HANDLE hPrev, WORD sw, LPTSTR szCmdLine);
  19. int  DoConfigureDialog (HANDLE hInst, BOOL fParent);
  20. HCURSOR hcurOld;
  21. HHOOK hhkNextMsgFilterHookFunc = NULL;
  22. LRESULT CALLBACK HelpMessageFilterHookFunction (int nCode, WPARAM wParam, LPMSG lpMsg);
  23. #define THRESHOLD   3
  24. //***************************************************************************
  25. BOOL AppInit (HANDLE hInst, HANDLE hPrev, WORD sw, LPTSTR szCmdLine)
  26. {
  27.     WNDCLASS cls;
  28.     int    dx, dy;
  29.     if (hPrev != NULL)
  30.         return FALSE;
  31.     /*
  32.      *  Register a class for the main application window
  33.      */
  34.     cls.hCursor        = NULL;
  35.     cls.hIcon          = LoadIcon (hInst, MAKEINTATOM (ID_APP));
  36.     cls.lpszMenuName   = NULL;
  37.     cls.lpszClassName  = TEXT("WindowsScreenSaverClass");
  38.     cls.hbrBackground  = GetStockObject (BLACK_BRUSH);
  39.     cls.hInstance      = hInst;
  40.     cls.style          = CS_VREDRAW | CS_HREDRAW | CS_DBLCLKS;
  41.     cls.lpfnWndProc    = ScreenSaverProc;
  42.     cls.cbWndExtra     = 0;
  43.     cls.cbClsExtra     = 0;
  44.     if (!RegisterClass (&cls))
  45.         return FALSE;
  46.     dx = GetSystemMetrics (SM_CXSCREEN);
  47.     dy = GetSystemMetrics (SM_CYSCREEN);
  48.     hMainWindow = CreateWindowEx (WS_EX_TOPMOST,
  49.                             TEXT("WindowsScreenSaverClass"), // Class name
  50.                             TEXT(""),                      // Caption
  51.                             WS_POPUP | WS_VISIBLE |          // Style bits
  52.                             WS_CLIPCHILDREN | WS_CLIPSIBLINGS,
  53.                             0, 0,                            // Position
  54.                             dx, dy,                          // Size
  55.                             (HWND)NULL,                      // Parent window (no parent)
  56.                             (HMENU)NULL,                     // use class menu
  57.                             (HANDLE)hInst,                   // handle to window instance
  58.                             (LPVOID)NULL                     // no params to pass on
  59.                                );
  60.     if (hMainWindow)
  61.         return TRUE;
  62.     return FALSE;
  63. }
  64. //***************************************************************************
  65. int _CRTAPI1 main (USHORT argc, CHAR **argv)
  66. {
  67.     HANDLE   hInst;
  68.     HANDLE   hPrev     = NULL;
  69.     LPTSTR   szCmdLine = GetCommandLine();
  70.     WORD     sw        = SW_SHOWNORMAL;
  71.     MSG      msg;
  72.     LPTSTR   lpT;
  73.     hInst = GetModuleHandle (NULL);
  74.     /* Save instance handle for DialogBoxs */
  75.     hMainInst = hInst;
  76.     // This has to be loaded first so we know who we are and to find if we
  77.     // already around.
  78.     LoadString (hInst, idsAppName, szAppName, CharSizeOf(szAppName));
  79.     //=================================================================
  80.     // on NT, szCmdLine's first string includes its own name, remove this
  81.     // to make it exactly like the windows command line.
  82.     if (*szCmdLine)
  83.     {
  84.         lpT = _tcschr (szCmdLine, TEXT(' '));   // skip self name
  85.         if (lpT)
  86.         {
  87.             szCmdLine = lpT;
  88.             while (*szCmdLine == TEXT(' '))
  89.                 szCmdLine++;            // skip spaces to end or first cmd
  90.         }
  91.         else
  92.         {
  93.             szCmdLine += lstrlen(szCmdLine);   // point to NULL
  94.         }
  95.     }
  96.     //=====================================================================
  97.     MyHelpMessage = RegisterWindowMessage (szAppName);
  98.     if (MyHelpMessage)
  99.         hhkNextMsgFilterHookFunc = SetWindowsHook (WH_MSGFILTER,
  100.                                       (HOOKPROC)HelpMessageFilterHookFunction);
  101.     /* Parse through the command line.  If the parameter is -s, /s, or s, then
  102.        bring up a configure dialog box.  Otherwise, bring up the normal
  103.        window...*/
  104.     if (!((!_tcsnicmp (szCmdLine, TEXT("/s"), 2) || !_tcsicmp (szCmdLine, TEXT("-s"))) ||
  105.         !_tcsicmp (szCmdLine, TEXT("s"))))
  106.     {
  107.         if (!((!_tcsicmp (szCmdLine, TEXT("/c")) || !_tcsicmp (szCmdLine, TEXT("-c"))) ||
  108.             !_tcsicmp (szCmdLine, TEXT("c"))))
  109.             return DoConfigureDialog (hInst, FALSE);
  110.         else
  111.             return DoConfigureDialog (hInst, TRUE);
  112.     }
  113.     /* Call initialization procedure */
  114.     if (!AppInit (hInst, hPrev, sw, szCmdLine))
  115.         return FALSE;
  116.     /* Message Loop for the program... */
  117.     while (GetMessage (&msg, NULL, 0, 0))
  118.     {
  119.         TranslateMessage (&msg);
  120.         DispatchMessage (&msg);
  121.     }
  122.     if (MyHelpMessage)
  123.         UnhookWindowsHook (WH_MSGFILTER, (HOOKPROC)HelpMessageFilterHookFunction);
  124.     return msg.wParam;
  125. }
  126. //***************************************************************************
  127. LONG DefScreenSaverProc (HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
  128. {
  129.     static BOOL     fHere = FALSE;
  130.     static POINT    ptLast;
  131.     static BOOL     bDialogUp = FALSE;
  132.     POINT           ptCursor, ptCheck;
  133.     switch (msg)
  134.     {
  135.     case WM_SYSCOMMAND:
  136.         if ((wParam==SC_SCREENSAVE) || (wParam==SC_CLOSE))
  137.             return FALSE;
  138.         break;
  139.     case WM_DESTROY:
  140.         PostQuitMessage (0);
  141.         break;
  142.     case WM_SETCURSOR:
  143.         SetCursor (NULL);
  144.         break;
  145.     case WM_NCACTIVATE:
  146.         if (wParam==FALSE && !bDialogUp)
  147.             return FALSE;
  148.         break;
  149.     case WM_ACTIVATE:
  150.     case WM_ACTIVATEAPP:
  151.         if (wParam != FALSE)        // only fall through if we are
  152.             break;                  // losing the focus...
  153.     case WM_MOUSEMOVE:
  154.         if (!fHere)
  155.         {
  156.             GetCursorPos (&ptLast);
  157.             fHere = TRUE;
  158.         }
  159.         else
  160.         {
  161.             GetCursorPos (&ptCheck);
  162.             if (ptCursor.x = ptCheck.x - ptLast.x)
  163.             {
  164.                 if (ptCursor.x < 0)
  165.                     ptCursor.x *= -1;
  166.             }
  167.             if (ptCursor.y = ptCheck.y - ptLast.y)
  168.             {
  169.                 if (ptCursor.y < 0)
  170.                     ptCursor.y *= -1;
  171.             }
  172.             if ((ptCursor.x + ptCursor.y) > THRESHOLD)
  173.                 goto SHOWDIALOG;
  174.         }
  175.         break;
  176.     case WM_LBUTTONDOWN:
  177.     case WM_MBUTTONDOWN:
  178.     case WM_RBUTTONDOWN:
  179.         GetCursorPos (&ptCursor);
  180.         ptCursor.x ++;
  181.         ptCursor.y ++;
  182.         SetCursorPos (ptCursor.x, ptCursor.y);
  183.         GetCursorPos (&ptCheck);
  184.         if (ptCheck.x != ptCursor.x && ptCheck.y != ptCursor.y)
  185.             ptCursor.x -= 2;
  186.         ptCursor.y -= 2;
  187.         SetCursorPos (ptCursor.x, ptCursor.y);
  188.         // fall thru
  189.     case WM_KEYDOWN:
  190.     case WM_SYSKEYDOWN:
  191. SHOWDIALOG:
  192.         PostMessage (hWnd, WM_CLOSE, 0, 0l);
  193.         break;
  194.     }
  195.     return DefWindowProc (hWnd, msg, wParam, lParam);
  196. }
  197. //***************************************************************************
  198. int    DoConfigureDialog (HANDLE hInst, BOOL fParent )
  199. {
  200.     HWND    hWndParent;
  201.     if (fParent)
  202.         hWndParent = GetActiveWindow ();
  203.     else
  204.         hWndParent = NULL;
  205.     if (RegisterDialogClasses (hInst))
  206.     {
  207.         hMainWindow = NULL;
  208.         DialogBox (hInst, MAKEINTRESOURCE (DLG_SCRNSAVECONFIGURE),
  209.                           hWndParent, (WNDPROC) ScreenSaverConfigureDialog);
  210.     }
  211.     return TRUE;
  212. }
  213. //***************************************************************************
  214. LRESULT CALLBACK HelpMessageFilterHookFunction (int nCode, WPARAM wParam, LPMSG lpMsg)
  215. {
  216.     if (nCode < 0)
  217.         goto DefHook;
  218.     if (nCode == MSGF_DIALOGBOX)
  219.         if (lpMsg->message == WM_KEYDOWN && lpMsg->wParam == VK_F1)
  220.         {
  221.             HWND hTemp;
  222.             HWND hParent = lpMsg->hwnd;
  223.             while (hParent != NULL)
  224.             {
  225.                 hTemp = hParent;
  226.                 if (!(GetWindowLong(hTemp, GWL_STYLE) & WS_CHILD))
  227.                     break;
  228.                 hParent = (HWND) GetWindowLong (hParent, GWL_HWNDPARENT);
  229.             }
  230.             PostMessage (hTemp, MyHelpMessage, 0, 0L);
  231.             return TRUE;
  232.         }
  233.         else
  234. DefHook:
  235.         return (int)DefHookProc(nCode, wParam, (LONG)lpMsg, &hhkNextMsgFilterHookFunc);
  236.     return 0;
  237. }