format-c
Goto Top

Fenster mit VBS neu positionieren

Hallo zusammen!

Ich suche nach einer Möglichkeit die Position eines Fensters mit möglichst wenig Interaktion (d.h. automatisch, vorzugweise mittels eines VBScripts) und ausschließlich mit Bordmitteln von Windows zu verändern. Das Ausführen von "Fremdsoftware" ist auf dem Rechner per GP unterbunden, womit Tools wie AutoHotkey wegfallen.

Ich stelle mir ein solches Scenario vor:
  1. Die Anwendung wird per Batch-Skript gestartet.
  2. In dem selben Skript wird anschließend ein VBScript gestartet, welches
    1. das gewünschte Fenster anhand des Fenstertitels ermittelt,
    2. die Abmessungen des Desktops erfasst (zwei Monitore, unterschiedliche Auflösung),
    3. Das Fenster so über beide Bildschirme ausbreitet, dass es ein in das von den Monitoren gebildete Polygon eingeschriebenes Rechteck maximaler Größe darstellt. (geiler Satz, was? face-smile) Die Logik ist an dieser Stelle nebensächlich – die Aufgabe reduziert sich darauf, ein bestimmtes Fenster mit gegebenen Koordinaten (links,oben),(rechts,unten) neu zu positionieren.

Hat jemand Erfahrung damit?


Danke im Voraus
format_c

Content-ID: 222755

Url: https://administrator.de/contentid/222755

Ausgedruckt am: 22.11.2024 um 06:11 Uhr

rubberman
rubberman 22.11.2013 um 19:07:30 Uhr
Goto Top
Hallo format_c

VBScript bietet dafür keinerlei Möglichkeiten. PowerShell vielleich, aber da fehlt mir die Erfahrung.
msmvps.com/blogs/richardsiddaway/archive/2011/07/23/moving-windows.aspx

Grüße
rubberman
iTesla
iTesla 22.11.2013 um 20:41:03 Uhr
Goto Top
Zitat von @rubberman:

Hallo format_c

VBScript bietet dafür keinerlei Möglichkeiten. PowerShell vielleich, aber da fehlt mir die Erfahrung.
[http://msmvps.com/blogs/richardsiddaway/archive/2011/07/23/moving-windows.aspx
msmvps.com/blogs/richardsiddaway/archive/2011/07/23/moving-windows.aspx]

Grüße
rubberman

.. schau mal hier:
http://www.vbaccelerator.com/home/VB/Tips/Working_with_Multiple_Monitor ...
rubberman
rubberman 22.11.2013 um 21:04:24 Uhr
Goto Top
Hallo iTesla,

das ist kein VBScript! Dort ist es leider nicht möglich auf die WinAPI zuzugreifen face-sad

Grüße
rubberman
format-c
format-c 23.11.2013 um 11:59:01 Uhr
Goto Top
Gegen die Verwendung von PS wäre auch nichts einzuwenden face-smile
colinardo
colinardo 23.11.2013 aktualisiert um 12:07:36 Uhr
Goto Top
Hallo format_c,
mit VBS kannst du es wie schon gesagt vergessen (Fehlende Unterstützung der Win32API).
Mit Powershell hatte ich mal eine Prozedur geschrieben, die eine Anwendung an einer bestimmten Position startet. Leider funktioniert sie bei bestimmten Fenstertypen nicht, musst du also mit deiner Anwendung ausprobieren:

function initTools() {
    [String]$SourceCode = @"  
Namespace colinardo
Public Class MyFunctions
<System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential)> _
    Private Structure RECT
        Public left As Integer
        Public top As Integer
        Public right As Integer
        Public bottom As Integer
    End Structure

    <System.Runtime.InteropServices.DllImport("user32.dll")> _  
    Private Shared Function MoveWindow(ByVal hWnd As System.IntPtr, ByVal x As Integer, ByVal y As Integer, ByVal nWidth As Integer, ByVal nHeight As Integer, ByVal bRepaint As Boolean) As Boolean
    End Function

    <System.Runtime.InteropServices.DllImport("user32.dll")> _  
    Private Shared Function GetWindowRect(ByVal hWnd As System.IntPtr, <System.Runtime.InteropServices.Out()> ByRef lpRect As RECT) As <System.Runtime.InteropServices.MarshalAs(System.Runtime.InteropServices.UnmanagedType.Bool)> Boolean
    End Function

    <System.Runtime.InteropServices.DllImport("user32.dll")> _  
    Private Shared Function SetForegroundWindow(ByVal hWnd As System.IntPtr) As Boolean
    End Function

    Public Shared Function StartAppAtPosition(strPath As String, posX As Integer, posY As Integer, Optional intWidth As Integer = 0, Optional intHeight As Integer = 0) As Boolean
        Dim proc As New System.Diagnostics.Process
        Dim hwnd As System.IntPtr
        Try
            proc.StartInfo.FileName = strPath
            proc.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Normal
            proc.Start()
            proc.WaitForInputIdle(True)
            While Not proc.HasExited
                proc.Refresh()
                If proc.MainWindowHandle <> System.IntPtr.Zero Then
                    hwnd = proc.MainWindowHandle
                    System.Console.WriteLine("Window Handle: " & hwnd.ToString())  
                    Exit While
                End If
            End While
            If SetForegroundWindow(hwnd) Then
                Dim rec As RECT 'structure to get size and location   
                If GetWindowRect(hwnd, rec) Then
                    Dim sizeW As Integer
                    Dim sizeH As Integer
                    If intWidth > 0 And intHeight > 0 Then
                        sizeW = intWidth
                        sizeH = intHeight
                    Else
                        sizeW = rec.right - rec.left 'Width size  
                        sizeH = rec.bottom - rec.top 'Heigth Size  
                    End If
                    Dim ret As Boolean = MoveWindow(hwnd, posX, posY, sizeW, sizeH, True)
                    If ret Then
                        Return True
                    Else
                        Return False
                    End If
                End If
            Else
                Return False
            End If
            Return False
        Catch ex As System.Exception
            System.Console.WriteLine(ex.Message)
            Return False
        End Try
    End Function
End Class
End Namespace
"@  
 add-type -TypeDefinition $SourceCode -Language VisualBasic
}

initTools

[colinardo.MyFunctions]::StartAppAtPosition("C:\Program Files\Paint.NET\PaintDotNet.exe",200,200,640,480)  
back-to-topBeschreibung der Parameter in der letzten Zeile des Scripts:
  • Parameter 1 = Pfad zum Programm das gestartet werden soll
  • Parameter 2 = X-Koordinate des Fensters
  • Parameter 3 = Y-Koordinate des Fensters
  • Parameter 4 = Breite des Fensters (Optional)
  • Parameter 5 = Höhe des Fensters (Optional)

Parameter 4 und 5 sind optional.

Grüße Uwe
format-c
format-c 26.11.2013 um 14:44:26 Uhr
Goto Top
Danke, Uwe, für das Skript. Es ist für mich schon mal ein guter Einstieg.