Windows 2. Bildschirm: Programme einem Fenster zuweisen?

6 Antworten

Ich weiß nicht wie gut Du dich mit einem Editor auskennst und ob Du schon Programmiert hast...

Wenn nicht ist das Deine Chance Dich daran zu versuchen.

PosStart.cmd

<# : batch portion  diese Zeile nicht veränden !!!!!!!
@echo off


  rem hier Arbeitsverzeichnis hinter dem Gleichheitszeichen angeben oder leer lassen... zb set workingDir="F:/test"
set workingDir=
if defined workingDir  cd /d %workingDir%


  rem Aufruf: call :PositionedStart XPosition YPosition "Zielprogramm"   optional: Parameter "Parameter" ...
  rem Programm aufrufen Parameter 1 und 2 sind die x und y-Posiotion der  linken oberen Fensterecke
call :PositionedStart 300 50 "C:\Windows\Notepad.exe"  "blub  test&test  .txt" 


  rem zur Demo: warte 2 Sekunden...
Timeout 2
  rem ...starte Nächstes Fenster
set workingDir="c:\windows"
if defined workingDir  cd /d %workingDir%
call :PositionedStart 1000 300 cmd /k "echo das Arbeitsverzeichnis ist nun %workingDir%"
  rem sekunden sekunden warten und Console  beenden
timeout 10 >nul


  rem ab hier nichts verändern!!!!!!!!!!!!!!!!!
