Что будем делать?
Мы напишем программульку, которая будет создавать отдельный "рабочий стол" в системе, и переключать пользователя в него. В этом рабочем столе мы будем запускать эмулятор 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