#define WIN31 #include #include #include "cparrow.h" #include "comstrin.h" #include "uniconv.h" /* Global variables... */ HANDLE hMainInst; HWND hMainWindow; TCHAR szName[TITLEBARNAMELEN]; TCHAR szAppName[APPNAMEBUFFERLEN]; // Section name in CONTROL.INI TCHAR szIniFile[MAXFILELEN]; TCHAR szScreenSaver[22]; TCHAR szHelpFile[MAXFILELEN]; TCHAR szNoHelpMemory[BUFFLEN]; UINT MyHelpMessage; /* Local Function definitions... */ BOOL AppInit (HANDLE hInst, HANDLE hPrev, WORD sw, LPTSTR szCmdLine); int DoConfigureDialog (HANDLE hInst, BOOL fParent); HCURSOR hcurOld; HHOOK hhkNextMsgFilterHookFunc = NULL; LRESULT CALLBACK HelpMessageFilterHookFunction (int nCode, WPARAM wParam, LPMSG lpMsg); #define THRESHOLD 3 //*************************************************************************** BOOL AppInit (HANDLE hInst, HANDLE hPrev, WORD sw, LPTSTR szCmdLine) { WNDCLASS cls; int dx, dy; if (hPrev != NULL) return FALSE; /* * Register a class for the main application window */ cls.hCursor = NULL; cls.hIcon = LoadIcon (hInst, MAKEINTATOM (ID_APP)); cls.lpszMenuName = NULL; cls.lpszClassName = TEXT("WindowsScreenSaverClass"); cls.hbrBackground = GetStockObject (BLACK_BRUSH); cls.hInstance = hInst; cls.style = CS_VREDRAW | CS_HREDRAW | CS_DBLCLKS; cls.lpfnWndProc = ScreenSaverProc; cls.cbWndExtra = 0; cls.cbClsExtra = 0; if (!RegisterClass (&cls)) return FALSE; dx = GetSystemMetrics (SM_CXSCREEN); dy = GetSystemMetrics (SM_CYSCREEN); hMainWindow = CreateWindowEx (WS_EX_TOPMOST, TEXT("WindowsScreenSaverClass"), // Class name TEXT("\0"), // Caption WS_POPUP | WS_VISIBLE | // Style bits WS_CLIPCHILDREN | WS_CLIPSIBLINGS, 0, 0, // Position dx, dy, // Size (HWND)NULL, // Parent window (no parent) (HMENU)NULL, // use class menu (HANDLE)hInst, // handle to window instance (LPVOID)NULL // no params to pass on ); if (hMainWindow) return TRUE; return FALSE; } //*************************************************************************** int _CRTAPI1 main (USHORT argc, CHAR **argv) { HANDLE hInst; HANDLE hPrev = NULL; LPTSTR szCmdLine = GetCommandLine(); WORD sw = SW_SHOWNORMAL; MSG msg; LPTSTR lpT; hInst = GetModuleHandle (NULL); /* Save instance handle for DialogBoxs */ hMainInst = hInst; // This has to be loaded first so we know who we are and to find if we // already around. LoadString (hInst, idsAppName, szAppName, CharSizeOf(szAppName)); //================================================================= // on NT, szCmdLine's first string includes its own name, remove this // to make it exactly like the windows command line. if (*szCmdLine) { lpT = _tcschr (szCmdLine, TEXT(' ')); // skip self name if (lpT) { szCmdLine = lpT; while (*szCmdLine == TEXT(' ')) szCmdLine++; // skip spaces to end or first cmd } else { szCmdLine += lstrlen(szCmdLine); // point to NULL } } //===================================================================== MyHelpMessage = RegisterWindowMessage (szAppName); if (MyHelpMessage) hhkNextMsgFilterHookFunc = SetWindowsHook (WH_MSGFILTER, (HOOKPROC)HelpMessageFilterHookFunction); /* Parse through the command line. If the parameter is -s, /s, or s, then bring up a configure dialog box. Otherwise, bring up the normal window...*/ if (!((!_tcsnicmp (szCmdLine, TEXT("/s"), 2) || !_tcsicmp (szCmdLine, TEXT("-s"))) || !_tcsicmp (szCmdLine, TEXT("s")))) { if (!((!_tcsicmp (szCmdLine, TEXT("/c")) || !_tcsicmp (szCmdLine, TEXT("-c"))) || !_tcsicmp (szCmdLine, TEXT("c")))) return DoConfigureDialog (hInst, FALSE); else return DoConfigureDialog (hInst, TRUE); } /* Call initialization procedure */ if (!AppInit (hInst, hPrev, sw, szCmdLine)) return FALSE; /* Message Loop for the program... */ while (GetMessage (&msg, NULL, 0, 0)) { TranslateMessage (&msg); DispatchMessage (&msg); } if (MyHelpMessage) UnhookWindowsHook (WH_MSGFILTER, (HOOKPROC)HelpMessageFilterHookFunction); return msg.wParam; } //*************************************************************************** LONG DefScreenSaverProc (HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { static BOOL fHere = FALSE; static POINT ptLast; static BOOL bDialogUp = FALSE; POINT ptCursor, ptCheck; switch (msg) { case WM_SYSCOMMAND: if ((wParam==SC_SCREENSAVE) || (wParam==SC_CLOSE)) return FALSE; break; case WM_DESTROY: PostQuitMessage (0); break; case WM_SETCURSOR: SetCursor (NULL); break; case WM_NCACTIVATE: if (wParam==FALSE && !bDialogUp) return FALSE; break; case WM_ACTIVATE: case WM_ACTIVATEAPP: if (wParam != FALSE) // only fall through if we are break; // losing the focus... case WM_MOUSEMOVE: if (!fHere) { GetCursorPos (&ptLast); fHere = TRUE; } else { GetCursorPos (&ptCheck); if (ptCursor.x = ptCheck.x - ptLast.x) { if (ptCursor.x < 0) ptCursor.x *= -1; } if (ptCursor.y = ptCheck.y - ptLast.y) { if (ptCursor.y < 0) ptCursor.y *= -1; } if ((ptCursor.x + ptCursor.y) > THRESHOLD) goto SHOWDIALOG; } break; case WM_LBUTTONDOWN: case WM_MBUTTONDOWN: case WM_RBUTTONDOWN: GetCursorPos (&ptCursor); ptCursor.x ++; ptCursor.y ++; SetCursorPos (ptCursor.x, ptCursor.y); GetCursorPos (&ptCheck); if (ptCheck.x != ptCursor.x && ptCheck.y != ptCursor.y) ptCursor.x -= 2; ptCursor.y -= 2; SetCursorPos (ptCursor.x, ptCursor.y); // fall thru case WM_KEYDOWN: case WM_SYSKEYDOWN: SHOWDIALOG: PostMessage (hWnd, WM_CLOSE, 0, 0l); break; } return DefWindowProc (hWnd, msg, wParam, lParam); } //*************************************************************************** int DoConfigureDialog (HANDLE hInst, BOOL fParent ) { HWND hWndParent; if (fParent) hWndParent = GetActiveWindow (); else hWndParent = NULL; if (RegisterDialogClasses (hInst)) { hMainWindow = NULL; DialogBox (hInst, MAKEINTRESOURCE (DLG_SCRNSAVECONFIGURE), hWndParent, (WNDPROC) ScreenSaverConfigureDialog); } return TRUE; } //*************************************************************************** LRESULT CALLBACK HelpMessageFilterHookFunction (int nCode, WPARAM wParam, LPMSG lpMsg) { if (nCode < 0) goto DefHook; if (nCode == MSGF_DIALOGBOX) if (lpMsg->message == WM_KEYDOWN && lpMsg->wParam == VK_F1) { HWND hTemp; HWND hParent = lpMsg->hwnd; while (hParent != NULL) { hTemp = hParent; if (!(GetWindowLong(hTemp, GWL_STYLE) & WS_CHILD)) break; hParent = (HWND) GetWindowLong (hParent, GWL_HWNDPARENT); } PostMessage (hTemp, MyHelpMessage, 0, 0L); return TRUE; } else DefHook: return (int)DefHookProc(nCode, wParam, (LONG)lpMsg, &hhkNextMsgFilterHookFunc); return 0; }