exit /b
:::  subroutines ::::
:PositionedStart %*=Kommandozeile
if defined workingDir cd /d "%workingDir%"
(for %%I in (%*) do @echo(%%~I)|powershell -noprofile "[Array]$argv = $input|?{$_}; iex (${%~f0}|out-string)"
exit /b
: end batch / begin powershell #>


  #definiere Funktion zum verschieben des Fensters
Function Set-WindowPos( $WindowHandle,[int]$X,[int]$Y) {
    Add-Type @"
        using System;
        using System.Runtime.InteropServices;
        public class PosWnd {
            [DllImport("user32.dll")]
            [return: MarshalAs(UnmanagedType.Bool)]
            public static extern bool GetWindowRect(IntPtr hWnd, out RECT lpRect);


            [DllImport("User32.dll")]
             public extern static bool MoveWindow(IntPtr handle, int x, int y, int width, int height, bool redraw);
        }
        public struct RECT
        {
            public int Left;
            public int Top;
            public int Right;
            public int Bottom;
        }
"@
    $Rectangle = New-Object RECT
    $Return = [PosWnd]::GetWindowRect($WindowHandle,[ref]$Rectangle)
    $Width = $Rectangle.Right - $Rectangle.Left
    $Height = $Rectangle.Bottom - $Rectangle.Top
    If ($Return) {
        $Return = [PosWnd]::MoveWindow($WindowHandle, $x, $y, $Width, $Height, $True)
    }
}




  #Displaygrenzen Anzeigen
Add-Type -AssemblyName System.Windows.Forms
[System.Windows.Forms.Screen]::AllScreens


  # von  der Batch übergebene Argumente für Start-Process anpassen...
$argv=$argv
$MyProcess=$argv[2];
$ArgumentList=$argv|select -skip 3|%{
    if ($_.trim() -like "* *") {
        '"{0}"' -f $_.trim(); #Start-Process  erwartet Argumente mit Leerzeichen in "".
    }else{
        $_.trim();
    }
};
if (-not $ArgumentList)  {$ArgumentList+=' ' }; # die Argumentliste daf  nicht $Null sein


$proc=Start-Process -filepath $MyProcess -ArgumentList $ArgumentList -PassThru; #Prozes starten
$TimeOut=5000;  # für  Programme  welche  extrem lange starten diesen Wert erhöhen
do{
    sleep -Milliseconds 10;
    $WHandle=(Get-Process -ID $proc.id).mainwindowhandle; #Fensterhandle für den gestarteten Prozess ermittel
    $TOut+=10;
}
while($WHandle -eq 0 -and $TOut -lt $TimeOut);  #Maximal 5000 Millisekunden die Schleife laufen lassen, wenn bis dahin kein Windowhandle bekannt ist, bleibt das Fenster wo es ist!
  # verschiebe das Fenster...
Set-WindowPos $WHandle $argv[0] $argv[1]


Da ich kein Freund von irgendwelchen Programmen aus dem Netz bin mache ich derartigen "Kleinkram" selbst und gebe auch nur Sachen weiter über die der Nutzer Kontrolle hat.

Sicher gibt es Irgendwo ein fertiges Programm, welches das Gleiche kann, aber wozu suchen, wenn man das ganze auch mit ein Paar Zeilen Batch, C# und Powershell gebacken bekommt .

Was musst Du tun?

  • Kopiere das Script in Deinen Editor.
  • trage gebenenfalls das Arbeisverzeichnis hinter workingDir= ein.
  • statt des Notepad Aufrufs , rufe dein gewünschtes Programm auf.
  • Speicher die Batch unter "PosStart.cmd" oder einem anderen Namen. wichtig ist nur die Endung .cmd .

Je nach Deiner Monitor-Konfiguration sind sowohl negative Werte wie auch Werte welche größer als die eines Monitors sind möglich. Beim Ausführen eines Aufrufs wird die Displaykonfiguration angezeigt auch die zu den Monitoren gehörigen Grenzwerte. Die Displaynamen haben nichts mit den Anzeigeeinstellunen zu tun!

Ich habe das Script mit heißer Nadel gestrickt. Das heist keine Fehlerbehandlung und nichts keine Prüfung ob Du das Fenster jenseits der Monitore positionierst.

Spiele einfach in kleinen Schritten mit den X und Y -Werten., dan siehst Du wo die Reise hingeht.

Das heiße Nadel bedeute auch, das sich die Routine nich darum kümmert , wenn ein Programm wie Gimp oder OpenOffice mit einem Begrüßungsfenster startet (dann wird nur dieses verschoben).

Mehr war auf die Schnelle nicht drinn.

Wenn du nicht weißt wie Du hiermit umgehen sollst. kannst Du ggf. auch den Programmnamen und das Arbeitsverzeichnis posten und ich passe die Aufrufe für dich an.

Egal was Du mit diesem Script machst, für Dein System Besteht keinerlei Gefahr.

Das Schlimmst was Passieren kann, wäre das Du das Fenster außerhalb des Bildschirms platzierst, aber spätestens nach dem Ausloggen werden alle Fenster geschlossen oder Du killst das Programm im Taskmanager...

Woher ich das weiß:eigene Erfahrung – Ich mach das seit 30 Jahren

Diese Einstellung gibt es leider nicht. Du kannst aber das Fenster (z.B. den Explorer) öffnen und dann auf den richtigen Bildschirm ziehen.

Wenn du dann das Programm wieder schliesst, wird es beim nächsten Öffnen direkt auf dem richtigen Bildschirm angezeigt.

Woher ich das weiß:eigene Erfahrung

Nein gibt es nicht aber 80% der Programme (Firefox ,Thunderbird, VLC ,OBS ,Kdeblive ,LibreIffice ) Speichern die Position wo man sie offen hatte (so ist es bei mir) was heißt man braucht sowas grundsätzlich nicht

Woher ich das weiß:Berufserfahrung – Ich weiß alles über Windows

Nein, gibt es nicht.. Aber die Fenster verschieben ist doch jetzt nicht soo viel Arbeit ;)

Woher ich das weiß:Berufserfahrung – Tätig als Service Desk Agent
tastatur12345 
Fragesteller
 13.07.2020, 08:06

Ich weiß, viel Arbeit ist es nicht, aber wäre trotzdem praktisch gewesen :)

0
FinnTastica  13.07.2020, 08:07
@tastatur12345

Das entsprechende fenster geht nach dem entsprechenden verschieben immer auf dem Bildschirm auf. Das sollte doch auch passen ^^

0