Avviare un’applicazione specificando le dimensioni delle finestra

Può succedere che in certe particolari situazioni sia necessario avviare un’applicazione con dimensioni della finestra e posizione fisse (computer adibiti a monitoraggi o per applicazioni legacy che non gestiscono correttamente il resize a dimensioni della finestra diversa).

Per farlo ci sono varie possibilità, se si hanno competenze di programmazione in.NET ci si può creare  una applicazione di stub che accetta in ingresso con parametro il path dell’applicazione, posizione e dimensione della finestra facendo uso tramite PInvoke della funzione API SetWindowPos.

Di seguito le definizioni necessarie in VB.Net per l’utilizzo della SetWindowPos:

Const HWND_NOTOPMOST As Int32 = -2
Const SWP_SHOWWINDOW As Int32 = &H40

<System.Runtime.InteropServices.DllImport(“User32.dll”)>
Public Shared Function SetWindowPos(ByVal hwnd As IntPtr, ByVal hWndInsertAfter As Int32,
   ByVal x As Int32, ByVal y As Int32,
   ByVal cx As Int32, ByVal cy As Int32,
   ByVal wFlags As Int32) As Int32
End Function

Di seguito invece il codice per avviare Notepad, attendere che la finestra sia attiva tramite il metodo WaitForInputIdle per essere certi che la proprietà MainWindowHandle contenga l’handle delle finestra che sarà poi passato alla SetWindowPos:

Using p As New System.Diagnostics.Process()
            p.StartInfo.FileName = “notepad”
            p.Start()
            p.WaitForInputIdle()
            SetWindowPos(p.MainWindowHandle, HWND_NOTOPMOST,
                0, 0, 800, 600,
                SWP_SHOWWINDOW)
End Using

Una seconda soluzione è quella di utilizzare l’utility free NirCmd che fra le varie cose permette di gestire delle attese e impostare dimensioni e posizione di una finestra attiva.

Di seguito il contenuto di un file cmd che avvia Notepad, attende 500 ms per essere certo che la finestra sia stata creata e poi ne imposta posizione e dimensione:

start notepad
nircmd.exe cmdwait 500 win setsize ititle “Senza nome – Blocco note” 30 0 800 600

Per  gestire l’attesa si utilizza l’opzione cmdwait, mentre per modificare posizione di una finestra si usa l’opzione win setsize. Si noti che la finestra viene individuata tramite il titolo della stessa specificato tramite il parametro ititle, questo perché dietro le quindi viene utilizzata probabilmente la chiamata alla funzione api FindWindow.

Per ulteriori informazioni si vedano i seguenti link NirCmd e NirCmd Command Reference – win.