📄 d3dsaver.cpp
字号:
{
ChangePassword();
break;
}
}
for( DWORD iAdapter = 0; iAdapter < m_dwNumAdapters; iAdapter++ )
SAFE_DELETE( m_Adapters[iAdapter] );
SAFE_RELEASE( m_pD3D );
return 0;
}
//-----------------------------------------------------------------------------
// Name: ParseCommandLine()
// Desc: Interpret command-line parameters passed to this app.
//-----------------------------------------------------------------------------
SaverMode CD3DScreensaver::ParseCommandLine( TCHAR* pstrCommandLine )
{
m_hWndParent = NULL;
// Skip the first part of the command line, which is the full path
// to the exe. If it contains spaces, it will be contained in quotes.
if (*pstrCommandLine == TEXT('\"'))
{
pstrCommandLine++;
while (*pstrCommandLine != TEXT('\0') && *pstrCommandLine != TEXT('\"'))
pstrCommandLine++;
if( *pstrCommandLine == TEXT('\"') )
pstrCommandLine++;
}
else
{
while (*pstrCommandLine != TEXT('\0') && *pstrCommandLine != TEXT(' '))
pstrCommandLine++;
if( *pstrCommandLine == TEXT(' ') )
pstrCommandLine++;
}
// Skip along to the first option delimiter "/" or "-"
while ( *pstrCommandLine != TEXT('\0') && *pstrCommandLine != TEXT('/') && *pstrCommandLine != TEXT('-') )
pstrCommandLine++;
// If there wasn't one, then must be config mode
if ( *pstrCommandLine == TEXT('\0') )
return sm_config;
// Otherwise see what the option was
switch ( *(++pstrCommandLine) )
{
case 'c':
case 'C':
pstrCommandLine++;
while ( *pstrCommandLine && !isdigit(*pstrCommandLine) )
pstrCommandLine++;
if ( isdigit(*pstrCommandLine) )
{
#ifdef _WIN64
CHAR strCommandLine[2048];
DXUtil_ConvertGenericStringToAnsiCb( strCommandLine, pstrCommandLine, sizeof(strCommandLine) );
m_hWndParent = (HWND)(_atoi64(strCommandLine));
#else
m_hWndParent = (HWND)LongToHandle(_ttol(pstrCommandLine));
#endif
}
else
{
m_hWndParent = NULL;
}
return sm_config;
case 't':
case 'T':
return sm_test;
case 'p':
case 'P':
// Preview-mode, so option is followed by the parent HWND in decimal
pstrCommandLine++;
while ( *pstrCommandLine && !isdigit(*pstrCommandLine) )
pstrCommandLine++;
if ( isdigit(*pstrCommandLine) )
{
#ifdef _WIN64
CHAR strCommandLine[2048];
DXUtil_ConvertGenericStringToAnsiCb(strCommandLine, pstrCommandLine, sizeof(strCommandLine));
m_hWndParent = (HWND)(_atoi64(strCommandLine));
#else
m_hWndParent = (HWND)LongToHandle(_ttol(pstrCommandLine));
#endif
}
return sm_preview;
case 'a':
case 'A':
// Password change mode, so option is followed by parent HWND in decimal
pstrCommandLine++;
while ( *pstrCommandLine && !isdigit(*pstrCommandLine) )
pstrCommandLine++;
if ( isdigit(*pstrCommandLine) )
{
#ifdef _WIN64
CHAR strCommandLine[2048];
DXUtil_ConvertGenericStringToAnsiCb(strCommandLine, pstrCommandLine, sizeof(strCommandLine));
m_hWndParent = (HWND)(_atoi64(strCommandLine));
#else
m_hWndParent = (HWND)LongToHandle(_ttol(pstrCommandLine));
#endif
}
return sm_passwordchange;
default:
// All other options => run the screensaver (typically this is "/s")
return sm_full;
}
}
//-----------------------------------------------------------------------------
// Name: CreateSaverWindow
// Desc: Register and create the appropriate window(s)
//-----------------------------------------------------------------------------
HRESULT CD3DScreensaver::CreateSaverWindow()
{
/*
// Uncomment this code to allow stepping thru code in the preview case
if( m_SaverMode == sm_preview )
{
WNDCLASS cls;
cls.hCursor = NULL;
cls.hIcon = NULL;
cls.lpszMenuName = NULL;
cls.lpszClassName = TEXT("Parent");
cls.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH);
cls.hInstance = m_hInstance;
cls.style = CS_VREDRAW|CS_HREDRAW|CS_SAVEBITS|CS_DBLCLKS;
cls.lpfnWndProc = DefWindowProc;
cls.cbWndExtra = 0;
cls.cbClsExtra = 0;
RegisterClass( &cls );
// Create the window
RECT rect;
HWND hwnd;
rect.left = rect.top = 40;
rect.right = rect.left+200;
rect.bottom = rect.top+200;
AdjustWindowRect( &rect, WS_VISIBLE|WS_OVERLAPPED|WS_CAPTION|WS_POPUP, FALSE );
hwnd = CreateWindow( TEXT("Parent"), TEXT("FakeShell"),
WS_VISIBLE|WS_OVERLAPPED|WS_CAPTION|WS_POPUP, rect.left, rect.top,
rect.right-rect.left, rect.bottom-rect.top, NULL,
NULL, m_hInstance, NULL );
m_hWndParent = hwnd;
}
*/
// Register an appropriate window class
WNDCLASS cls;
cls.hCursor = LoadCursor( NULL, IDC_ARROW );
cls.hIcon = LoadIcon( m_hInstance, MAKEINTRESOURCE(IDI_MAIN_ICON) );
cls.lpszMenuName = NULL;
cls.lpszClassName = TEXT("D3DSaverWndClass");
cls.hbrBackground = (HBRUSH) GetStockObject(BLACK_BRUSH);
cls.hInstance = m_hInstance;
cls.style = CS_VREDRAW|CS_HREDRAW;
cls.lpfnWndProc = SaverProcStub;
cls.cbWndExtra = 0;
cls.cbClsExtra = 0;
RegisterClass( &cls );
// Create the window
RECT rc;
DWORD dwStyle;
switch ( m_SaverMode )
{
case sm_preview:
GetClientRect( m_hWndParent, &rc );
dwStyle = WS_VISIBLE | WS_CHILD;
AdjustWindowRect( &rc, dwStyle, FALSE );
m_hWnd = CreateWindow( TEXT("D3DSaverWndClass"), m_strWindowTitle, dwStyle,
rc.left, rc.top, rc.right-rc.left, rc.bottom-rc.top,
m_hWndParent, NULL, m_hInstance, this );
m_Monitors[0].hWnd = m_hWnd;
GetClientRect( m_hWnd, &m_rcRenderTotal );
GetClientRect( m_hWnd, &m_rcRenderCurDevice );
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 );
m_hWnd = CreateWindow( TEXT("D3DSaverWndClass"), m_strWindowTitle, dwStyle,
rc.left, rc.top, rc.right-rc.left, rc.bottom-rc.top,
NULL, NULL, m_hInstance, this );
m_Monitors[0].hWnd = m_hWnd;
GetClientRect( m_hWnd, &m_rcRenderTotal );
GetClientRect( m_hWnd, &m_rcRenderCurDevice );
break;
case sm_full:
// Create windows for each monitor. Note that m_hWnd is NULL when CreateWindowEx
// is called for the first monitor, so that window has no parent. Windows for
// additional monitors are created as children of the window for the first monitor.
dwStyle = WS_VISIBLE | WS_POPUP;
m_hWnd = NULL;
for( DWORD iMonitor = 0; iMonitor < m_dwNumMonitors; iMonitor++ )
{
MonitorInfo* pMonitorInfo;
pMonitorInfo = &m_Monitors[iMonitor];
if( pMonitorInfo->hMonitor == NULL )
continue;
rc = pMonitorInfo->rcScreen;
pMonitorInfo->hWnd = CreateWindowEx( WS_EX_TOPMOST, TEXT("D3DSaverWndClass"),
m_strWindowTitle, dwStyle, rc.left, rc.top, rc.right - rc.left,
rc.bottom - rc.top, m_hWnd, NULL, m_hInstance, this );
if( pMonitorInfo->hWnd == NULL )
return E_FAIL;
if( m_hWnd == NULL )
m_hWnd = pMonitorInfo->hWnd;
}
}
if ( m_hWnd == NULL )
return E_FAIL;
return S_OK;
}
//-----------------------------------------------------------------------------
// Name: DoSaver()
// Desc: Run the screensaver graphics - may be preview, test or full-on mode
//-----------------------------------------------------------------------------
HRESULT CD3DScreensaver::DoSaver()
{
HRESULT hr;
// Figure out if we're on Win9x
OSVERSIONINFO osvi;
osvi.dwOSVersionInfoSize = sizeof(osvi);
GetVersionEx( &osvi );
m_bIs9x = (osvi.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS);
// If we're in full on mode, and on 9x, then need to load the password DLL
if ( m_SaverMode == sm_full && m_bIs9x )
{
// Only do this if the password is set - check registry:
HKEY hKey;
if ( RegCreateKeyEx( HKEY_CURRENT_USER, REGSTR_PATH_SCREENSAVE, 0, NULL, 0, KEY_READ, NULL, &hKey, NULL ) == ERROR_SUCCESS )
{
DWORD dwVal;
DWORD dwSize = sizeof(dwVal);
if ( (RegQueryValueEx( hKey, REGSTR_VALUE_USESCRPASSWORD, NULL, NULL,
(BYTE *)&dwVal, &dwSize ) == ERROR_SUCCESS) && dwVal )
{
m_hPasswordDLL = LoadLibrary( TEXT("PASSWORD.CPL") );
if ( m_hPasswordDLL )
m_VerifySaverPassword = (VERIFYPWDPROC)GetProcAddress( m_hPasswordDLL, "VerifyScreenSavePwd" );
RegCloseKey( hKey );
}
}
}
// Initialize the application timer
DXUtil_Timer( TIMER_START );
if( !m_bErrorMode )
{
// Initialize the app's custom scene stuff
if( FAILED( hr = OneTimeSceneInit() ) )
return DisplayErrorMsg( hr, MSGERR_APPMUSTEXIT );
// Do graphical init stuff
if ( FAILED(hr = Initialize3DEnvironment()) )
return hr;
}
// Flag as screensaver running if in full on mode
if ( m_SaverMode == sm_full )
{
BOOL bUnused;
SystemParametersInfo( SPI_SCREENSAVERRUNNING, TRUE, &bUnused, 0 );
}
// Message pump
BOOL bGotMsg;
MSG msg;
msg.message = WM_NULL;
while ( msg.message != WM_QUIT )
{
bGotMsg = PeekMessage( &msg, NULL, 0, 0, PM_REMOVE );
if( bGotMsg )
{
TranslateMessage( &msg );
DispatchMessage( &msg );
}
else
{
Sleep(10);
if( m_bErrorMode )
{
UpdateErrorBox();
}
else
{
Render3DEnvironment();
}
}
}
return S_OK;
}
//-----------------------------------------------------------------------------
// Name: ShutdownSaver()
// Desc:
//-----------------------------------------------------------------------------
VOID CD3DScreensaver::ShutdownSaver()
{
// Unflag screensaver running if in full on mode
if ( m_SaverMode == sm_full )
{
BOOL bUnused;
SystemParametersInfo( SPI_SCREENSAVERRUNNING, FALSE, &bUnused, 0 );
}
// Kill graphical stuff
Cleanup3DEnvironment();
// Let client app clean up its resources
FinalCleanup();
// Unload the password DLL (if we loaded it)
if ( m_hPasswordDLL != NULL )
{
FreeLibrary( m_hPasswordDLL );
m_hPasswordDLL = NULL;
}
// Post message to drop out of message loop
PostQuitMessage( 0 );
}
//-----------------------------------------------------------------------------
// Name: SaverProcStub()
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -