О десктопах, семафорах, и блокировке windows

Ответы на вопросы, чаще всего задаваемые в форумах VBStreets. Для тех, кому лень искать.
ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

О десктопах, семафорах, и блокировке windows

Сообщение ANDLL » 14.02.2006 (Вт) 23:14

Данный пример показывает, как работать с десктопами и семафорами.

Что будем делать?
Мы напишем программульку, которая будет создавать отдельный "рабочий стол" в системе, и переключать пользователя в него. В этом рабочем столе мы будем запускать эмулятор VMWare(в примере он заменем блокнотом, т.к. VMWare есть не у всех). Эмулятор будет выполняться совершенно обослебоно от всего, в новом рабочем столе нельзя вызвать деспетчер задач(т.е. вызвать можно, а вот увидеть - нет). Кроме того, единственное рабочее служебное сочетание клавиш - Win+L. С помощью него можно сделать logout(и то не так то просто...), однако разблокировать windows все равно нельзя...
После того как VMWare(или блокнот, или любая другая прога) закроется, появится окошко, с предложением ввести пароль. Замечу, что окошко можно закрыть, нажав на крестик, однако это будет весма не благоразумно, т.к. программа "разблокировки" то завершиться, а вот обратного переключения не произойдет, и пред вами предстанет голый десктоп :) Для разблокировки надо ввести пароль, AAA.Только после этого произойдет "взаправдашняя" разблокировка.

Как?

Очень просто :) Для начала рекомендую таки почитать разделы MSDN, касайющиеся десктоп и светофоров. Для удобства приведу тут код двух программ, для блокировки и соответственно разблокировки. Во вложении - полный пример. Тестировлся в WinXP, должен работать в win2k. В не WinNT можете и не пытаться :)

Блокировщик:
Код: Выделить всё
Sub Main()
    Dim hSemaphore As Long, hDesktop As Long
    Dim hOldDesktop As Long
    'Создаем семафор
    hSemaphore = CreateSemaphore(0, 0, 10, SEMAPHORE_NAME)
    'Узнаем, какой сейчас десктоп
    hOldDesktop = GetThreadDesktop(GetCurrentThreadId)
    'Создаем новый десктоп
    hDesktop = CreateDesktopA(DESKTOP_NAME, 0, 0, 0, GENERIC_ALL, 0)
    If hDesktop <> 0 Then
        'Переключаемся в новый десктоп
        SwitchDesktop hDesktop
        Dim sti As STARTUPINFO, spi As PROCESS_INFORMATION
        sti.cb = Len(sti)
        sti.lpDesktop = DESKTOP_NAME
        'Запускаем VMWare или чтото еще...
        CreateProcess WMWARE_EXECUTABLE_NAME, "", 0&, 0&, 0, NORMAL_PRIORITY_CLASS, ByVal 0&, CurDir, sti, spi
        'Ждем его закрытия
        WaitForSingleObject spi.hProcess, -1
        'Запускаем "анлокер". Если он вдруг не запустится, пеняйте на себя :)
        CreateProcess App.Path & "\WaitForShutdown.exe", "", 0&, 0&, 0, NORMAL_PRIORITY_CLASS, ByVal 0&, CurDir, sti, spi
        'Ждем, когда загорится семафор
        Call WaitForSingleObject(hSemaphore, -1)
        'Сворачиваем лавочку: закрываем дескрипторы и переключаемся в обычный десктоп
        CloseHandle hSemaphore
        SwitchDesktop hOldDesktop
        CloseDesktop hDesktop
    Else
        MsgBox "Can't create desktop" & vbCrLf & Err.LastDllError
    End If
    CloseDesktop hOldDesktop
End Sub



Разблокировщик:
Код: Выделить всё
Dim hSemaphore As Long

Private Sub cmdOK_Click()
    If txtPwd.Text = "AAA" Then
        'Если пароль правильный
        'Уменьшим семафор
        ReleaseSemaphore hSemaphore, 2, 0
        CloseHandle hSemaphore
        'И выходим
        End
    Else
        MsgBox "You type wrong password!", vbExclamation
    End If
End Sub

Private Sub Form_Load()
    'Пытаемся открыть семафор
    hSemaphore = OpenSemaphore(GENERIC_ALL, 0, SEMAPHORE_NAME)
    If hSemaphore = 0 Then
        MsgBox "Can't open semaphore", vbCritical
        End
    End If
End Sub


Для наглядной демонстрации
Запустите файл project1.exe, лежащий в архиве. Убедитесь, что WaitForShutdown.exe лежит с ним в одной папке. Иначе разблокировки не будет.

Ну собственно все. Благодарность Темычу за некоторые консультации :) Ну и всем остальным, за идейное вдохновление :)


Пример: http://www.danasoft.ru/users/andll/win_locker.zip
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

Вернуться в Популярные вопросы

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 11

    TopList