Nichtmodales Fenster auf dem Display zentrierenHallo, ich versuche den schnellsten Weg zu finden, 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 nichtmodalen Fenstern zu erreichen. 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? Danke!
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);Automatisierung und SkripterstellungWindowsBetreff: Nichtmodales 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, welche schneller und/oder zuverlässiger ist
Betreff: Nichtmodales Fenster auf dem Display zentrierenMeiner Erfahrung nach ist das <<FENSTERGRÖSSE abrufen=""></FENSTERGRÖSSE> Methode ist nicht zuverlässig.Das Problem ist das <<FENSTERGRÖSSE abrufen=""></FENSTERGRÖSSE> gibt keine physischen Pixel zurück, sondern logische Pixel (beeinflusst von der Windows-Anzeigeskalierung), while <<FENSTER verschieben=""> verwendet physische Pixel.Auch JMP im Allgemeinen und<CODE class=" language-jsl"> <<FENSTERGRÖSSE abrufen=""></FENSTERGRÖSSE> Insbesondere wird es nicht aktualisiert, wenn sich die Windows-Anzeigeskalierung ändert (z. B. wenn ein Benutzer 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 nutze diese Informationen, um Fenster entsprechend zu platzieren (Sie müssen Powershell mit starten). -ExecutionPolicy-Umgehung :
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: Nichtmodales Fenster auf dem Display zentrierenIhre Methode ist die Methode, die ich normalerweise verwende.
Betreff: Nicht-modales Fenster auf dem Display zentrierenHallo,
Vielen Dank für Ihren Tipp! Es ist zwar schon Jahre her, aber immer noch relevant: Wie überträgt man diese Informationen (über die Bildschirmgröße) mit „Programm ausführen“ von PowerShell nach JMP?
Betreff: Nicht-modales Fenster auf dem Display zentrierenSie können Text als Lesefunktion verwenden () und die Zeichenfolge mithilfe von Wörtern aufteilen ()
powershell_code ="
Add-Type -AssemblyName System.Windows.Forms
$primary = [System.Windows.Forms.Screen]::PrimaryScreen
Write-Output $primary.Bounds.Width
Write-Output $primary.Bounds.Height
";
result = Run Program(
Executable( "powershell.exe" ),
Options( {"-Command", powershell_code} ),
Read Function( "text" )
);
{w, h} = Transform Each( {str}, Words( result, "\!n\!r" ), Num( str ) );
