LockWorkStation для NT

From
Igor Vartanov (2:5025/38.70)
To
Oleg Bekhter
Date
2002-03-11T14:42:12Z
Area
SU.WINDOWS.NT.PROG
    Здравствуй, Oleg!

    Thursday March 07 2002 Oleg Bekhter сообщил Алексей Мамонов:

 OB> Как сделать это на NT я в старые добрые времена так и не нашел...
 OB> Пришлось делать через ScreenSaver с паролем.

    На самом деле все просто нужно делать руками - создать десктоп, переключиться на него и ждать правильного события (напр. горячей клавиши или правильного пароля :)), после чего отыграть назад.

────────────────────[ Begin of Windows Clipboard ]────────────────────
BOOL CALLBACK LockedDlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
{
    static ATOM aUnlock = GlobalAddAtom( _T("IV_UnlockDesktop") );

    switch(msg)
    {
    case WM_INITDIALOG:
        RegisterHotKey( hDlg, aUnlock, MOD_CONTROL | MOD_SHIFT, 'V' );
        break;
    case WM_HOTKEY:
        UnregisterHotKey( hDlg, aUnlock );
        GlobalDeleteAtom( aUnlock );
        EndDialog( hDlg, 0 );
        break;
    }
    return 0;
}

typedef struct tagDESKS
{
    HDESK deskGetBack;
    HDESK deskSwitchTo;
} DESKS, *PDESKS;

UINT WINAPI LockWStaThread( LPVOID pParam )
{
    PDESKS pdesks = (PDESKS)pParam;
    if( !SetThreadDesktop( pdesks->deskSwitchTo ) ||
        !SwitchDesktop( pdesks->deskSwitchTo ) )
    {
        CLastErrCodeMsg err;
        MessageBox( NULL, err.GetString(), _T("SwitchDesktop"), MB_OK );
    }
    else
    {
        DialogBox(GetModuleHandle( NULL ),
                    MAKEINTRESOURCE( IDD_UNLOCK ),
                    HWND_DESKTOP,
                    (DLGPROC)LockedDlgProc );
        SwitchDesktop( pdesks->deskGetBack );
    }
    CloseDesktop( pdesks->deskSwitchTo );
    delete pdesks;
    return 0;
}

void LockWorkstation()
{
    PDESKS pdesks = new DESKS;
    pdesks->deskGetBack  = GetThreadDesktop( GetCurrentThreadId() );
    pdesks->deskSwitchTo = CreateDesktop(
                                    _T("IV_LockedDesktop"),
                                    NULL, NULL, 0,
                                    DESKTOP_CREATEWINDOW |
                                    DESKTOP_SWITCHDESKTOP |
                                    DESKTOP_READOBJECTS |
                                    DESKTOP_WRITEOBJECTS,
                                    NULL );
    if( !pdesks->deskSwitchTo )
    {
        CLastErrCodeMsg err;
        MessageBox( NULL, err.GetString(), _T("CreateDesktop"), MB_OK );
    }
    else
    {
        UINT thrId;
        CloseHandle( (HANDLE) _beginthreadex(
                                        NULL, 0, LockWStaThread,
                                        pdesks, NULL, &thrId ) );
    }
}
────────────────────[  End of Windows Clipboard  ]────────────────────



    С уважением.

    Игорь

--- mailto: ivartanov@rsdn.ru  ( http://www.rsdn.ru )
 * Origin: Uh? (2:5025/38.70)