Gibt es ein Programm (oder eine Eingabeaufforderung) mit der ich meinen Bildschirm schwarz oder nicht reagieren lassen kann, bis eine Taste (bsw "ü") gedrückt?

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
Woher ich das weiß:eigene Erfahrung – Ich mach das seit 30 Jahren

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)

Woher ich das weiß:Hobby – Programmiere seit 7 Jahren, mache Office kram etc

I20love09horses 
Beitragsersteller
 18.03.2024, 22:16

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!

Erzesel  19.03.2024, 08:21
@I20love09horses
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.


Erzesel  19.03.2024, 02:54

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

CSANecromancer  19.03.2024, 04:09
@Erzesel

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


I20love09horses 
Beitragsersteller
 18.03.2024, 22:18

Ja, das geht schon in die richtige Richtung, es sollte nur

  1. direkt nach Start ausgeführt werden
  2. nur mit einer bestimmten Taste beendet werden, nicht durch einfach Maus bewegen ect
gufrastella  18.03.2024, 22:21
@I20love09horses

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

I20love09horses 
Beitragsersteller
 18.03.2024, 22:25
@gufrastella

Hab ich gemacht, aber wie schon gesagt, da geht es schon wieder weg, sobald ich einfach die Maus bewege