Est-il possible pour une application .NET de saisir toutes les poignées de fenêtre actuellement ouvertes, et de déplacer/redimensionner ces fenêtres? Je pense que c'est possible avec P/Invoke, mais je me demandais s'il y avait des wrappers de code managé pour cette fonctionnalité.Saisir et déplacer des fenêtres d'application à partir d'une application .NET?
Répondre
Oui, il est possible d'utiliser l'API Windows.
Ce message contient des informations sur la façon d'obtenir toutes les poignées de fenêtre de processus actifs: http://www.c-sharpcorner.com/Forums/ShowMessages.aspx?ThreadID=35545
using System;
using System.Diagnostics;
class Program
{
static void Main()
{
Process[] procs = Process.GetProcesses();
IntPtr hWnd;
foreach(Process proc in procs)
{
if ((hWnd = proc.MainWindowHandle) != IntPtr.Zero)
{
Console.WriteLine("{0} : {1}", proc.ProcessName, hWnd);
}
}
}
}
Et vous pouvez alors déplacer la fenêtre en utilisant l'API Windows: http://www.devasp.net/net/articles/display/689.html
[DllImport("User32.dll", ExactSpelling = true, CharSet = System.Runtime.InteropServices.CharSet.Auto)]
private static extern bool MoveWindow(IntPtr hWnd, int x, int y, int cx, int cy, bool repaint);
...
MoveWindow((IntPtr)handle, (trackBar1.Value*80), 20 , (trackBar1.Value*80)-800, 120, true);
Voici les Paramètres de la fonction MoveWindow:
Pour déplacer la fenêtre, nous utilisons la fonction MoveWindow, qui prend la poignée de fenêtre, les coordonnées pour le coin en haut, ainsi que la largeur désirée et la hauteur de la fenêtre , sur la base de l'écran coordonnées. La fonction de MoveWindow est définie comme:
MoveWindow (HWND hwnd, int nx, int nY, int nWidth, int nHeight, BOOL bRepaint);
Le drapeau bRepaint détermine si la zone client doit être invalidée, ce qui provoque un message WM_PAINT à envoyer, ce qui permet la zone client d'être repeintes. En tant que de côté, les coordonnées d'écran peuvent être obtenus en utilisant un appel similaire à GetClientRect (GetDesktopWindow(), & rcDesktop) avec rcDesktop étant une variable de type RECT, passé par référence.
(http://windows-programming.suite101.com/article.cfm/client_area_size_with_movewindow)
+1 belle réponse. –
Utilisez une turk mécanique - il suffit de faire apparaître une boîte de message et demander à l'utilisateur de le faire pour vous. Assurez-vous de fournir des instructions détaillées. : P Désolé, juste m'amuser ici ... –