屏幕保护程序的退出机制反映在程序的消息响应函数(Window’s Procedure)中,当按下键盘上任何一个健或者鼠标移动计数超过5次(防止桌面振动等因素导致的鼠标移动),程序进入退出机制,在sm_test或者sm--_full情况下查看屏幕保护程序是否设置密码,如果是,验证密码,正确,程序退出,错误,程序继续。当程序验证密码时,通过全局变量g_bCheckingSaverPassword告诉消息响应函数对屏幕刷新,以保证密码的输入。其他情况(sm_config, sm_preview)不用验证密码直接退出。这些功能包括在自定义的函数InterruptSaver( )和ShutdownSaver( )中。
上述各个函数的详细代码如下:
1、 CreateSaverWindow 函数:
HWND CreateSaverWindow(SaverMode mode, HWND hWndParent,HINSTANCE hInstance) { HWND hWnd; RECT rc; DWORD dwStyle;
hWnd=NULL;
switch ( mode ) { case sm_preview: GetClientRect(hWndParent, &rc ); dwStyle = WS_VISIBLE | WS_CHILD; AdjustWindowRect( &rc, dwStyle, FALSE ); hWnd = CreateWindow( TEXT("SaverWndClass"), TEXT("SaverWindow"), dwStyle, rc.left, rc.top, rc.right-rc.left, rc.bottom-rc.top, hWndParent, NULL, hInstance, NULL); break;
case sm_test: rc.left = rc.top = 50; rc.right = rc.left+600; rc.bottom = rc.top+400; dwStyle = WS_VISIBLE | WS_OVERLAPPED | WS_CAPTION | WS_MINIMIZEBOX | WS_SYSMENU; AdjustWindowRect( &rc, dwStyle, FALSE ); hWnd = CreateWindow( TEXT("SaverWndClass"), TEXT("SaverWindow"), dwStyle, rc.left, rc.top, rc.right-rc.left, rc.bottom-rc.top, NULL, NULL, hInstance, NULL); break;
case sm_full: rc.left=rc.top=0; rc.bottom=GetSystemMetrics(SM_CYSCREEN); rc.right=GetSystemMetrics(SM_CXSCREEN); dwStyle = WS_VISIBLE | WS_POPUP;
hWnd = CreateWindowEx( WS_EX_TOPMOST, TEXT("SaverWndClass"), TEXT("SaverWindow"), dwStyle, rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top, NULL, NULL, hInstance, NULL);
} if(mode == sm_preview ) { // 开始预览时,进入一个短暂的循环以使系统显示控制面板有足够的时间初始化 g_bWaitForInputIdle = TRUE; // 开始循环 PostMessage( g_hWnd, WM_USER, 0, 0 );
MSG msg;
while( g_bWaitForInputIdle ) { // 如果If 返回 FALSE, 结束循环 if( !GetMessage( &msg, g_hWnd, 0, 0 ) ) { // 结束循环 PostQuitMessage(0); break; }
TranslateMessage( &msg); DispatchMessage( &msg); } } return hWnd; } |
2、 Window消息响应函数:
LRESULT CALLBACK SaverProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) { switch ( uMsg ) { case WM_USER: //预览开始循环,500ms空闲时间用于控制面板的初始化。 SetTimer( hWnd, 1, 500, NULL ); break; case WM_TIMER: // 500ms时间到,预览循环结束。 g_bWaitForInputIdle = FALSE; KillTimer( hWnd, 1 ); break;
case WM_DESTROY: ShutdownSaver(); break;
case WM_SETCURSOR: if ( g_SaverMode == sm_full && !g_bCheckingSaverPassword ) { //隐藏鼠标指针 SetCursor( NULL ); return TRUE; } break;
case WM_PAINT: { PAINTSTRUCT ps; BeginPaint( hWnd, &ps );
RECT rc; GetClientRect(hWnd,&rc); FillRect(ps.hdc, &rc, (HBRUSH)GetStockObject(BLACK_BRUSH) ); //黑屏
EndPaint( hWnd, &ps ); return 0; }
case WM_ERASEBKGND: // 输入密码时对屏幕刷新 if( !g_bCheckingSaverPassword ) return TRUE; break;
case WM_MOUSEMOVE: if( g_SaverMode != sm_test ) { static INT xPrev = -1; static INT yPrev = -1; INT xCur = GET_X_LPARAM(lParam); INT yCur = GET_Y_LPARAM(lParam); if( xCur != xPrev || yCur != yPrev ) { xPrev = xCur; yPrev = yCur; g_dwSaverMouseMoveCount++; if ( g_dwSaverMouseMoveCount > 5 ) InterruptSaver(); } } break;
case WM_KEYDOWN: case WM_LBUTTONDOWN: case WM_RBUTTONDOWN: case WM_MBUTTONDOWN: if( g_SaverMode != sm_test ) InterruptSaver(); break;
case WM_ACTIVATEAPP: if( wParam == FALSE && g_SaverMode != sm_test ) InterruptSaver(); break;
case WM_POWERBROADCAST: if( wParam == PBT_APMSUSPEND && g_VerifySaverPassword == NULL ) InterruptSaver(); break;
case WM_SYSCOMMAND: if ( g_SaverMode == sm_full ) { switch ( wParam ) { case SC_NEXTWINDOW: case SC_PREVWINDOW: case SC_SCREENSAVE: case SC_CLOSE: return FALSE; }; } break; }
return DefWindowProc( hWnd, uMsg, wParam, lParam ); } |
3、 ChangePassword()函数
VOID ChangePassword() { // 载入密码更改函数动态链接库(Dynamic Linked Library) HINSTANCE mpr = LoadLibrary( TEXT("MPR.DLL") );
if ( mpr != NULL ) { // 从动态链接数据库中提取密码设置函数 typedef DWORD (PASCAL *PWCHGPROC)( LPCSTR, HWND, DWORD, LPVOID ); PWCHGPROC pwd = (PWCHGPROC)GetProcAddress( mpr, "PwdChangePasswordA" );
//运行密码设置函数 if ( pwd != NULL ) pwd( "SCRSAVE", g_hWndParent, 0, NULL );
//释放动态链接库 FreeLibrary( mpr ); } } |
 
说明:本教程来源互联网或网友上传或出版商,仅为学习研究或媒体推广,wanshiok.com不保证资料的完整性。
2/2 首页 上一页 1 2 |