una - Usando SetWindowPos en C#para mover ventanas
superponer formulario c# (2)
Tengo el siguiente código:
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);
}
}
}
}
Se supone que esto mueve todas las ventanas de mi escritorio a 0,0 (x, y) y mantiene los mismos tamaños. Mi problema es que solo la aplicación de llamada (integrada en C #) se está moviendo.
¿Debo usar otra cosa que no sea Control.FromHandle (IntPtr)? ¿Encontrará esto solo controles dotnet? Si es así, ¿qué debo usar?
Además, el segundo 0 en SetWindowPos fue solo un int aleatorio. Me quedo ahí, no estoy seguro de qué usar para int hWndInsertAfter
¿Qué pasa con los procesos con múltiples ventanas como pidgin?
Jugado con esto. A ver si ayuda.
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);
}
}
}
}
Simplemente saque su Control.FromHandle y el formulario == cheque nulo. Usted debe ser capaz de hacer simplemente:
IntPtr handle = process.MainWindowHandle;
if (handle != IntPtr.Zero)
{
SetWindowPos(handle, 0, 0, 0, 0, 0, SWP_NOZORDER | SWP_NOSIZE | SWP_SHOWWINDOW);
}
Si agrega SWP_NOSIZE, no cambiará el tamaño de la ventana, pero seguirá colocándola.
Si desea afectar a todas las ventanas, no solo a la ventana principal, de cada proceso, puede considerar usar P / Invoke con EnumWindows lugar de recorrer la lista de procesos y usar MainWindowHandle.