Ho il codice qui sotto:Uso SetWindowPos in C# per spostare le finestre
namespace WindowMover
{
using System.Windows.Forms;
static class Logic
{
[DllImport("user32.dll", EntryPoint = "SetWindowPos")]
public static extern IntPtr SetWindowPos(IntPtr hWnd, int hWndInsertAfter, int x, int Y, int cx, int cy, int wFlags);
public static void Move()
{
const short SWP_NOMOVE = 0X2;
const short SWP_NOSIZE = 1;
const short SWP_NOZORDER = 0X4;
const int SWP_SHOWWINDOW = 0x0040;
Process[] processes = Process.GetProcesses(".");
foreach (var process in processes)
{
var handle = process.MainWindowHandle;
var form = Control.FromHandle(handle);
if (form == null) continue;
SetWindowPos(handle, 0, 0, 0, form.Bounds.Width, form.Bounds.Height, SWP_NOZORDER | SWP_SHOWWINDOW);
}
}
}
}
Questo dovrebbe spostare ogni finestra sul mio desktop a 0,0 (x, y) e mantenere le stesse dimensioni. Il mio problema è che solo l'app chiamante (costruita in C#) viene spostata.
Devo usare qualcos'altro oltre a Control.FromHandle (IntPtr)? Questo troverà solo controlli dotnet? Se sì, cosa dovrei usare?
Inoltre, il secondo 0 a SetWindowPos era solo un int a caso mi attengo in là, io non sono sicuro di cosa usare per int hWndInsertAfter
Che dire di processi con più finestre come pidgin?
Si sta facendo lì, ma alcune finestre (sembra come quei processi che hanno più finestre) non sono tutti in movimento. BTW, rispondi a molte delle mie domande, spero di avere un po 'di know-how di programmazione .... – Matt
Matt: Ho aggiunto la soluzione per questo: non ho visto quella risposta fino alla fine. EnumWindows itererà attraverso tutte le finestre di livello superiore (non solo le finestre MainWindowHandle), che dovrebbero darti quello che vuoi. –