J'ai le code ci-dessous:
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);
}
}
}
}
Ceci est censé déplacer chaque fenêtre de mon bureau à 0,0 (x, y) et conserver les mêmes tailles. Mon problème est que seule l'application appelante (construite en C #) est déplacée.
Dois-je utiliser autre chose que Control.FromHandle (IntPtr)? Cela ne trouvera-t-il que des contrôles dotnet? Si oui, que dois-je utiliser?
En outre, le deuxième 0 dans SetWindowPos était juste un int aléatoire que je colle là-dedans, je ne sais pas quoi utiliser pour int hWndInsertAfter
Qu'en est-il des processus avec plusieurs fenêtres comme pidgin?
Retirez simplement votre Control.FromHandle et le formulaire == null check. Vous devriez pouvoir simplement faire:
IntPtr handle = process.MainWindowHandle;
if (handle != IntPtr.Zero)
{
SetWindowPos(handle, 0, 0, 0, 0, 0, SWP_NOZORDER | SWP_NOSIZE | SWP_SHOWWINDOW);
}
Si vous ajoutez SWP_NOSIZE, il ne redimensionnera pas la fenêtre, mais la repositionnera quand même.
Si vous souhaitez effectuer toutes les fenêtres, pas seulement la fenêtre principale, de chaque processus, vous pouvez envisager d'utiliser P/Invoke avecEnumWindows au lieu d'itérer dans la liste Processus et en utilisant MainWindowHandle.
Joué avec ça. Voyez si cela aide.
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.Diagnostics;
namespace ConsoleTestApp
{
class Program
{
[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool SetForegroundWindow(IntPtr hWnd);
static void Main(string[] args)
{
Process[] processes = Process.GetProcesses();
foreach (var process in processes)
{
Console.WriteLine("Process Name: {0} ", process.ProcessName);
if (process.ProcessName == "WINWORD")
{
IntPtr handle = process.MainWindowHandle;
bool topMost = SetForegroundWindow(handle);
}
}
}
}