Zentrieren Sie das nicht modale Fenster auf der AnzeigeHallo, ich versuche, den schnellsten Weg zu finden, um ein Fenster in die Mitte der Benutzeranzeige zu verschieben.
Modale Fenster werden automatisch auf dem Bildschirm zentriert, daher weiß ich, dass JMP irgendwie erkennen kann, wo ein Fenster platziert werden soll, aber ich habe nur einige relativ langsame Problemumgehungen gefunden, um dies mit nicht-modalen Fenstern zu tun. Unten ist das JSL-Skript, das ich derzeit verwende, um die Bildschirmgröße zu bestimmen und ein neues Fenster zu zentrieren.
Gibt es einen schnelleren Weg? Vielen Dank!
win2 = NewWindow("Test Window");
winSize = win2 << GetWindowSize();
win2 << ShowWindow(0);
testwin = NewWindow("test", << ShowWindow(0));
testwin << Maximize Window(1);
dispsize = testwin << Get Window Size;
testwin << CloseWindow();
win2 << MoveWindow(dispsize[1]/2 - winsize[1]/2, dispsize[2]/2 - winsize[2]/2);
win2 << ShowWindow(1);SkripterstellungWindowsBetreff: Nicht-modales Fenster auf dem Display zentrierenIhre Methode ist die Methode, die ich normalerweise verwende.
Betreff: Nicht-modales Fenster auf dem Display zentrierenMeiner Erfahrung nach ist die <<FENSTERGRÖSSE erhalten=""></FENSTERGRÖSSE> Methode ist nicht zuverlässig.Das Problem ist das <<FENSTERGRÖSSE erhalten=""></FENSTERGRÖSSE> gibt keine physischen Pixel zurück, sondern logische Pixel (betroffen von der Windows-Anzeigeskalierung), während <<FENSTER verschieben=""> verwendet physische Pixel.Auch JMP im Allgemeinen und<CODE class=" language-jsl"> <<FENSTERGRÖSSE erhalten=""></FENSTERGRÖSSE> Insbesondere wird es nicht aktualisiert, wenn sich die Windows-Anzeigeskalierung ändert (wenn ein Benutzer beispielsweise JMP auf einem Laptop startet und später einen Monitor anschließt).
Ich führe das folgende PowerShell-Skript von JMP aus, um die tatsächliche Bildschirmauflösung zu erhalten, und verwende diese Informationen, um Fenster entsprechend zu platzieren (Sie müssen PowerShell mit starten -Umgehung der Ausführungsrichtlinie :
Add-Type @"
using System;
using System.Runtime.InteropServices;
public class PInvoke {
[DllImport("user32.dll")] public static extern IntPtr GetDC(IntPtr hwnd);
[DllImport("gdi32.dll")] public static extern int GetDeviceCaps(IntPtr hdc, int nIndex);
}
"@
$hdc = [PInvoke]::GetDC([IntPtr]::Zero)
[PInvoke]::GetDeviceCaps($hdc, 118) # width
[PInvoke]::GetDeviceCaps($hdc, 117) # height
Betreff: Nicht-modales Fenster auf dem Display zentrierenDas ist die Art von Hokuspokus, nach der ich gesucht habe, haha. Danke Jim und Jordan! Ich werde beide Optionen ausprobieren und sehen, was schneller und/oder zuverlässiger ist