Gibt es ein Programm (oder eine Eingabeaufforderung) mit der ich meinen Bildschirm schwarz oder nicht reagieren lassen kann, bis eine Taste (bsw "ü") gedrückt?
wird?
Ja, ich brauche das gerade unbedingt. Nein, ich will damit nichts verbotenes machen. Ja, ich bin der Admin. Ja, es ist mein Computer.
Es soll sozusagen Passwortgesichert sein, nur, dass sich der Bildschirm erst aktiviert, wenn diese "Passwort-Taste" gedrückt wird.
6 Antworten
Ich setze mal wieder auf Powershell. In diesem speziellen Fall wegen der leichteren Aufrufbarkeit als Hybrid-Batch.
also ich habe es schon mit Power Shell probiert, allerdings hat mein Computer so starke Sicherheitsvorkehrungen
Paranoia?
...dass ich ihn damit gerade zum Absturz...
den Code hätte ich zu gern gesehen....
Die folgende Powershell-hybrid-Batch macht nichts weiter als
- den Explorer/Desktop zu beenden
- den Rahmen und die Bedienelemente des Powershell-Fensters entfernen
- das rahmenlose Fenster auf Bildschirmgröße resizen
- den Consolcursor ausblenden
- und geduldig warten , bis ü gedrückt wird
- der Explorer/Desktop wird wieder gestartet
Es nutzt nichts das Powershellfenster per ALT+F4 zu schließen, da ja kein Desktop vorhanden ist, welcher irgendwelche Nutzeraktionen entgegennimmt. (Es bleibt jedoch der Ausweg über den Affengriff oder Reset)
Es sind keine Adminrechte nötig und es werden keine Sicherheitsrichtlinien tangiert! Die Batch kann (im Gegensatz zu einem Powershellscript) ohne weiteres im Autostartordner platziert werden. (...oder als neuer REG_SZ-Wert "Shell" unter "HKEY_Current_User\Software\Microsoft\Windows NT\CurrentVersion\Winlogon" als Shell eingetragen werden) !!!Vorsicht!!! das ändern der Standard-Shell (Explorer) in eine Batch ist nicht ganz unproblematisch und sollte nur erfolgen , wenn Tests keine Probleme zeigen... unbedingt am Ende den Explorer starten!!
demo.cmd
<# : Batch Abschnitt Zeile nicht ändern
start "" powershell "iex (gc '%~f0' -Encoding UTF8 -Raw | out-string)"
exit /b
: Ende Batch #>
taskkill /f /im "explorer.exe" #kill den Explorer ohne Autorestart (Stop-Process kann das nicht ohne weiteres)
mode 20,10
$code = @"
[DllImport("user32.dll")] public static extern int GetWindowLong(IntPtr hWnd, int nIndex);
[DllImport("user32.dll")] public static extern int SetWindowLong(IntPtr hWnd, int nIndex, int dwNewLong);
[DllImport("user32.dll")] public static extern bool SetWindowPos(IntPtr hWnd,IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, uint uFlags);
"@
$User32=Add-Type -MemberDefinition $code -Name Win32Util -Passthru
Add-Type -a System.Windows.Forms
$Display = [System.Windows.Forms.Screen]::PrimaryScreen.Bounds
$Hwnd=(Get-Process -ID $pid).MainWindowHandle
$CurrendStyle = $User32::GetWindowLong($Hwnd,-16)
$BorderlesStyle = $CurrendStyle -band -570163201
[void]$User32::SetWindowLong($Hwnd,-16, $BorderlesStyle)
[void]$User32::SetWindowPos($Hwnd,0,$Display.X,$Display.Y,$Display.Width,$Display.Height,0x20)
[console]::CursorVisible = $false
do{
$keyInfo = [Console]::ReadKey($True)
} until ($keyInfo.KeyChar -eq 'ü') #wait for Key 'ü'
explorer
wie gesagt , das ding ist ein Powershellscript, dem ich lediglich "trickreich" einen "Batchpelz" übergestreift habe. damit umschiffe ich so ziehmlich alle Hemmnisse im Bezug auf Powershell.
Hier noch das Powershellscript ohne Abkürzungen und kommentiert, damit Du auch siehst, woher irgendwelche Werte kommen und weshalb ich bestimmte Dinge tue, welche man eigentlich nicht in Powershell erwartet...
( -570163201 , 0x20 oder -16 ...etc ist nicht unbedingt plausibel🥱)
Hide_Desktop.ps1
#.ps1-Dateien für Powershell 5.1 mit Unicodezeichen (Umlauten) als UTF8 mit BOM Speichern!!!!
#define Flags
#https://learn.microsoft.com/en-us/windows/win32/winmsg/window-styles
[Flags()] enum WindowStyles {
WS_BORDER = 0x800000
WS_CAPTION = 0xc00000
WS_CHILD = 0x40000000
WS_CLIPCHILDREN = 0x2000000
WS_CLIPSIBLINGS = 0x4000000
WS_DISABLED = 0x8000000
WS_DLGFRAME = 0x400000
WS_GROUP = 0x20000
WS_HSCROLL = 0x100000
WS_MAXIMIZE = 0x1000000
WS_MAXIMIZEBOX = 0x10000
WS_MINIMIZE = 0x20000000
WS_MINIMIZEBOX = 0x20000
WS_OVERLAPPED = 0x0
WS_POPUP = 0x80000000
WS_THICKFRAME = 0x40000
WS_SYSMENU = 0x80000
WS_TABSTOP = 0x10000
WS_VISIBLE = 0x10000000
WS_VSCROLL = 0x200000
WS_OVERLAPPEDWINDOW = 0 -bor 0xc00000 -bor 0x80000 -bor 0x40000 -bor 0x20000 -bor 0x10000
WS_POPUPWINDOW = 0x80000000 -bor 0x800000 -bor 0x80000
}
#WS_OVERLAPPEDWINDOW = 0x00cf0000 (WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX)
#WS_POPUPWINDOW = 0x80880000 (WS_POPUP | WS_BORDER | WS_SYSMENU)
#https://learn.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-setwindowlonga
[Flags()] enum GWL{
GWL_WNDPROC = -4
GWL_HINSTANCE = -6
GWL_HWNDPARENT = -8
GWL_STYLE = -16
GWL_EXSTYLE = -20
GWL_USERDATA = -21
GWL_ID = -12
}
#https://learn.microsoft.com/en-us/windows/win32/winmsg/extended-window-styles
[Flags()] enum ExtendedWindowStyles {
WS_EX_DLGMODALFRAME = 0x0001
WS_EX_NOPARENTNOTIFY = 0x0004
WS_EX_TOPMOST = 0x0008
WS_EX_ACCEPTFILES = 0x0010
WS_EX_TRANSPARENT = 0x0020
WS_EX_MDICHILD = 0x0040
WS_EX_TOOLWINDOW = 0x0080
WS_EX_WINDOWEDGE = 0x0100
WS_EX_CLIENTEDGE = 0x0200
WS_EX_CONTEXTHELP = 0x0400
WS_EX_RIGHT = 0x1000
WS_EX_LEFT = 0x0000
WS_EX_RTLREADING = 0x2000
WS_EX_LTRREADING = 0x0000
WS_EX_LEFTSCROLLBAR = 0x4000
WS_EX_RIGHTSCROLLBAR = 0x0000
WS_EX_CONTROLPARENT = 0x10000
WS_EX_STATICEDGE = 0x20000
WS_EX_APPWINDOW = 0x40000
WS_EX_OVERLAPPEDWINDOW = (0x0100 -bor 0x0200)
WS_EX_PALETTEWINDOW = ( 0x100 -bor 0x80 -bor 0x8)
WS_EX_LAYERED = 0x00080000
WS_EX_NOINHERITLAYOUT = 0x00100000
WS_EX_LAYOUTRTL = 0x00400000
WS_EX_COMPOSITED = 0x02000000
WS_EX_NOACTIVATE = 0x08000000
}
#WS_EX_OVERLAPPEDWINDOW = (WS_EX_WINDOWEDGE | WS_EX_CLIENTEDGE)
#WS_EX_PALETTEWINDOW = (WS_EX_WINDOWEDGE | WS_EX_TOOLWINDOW | WS_EX_TOPMOST)
#https://learn.microsoft.com/de-de/windows/win32/api/winuser/nf-winuser-setwindowpos#parameters
[Flags()] enum SWPuFlags {
SWP_NoSize = 0x0001
SWP_NoMove = 0x0002
SWP_NoZOrder = 0x0004
SWP_NoRedraw = 0x0008
SWP_NoActive = 0x0010
SWP_FrameChanged = 0x0020
SWP_ShowWindow = 0x0040
SWP_HideWindow = 0x0080
SWP_NoCopyBits = 0x0100
SWP_NoOwnerZOrder = 0x0200
SWP_NoReposition = 0x0200
SWP_NoSendChanging = 0x0400
SWP_DeferErase = 0x2000
SWP_AsyncWindowPos = 0x4000
}
taskkill /f /im "explorer.exe" #kill Explorer without autorestart (Stop-Process works not for Explorer)
mode 20,10 #use Batchcommand to remove Quick&Dirty Screenbuffers/Scrollbars
#define access to needed systemfunctions
$code = @"
[DllImport("user32.dll")] public static extern int GetWindowLong(IntPtr hWnd, int nIndex);
[DllImport("user32.dll")] public static extern int SetWindowLong(IntPtr hWnd, int nIndex, int dwNewLong);
[DllImport("user32.dll")] public static extern bool SetWindowPos(IntPtr hWnd,IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, uint uFlags);
"@
$User32=Add-Type -MemberDefinition $code -Name Win32Util -Passthru
Add-Type -a System.Windows.Forms
$Display = [System.Windows.Forms.Screen]::PrimaryScreen.Bounds #Size of Fullscreen
$Hwnd = (Get-Process -ID $pid).MainWindowHandle #this Window
$CurrendStyle = $User32::GetWindowLong($Hwnd,[GWL]::GWL_STYLE)
$BorderElementsOff = -bnot([WindowStyles]::WS_CAPTION -bor [WindowStyles]::WS_THICKFRAME -bor [WindowStyles]::WS_MINIMIZE -bor [WindowStyles]::WS_MAXIMIZE -bor [WindowStyles]::WS_SYSMENU -bor [WindowStyles]::WS_VSCROLL -bor [WindowStyles]::WS_HSCROLL)
$BorderlesStyle = $CurrendStyle -band $BorderElementsOff
[void]$User32::SetWindowLong($Hwnd,[GWL]::GWL_STYLE, $BorderlesStyle)
[void]$User32::SetWindowPos($Hwnd,0,$Display.X,$Display.Y,$Display.Width,$Display.Height,0x20) #!!important!! SWP_FRAMECHANGED (0x0020) to recalculate/redraw the clientarrea at fullsize
[console]::CursorVisible = $false
do{
$keyInfo = [Console]::ReadKey($true)
} until ($keyInfo.KeyChar -eq 'ü')
explorer #restart Desktop
Sowas ist möglich ja, wenn du z.B. Kenntnisse in PowerShell oder AutoHotkey hast. Die habe ich aber nicht deswegen keine Ahnung wie so ein Script aussehen würde und die Funktionsweise wäre wahrscheinlich von der Version des Betriebssystems abhängig schätze ich mal.
Deswegen würde ich dir einfach Raten Windowstaste + L zu drücken um deinen Pc zu sperren, sodass man nur mit deinem Passwort reinkommt. Deinen Bildschirm ausschalten kannst du leider meistens ohne ein Script nicht, außer du hast einen Laptop und der hat die Funktion dafür (ging jedenfalls bei meinem alten)
starke Sicherheitsvorkehrungen, dass ich ihn damit gerade zum Absturz gebracht habe
Für mich hört sich dass eher an wie: "System kaputt gebastelt".
Heutzutage ist es garnicht mehr so einfach den Rechner zum Absturz zu bringen.
Das möglicherweise "inconsistente" System hat mich auch dazu bewogen, die Batch nicht automatisch als Shell in die Registry einzutragen.
Wenn du es uuuuuuuunbedingt so superspezifisch brauchst:
#include <conio.h>
#include <Windows.h>
using namespace std;
int main()
{
int key = 0;
SendMessage(handle, WM_SYSCOMMAND, SC_MONITORPOWER, 2);
while(1)
{
if (_kbhit())
{
key =_getch();
if (key == 'P')
break;
}
}
SendMessage(handle, WM_SYSCOMMAND, SC_MONITORPOWER, -1);
}
Nach eigenem Gusto anpassen, kompilieren und die .exe in den Autostart einhängen.
einfach den Monitor ausknipsen hat aber den Nachteil, das ein Unbefugter mit der Maus im Blindflug herumklicken kann oder der Fokus zum Fenster geht verloren und damit auch das einlesen des "Passbuchstaben"
...und nicht jeder Monitor reagiert (erwartungsgemäß) auf SC_MONITORPOWER
Schon richtig. Und wenn du einen Linux-Rechner oder etwas anderes POSIX-konformes hast, dann funktioniert auch _kbhit() nicht.
Aber ich denke, der Fragesteller will nur irgendeinen Trollblödsinn haben, weswegen ich auf Sicherheit oder Stabilität keinen Wert gelegt habe. Wenn der FS etwas besseres will, dann muss er es sich halt gefälligst selbst stricken, wenn ihm die ganzen vorgeschlagenen Methoden nicht taugen.
Hallo
Als Kommandozeile
scrnsave.scr -s
Mit Esc zurück zum Desktop
LG
gufrastella
Ja, das geht schon in die richtige Richtung, es sollte nur
- direkt nach Start ausgeführt werden
- nur mit einer bestimmten Taste beendet werden, nicht durch einfach Maus bewegen ect
Dann mach dir 'ne bat-Datei und setzt 'ne Verknüpfung in den Autostart
@echo off
echo set osh = wscript.CreateObject("wscript.Shell")>screensaver.vbs
echo osh.run "scrnsave.scr">>screensaver.vbs
echo set osh = nothing>>screensaver.vbs
call screensaver.vbs
del screensaver.vbs
Mit Taste Ent zurück zum Desktop
Hab ich gemacht, aber wie schon gesagt, da geht es schon wieder weg, sobald ich einfach die Maus bewege
Weißt du, wie ich das unterbinden kann?
reicht nicht einfach <Windows><L>?
Dann nimm den Ruhemodus
https://www.netzwelt.de/anleitung/160614-windows-10-so-richtet-shortcut-ruhmodus.html
Mhh, also ich habe es schon mit Power Shell probiert, allerdings hat mein Computer so starke Sicherheitsvorkehrungen, dass ich ihn damit gerade zum Absturz gebracht habe xD AutoHotkey kann ich ja mal probieren, danke!