it4baer
Goto Top

Mit vbs monitor herausfinden

Hallo,

ich möchte eine vbs Applikation "links" oben starten.

Das Problem ist, von den 3 Monitoren gibt es manchmal nur 1 <- dieser ist dann der Hauptmonitor, wann anders sind es 3 und dann ist links oben nicht der Hauptmonitor sonder 2 Monitore weiter links <- also - 2x 1980px

mit
Set monitor = objWMIService.ExecQuery("Select * from Win32_DesktopMonitor")

kann ich die Availability herausfinden und weiß so, ob ich 1 oder 3 Monitore habe.

Jetzt stellt sich doch die Frage, ob man das nicht Intelligenter machen könnte (weil was wäre, wenn ich mal 3 Monitore habe, aber der Standard-Monitor ist doch ganz links <= in diesen Fall würde ich das Fenster ins Nirvana verschieben).

Vielen Dank für jede Idee

Grüße

Content-ID: 346661

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

Ausgedruckt am: 22.11.2024 um 10:11 Uhr

it4baer
it4baer 18.08.2017 um 08:10:59 Uhr
Goto Top
Nachtrag:

also wenn man es genau nimmt, Interessieren mich "diese Zahlen":

monitorpos
colinardo
Lösung colinardo 18.08.2017 aktualisiert um 13:10:49 Uhr
Goto Top
Servus,
diese Info bekommst du über die Win32_API und GetSystemMetrics, man beachte die Hinweise auf Multiple Monitor System Metrics.

Beispiel mit Powershell um an die X, Y Kordinaten des Virtual Screens zu kommen:
$tools = Add-Type –memberDefinition '  
    [DllImport("user32.dll")] public static extern int GetSystemMetrics(int smIndex);  
' -name "windowtools" -namespace Win32Functions –passThru -EA SilentlyContinue  

$virtual_x = $tools::GetSystemMetrics(76)
$virtual_y = $tools::GetSystemMetrics(77)
$virtual_width = $tools::GetSystemMetrics(78)
$virtual_height = $tools::GetSystemMetrics(79)
Als VBA lässt sich das so nutzen
Public Declare Function GetSystemMetrics Lib "user32.dll" (ByVal smIndex As Integer) As Integer  

Sub GetVirtualScreenCoordinates()
    MsgBox "X: " & GetSystemMetrics(76) & vbNewLine & "Y: " & GetSystemMetrics(77)  
End Sub
WICHTIG VBS kann keine Win32_Funktionen einbinden, VBA hingegen schon!

Grüße Uwe
it4baer
it4baer 18.08.2017 um 13:18:49 Uhr
Goto Top
Hm,

vielen Dank

=> kann man die SystemMetrics auch in vbs bekommen?
colinardo
Lösung colinardo 18.08.2017 aktualisiert um 14:02:11 Uhr
Goto Top
Du kannst ja das Powershell-Skript in einen Oneliner wandeln und dir den benötigten Wert über shell.Exec zurückgeben lassen.

Hier ein Beispiel nur für die X-Koordinate:
Set objShell = CreateObject("Wscript.Shell")  
Set oExec = objShell.Exec ("powershell -NoProfile -WindowStyle Hidden -Ex Bypass -C ""(Add-Type -memberDefinition '[DllImport(\""user32.dll\"")] public static extern int GetSystemMetrics(int smIndex);' -passthru -Name 'tools')::GetSystemMetrics(76)""")  
Do While oExec.Status = 0
     WScript.Sleep 100
Loop
MsgBox oExec.StdOut.ReadAll()
it4baer
it4baer 18.08.2017 um 13:58:58 Uhr
Goto Top
sorry, dass ich so blöd frage...

aber wenn ich das so ausführe, kommt erst ein schwarzes "powershell-fenster" und erst wenn ich das fenster schließe kommt der "rückgabewert"

=> kann ich noch mit im befehl einbauen, dass er selbst beendet?

powershell -Ex Bypass -C ""(Add-Type -memberDefinition '[DllImport(\""user32.dll\"")] public static extern int GetSystemMetrics(int smIndex);' -passthru -Name 'tools')::GetSystemMetrics(76);exit

<- funktioniert leider nicht
colinardo
Lösung colinardo 18.08.2017 aktualisiert um 14:02:35 Uhr
Goto Top
Das Powershell-Fenster wird schon per Default geschlossen! Kopiere den Code nochmal ich hatte zwei Anführungszeichenen zu wenig drin.
Funktioniert hier einwandfrei.