/* * SCRNSAVE.C - default screen saver. * * this app makes a IdleWild screen saver compatible with the windows 3.1 * screen saver interface. * * Usage: SCRNSAVE.EXE saver.iw [/s] [/c] * * the IdleWild screen saver 'saver.iw' will be loaded and told to * screen save. if '/c' is specifed the savers configure dialog will * be shown. * * when the screen saver terminates SCRNSAVE.EXE will terminate too. * * if the saver.iw is not specifed or refuses to load then a * builtin 'blackness' screen saver will be used. * * Restrictions: * * because only one screen saver is loaded, (not all the screen savers * like IdleWild.exe does) the random screen saver will not work correctly * * History: * 10/15/90 ToddLa stolen from SOS.C by BradCh * 6/17/91 stevecat ported to NT Windows * */ #include #define WIN31 /* For topmost windows */ #include #include "strings.h" #include #define BUFFER_LEN 255 CHAR szAppName[BUFFER_LEN]; CHAR szNoConfigure[BUFFER_LEN]; #define THRESHOLD 3 #define abs(x) ( (x)<0 ? -(x) : (x) ) // // private stuff in IWLIB.DLL // HANDLE hIdleWildDll; CHAR szIdleWildDll[] = "IWLIB.DLL"; SHORT (*FInitScrSave) (HANDLE, HWND); VOID (*TermScrSave) (VOID); VOID (*ScrBlank) (SHORT); VOID (*ScrSetIgnore) (SHORT); SHORT (*ScrLoadServer) (CHAR *); SHORT (*ScrSetServer) (CHAR *); VOID (*ScrInvokeDlg) (HANDLE, HWND); HANDLE hMainInstance = NULL; HWND hwndApp = NULL; HWND hwndActive = NULL; HWND hwndPreview = NULL; BOOL fBlankNow = FALSE; BOOL fIdleWild = FALSE; //SHORT wmScrSave = -1; // changed to what I believe it should be UINT wmScrSave = 0xffffffff; typedef LONG (*LPWNDPROC)(); // pointer to a window procedure BOOL FInitIdleWild (LPSTR szCmdLine); BOOL FTermIdleWild (VOID); BOOL FInitApp (HANDLE hInstance, LPSTR szCmdLine, WORD sw); BOOL FTermApp (VOID); BOOL FInitDefault (VOID); LRESULT DefaultProc (HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam); int __cdecl main (USHORT argc, CHAR **argv) { HANDLE hInstance; HANDLE hPrev = NULL; LPSTR szCmdLine = GetCommandLine(); WORD sw = SW_SHOWNORMAL; MSG msg; hInstance = GetModuleHandle (NULL); hMainInstance = hInstance; // If we're already running another instance, get out if (hPrev != NULL) return FALSE; if (!FInitApp (hInstance, szCmdLine, sw)) { //MessageBox (NULL, "Cannot initialize!", szAppName, MB_OK); return FALSE; } while (GetMessage (&msg, NULL, 0, 0)) { // // IWLIB.DLL will brodcast a message when the screen saving // is done. // if (msg.message == wmScrSave && msg.wParam == FALSE) break; TranslateMessage (&msg); DispatchMessage (&msg); } return FTermApp (); } BOOL FTermApp (VOID) { ////FTermDefault (); FTermIdleWild (); return TRUE; } BOOL FInitApp (HANDLE hInstance, LPSTR szCmdLine, WORD sw) { LPSTR lpch, lpT; LoadString(hMainInstance, idsAppName, szAppName, BUFFER_LEN); LoadString(hMainInstance, idsNoConfigure, szNoConfigure, BUFFER_LEN); //================================================================= // on NT, szCmdLine's first string includes its own name, remove this // to make it exactly like the windows command line. if (*szCmdLine) { lpT = strchr(szCmdLine, ' '); // skip self name if (lpT) { szCmdLine = lpT; while (*szCmdLine == ' ') szCmdLine++; // skip spaces to end or first cmd } else { szCmdLine += strlen(szCmdLine); // point to NULL } } //===================================================================== // // parse command line looking for switches // for (lpch = szCmdLine; *lpch != '\0'; lpch += 1) { if (*lpch == '/' || *lpch == '-') { if (lpch[1] == 's' || lpch[1] == 'S') fBlankNow = TRUE; if (lpch[1] == 'c' || lpch[1] == 'C') hwndActive = GetActiveWindow (); if (lpch[1] == 'p' || lpch[1] == 'P') { fBlankNow = TRUE; hwndPreview = (HWND)IntToPtr(atoi(lpch+2)); break; } lpch[0] = ' '; lpch[1] = ' '; } } // // try to load the IdleWild screen saver, if none specifed or // we are unable to load it then use the default one. // if (FInitIdleWild (szCmdLine)) { if (fBlankNow) { ScrSetIgnore (1); ScrBlank (TRUE); } else { ScrInvokeDlg (hMainInstance, hwndActive); PostQuitMessage (0); } } else if (!fBlankNow || !FInitDefault ()) { MessageBox (hwndActive, szNoConfigure, szAppName, MB_OK | MB_ICONEXCLAMATION); PostQuitMessage (0); } return TRUE; } // // run-time link to IWLIB.DLL // BOOL FInitIdleWild (LPSTR szCmdLine) { OFSTRUCT of; while (*szCmdLine == ' ') szCmdLine++; if (*szCmdLine == 0) return FALSE; if (-1 == OpenFile(szIdleWildDll, &of, OF_EXIST | OF_SHARE_DENY_NONE) || -1 == OpenFile(szCmdLine, &of, OF_EXIST | OF_SHARE_DENY_NONE)) return FALSE; if ((hIdleWildDll = LoadLibrary (szIdleWildDll)) == NULL) return FALSE; FInitScrSave = (SHORT (*) (HANDLE, HWND))GetProcAddress (hIdleWildDll, "FInitScrSave" ); TermScrSave = (VOID (*) (VOID)) GetProcAddress (hIdleWildDll, "TermScrSave" ); ScrBlank = (VOID (*) (SHORT)) GetProcAddress (hIdleWildDll, "ScrBlank" ); ScrSetIgnore = (VOID (*) (SHORT)) GetProcAddress (hIdleWildDll, "ScrSetIgnore" ); ScrLoadServer = (SHORT (*) (CHAR *)) GetProcAddress (hIdleWildDll, "ScrLoadServer"); ScrSetServer = (SHORT (*) (CHAR *)) GetProcAddress (hIdleWildDll, "ScrSetServer" ); ScrInvokeDlg = (VOID (*) (HANDLE, HWND)) GetProcAddress (hIdleWildDll, "ScrInvokeDlg" ); // // must be a invalid dll? // if (!FInitScrSave || !TermScrSave) { FreeLibrary (hIdleWildDll); return FALSE; } // // init iwlib.dll // if (!FInitScrSave (hMainInstance, NULL)) // NULL hwnd??? { FreeLibrary (hIdleWildDll); return FALSE; } // // load the screen saver on the command line. // if the load fails, abort // if (!ScrLoadServer (szCmdLine)) { TermScrSave (); FreeLibrary (hIdleWildDll); return FALSE; } wmScrSave = RegisterWindowMessage ("SCRSAVE"); // REVIEW: for win 3.1 fIdleWild = TRUE; return TRUE; } BOOL FTermIdleWild (VOID) { if (fIdleWild) { TermScrSave (); FreeLibrary (hIdleWildDll); } return TRUE; } // // init the default screen saver // BOOL FInitDefault (VOID) { WNDCLASS cls; HWND hwnd; HDC hdc; RECT rc; OSVERSIONINFO osvi; BOOL bWin2000 = FALSE; cls.style = 0; cls.lpfnWndProc = DefaultProc; cls.cbClsExtra = 0; cls.cbWndExtra = 0; cls.hInstance = hMainInstance; cls.hIcon = NULL; if (hwndPreview == NULL) { cls.hCursor = NULL; } else { cls.hCursor = LoadCursor(NULL,IDC_ARROW); } cls.hbrBackground = GetStockObject (BLACK_BRUSH); cls.lpszMenuName = NULL; cls.lpszClassName = szAppName; if (!RegisterClass (&cls)) return FALSE; // // Make sure we use the entire virtual desktop size for multiple // displays // hdc = GetDC(NULL); GetClipBox(hdc, &rc); ReleaseDC(NULL, hdc); // On Win2000 Terminal Services we must detect the case where a remotte session // is on the disconnected desktop, because in this case GetClipBox() returns // an empty rect. if (IsRectEmpty(&rc)) { osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); if (GetVersionEx (&osvi)){ if ((osvi.dwPlatformId == VER_PLATFORM_WIN32_NT) && (osvi.dwMajorVersion >= 5)) { bWin2000 = TRUE; } } if (bWin2000 && GetSystemMetrics(SM_REMOTESESSION)) { rc.left = 0; rc.top = 0; rc.right = GetSystemMetrics(SM_CXVIRTUALSCREEN); rc.bottom = GetSystemMetrics(SM_CYVIRTUALSCREEN); } } hwnd = CreateWindowEx (WS_EX_TOPMOST, szAppName, szAppName, WS_VISIBLE | ((hwndPreview == NULL) ? WS_POPUP : WS_CHILD), rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top, hwndPreview, NULL, hMainInstance, NULL); return hwnd != NULL; } LRESULT DefaultProc (HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { static POINT ptLast; POINT ptMouse; switch (msg) { case WM_CREATE: GetCursorPos (&ptLast); break; case WM_DESTROY: PostQuitMessage (0); break; case WM_ACTIVATE: case WM_ACTIVATEAPP: if (wParam) break; case WM_LBUTTONDOWN: case WM_MBUTTONDOWN: case WM_RBUTTONDOWN: case WM_KEYDOWN: case WM_CHAR: if (hwndPreview == NULL) { PostMessage (hwnd, WM_CLOSE, 0, 0L); } break; case WM_MOUSEMOVE: if (hwndPreview == NULL) { GetCursorPos (&ptMouse); if (abs (ptMouse.x - ptLast.x) + abs (ptMouse.y - ptLast.y) > THRESHOLD) PostMessage (hwnd, WM_CLOSE, 0, 0L); } break; case WM_SETCURSOR: if (hwndPreview == NULL) { SetCursor (NULL); return 0L; } break; } return DefWindowProc (hwnd, msg, wParam, lParam); }