2015-09-13 2 views
0

Я создал простой пакетный сценарий для псевдо-блокировки компьютера, используя следующий код:Всегда поверх пакетного сценария

@ECHO OFF & setlocal ENABLEDELAYEDEXPANSION 
setlocal EnableDelayedExpansion 
color a 
TITLE Lock 
if not "%1" == "max" (
powershell -command "& { $x = New-Object -ComObject Shell.Application; $x.minimizeall() }" 
start /MAX cmd /c %0 max & exit/b 
) 
:Lock 
echo Please enter a password to lock your computer . . . 
powershell -Command $pword = read-host "Enter password" -AsSecureString ; $BSTR=[System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($pword) ; [System.Runtime.InteropServices.Marshal]::PtrToStringAuto($BSTR) > EOFlock.txt & set /p Pass1=<EOFlock.txt & del EOFlock.txt 
TITLE Lock 
taskkill /IM explorer.exe /F >nul 
cls 
echo Please type the password to unlock the computer . . . 
:Locked 
set /p Pass2= 
:Unlock 
if !Pass1! == !Pass2! (goto End) 
goto Locked 
:End 
start explorer.exe 
echo This Computer is unlocked. 

Я хочу это окно, чтобы остаться на вершине, и предпочтительно незапираемым, пока он не достиг конец файла. Тем не менее, я еще не нашел способа сделать это.

+1

На самом деле я не думаю, что есть способ в чистом пакете ... можно было бы с помощью VBScript или JavaScript ... такой подходит для вас, вы должны изменить свой пост добавить соответствующий тег (ы) ... – aschipfl

+0

Что касается реализации в PowerShell, вам может быть интересно [этот пост] (http://stackoverflow.com/a/12802050) ... – aschipfl

+0

Вместо «псевдоблокировки» экрана, почему действительно ли вы [блокируете экран] (https://technet.microsoft.com/en-us/library/dd315249.aspx)? –

ответ

1

Вы можете позвонить в PowerShell, который, в свою очередь, может позвонить в WinAPI ... по крайней мере, в Windows 8+ (возможно, и 7 предыдущих версий, вероятно, нет).

Это довольно просто:

  1. Вызов PowerShell
  2. Скажите ему работать независимо от контекста
  3. Использование SetWindowPos принести окно в передней
  4. Используйте GetConsoleWindow, чтобы узнать, какое окно, чтобы действовать на

Все это довольно аккуратно вписывается в одну команду:

@powershell -ExecutionPolicy UnRestricted -Command "(Add-Type -memberDefinition \"[DllImport(\"\"user32.dll\"\")] public static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int x,int y,int cx, int xy, uint flagsw);\" -name \"Win32SetWindowPos\" -passThru)::SetWindowPos((Add-Type -memberDefinition \"[DllImport(\"\"Kernel32.dll\"\")] public static extern IntPtr GetConsoleWindow();\" -name \"Win32GetConsoleWindow\" -passThru)::GetConsoleWindow(),-1,0,0,0,0,67)"