Manipuler une fenêtre d'un process externe o_O ?

Résolu
h0peless Messages postés 2 Date d'inscription jeudi 10 avril 2008 Statut Membre Dernière intervention 27 novembre 2008 - 26 nov. 2008 à 23:23
cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 - 27 nov. 2008 à 09:18
Plop all !

J'essaye en C# de redimensionner/déplacer des fenêtres appartenant à des processus externes comme par exemple firefox, notepad, etc... seulement mon code ne marche pas et je ne comprends pas pourquoi =o/

[DllImport("user32.dll")]
static extern bool MoveWindow(IntPtr hWnd, int X, int Y, int nWidth, int nHeight, bool bRepaint);

Plus loin dans le main...

Process[] localProc = Process.GetProcesses();

 for (int i = 0; i < localProc.Length; i++)
{
                if ( (localProc[i].MainWindowHandle != IntPtr.Zero) && (localProc[i].MainWindowTitle != null) )
                {
                             IntPtr ptrWin = GetWindow(localProc[i].MainWindowHandle, 0);

                             // MoveWindow renvoie true à chaque fois
                             MoveWindow(ptrWin, 0, 0, 512, 512, true);
                }
}

Si vous avez une idée, n'hésitez pas !
merci d'avance !

3 réponses

cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
27 nov. 2008 à 00:03
Essayes voire ceci:

    public class Program
    {
        [DllImport("user32.dll", SetLastError = true)]
        internal static extern IntPtr GetForegroundWindow();


        [DllImport("user32.dll", SetLastError = true)]
        internal static extern bool GetWindowRect(IntPtr hWnd, ref RECT rect);


        [DllImport("user32.dll", SetLastError = true)]
        internal static extern void MoveWindow(IntPtr hwnd, int X, int Y, int nWidth, int nHeight, bool bRepaint);


        internal struct RECT
        {
            public int left;
            public int top;
            public int right;
            public int bottom;
        }


        public static void Main(string[] args)
        {
            RECT Rect = new RECT();


            Thread.Sleep(2000);


            IntPtr id = GetForegroundWindow();
            Random myRandom = new Random();
            GetWindowRect(id, ref Rect);
            MoveWindow(id, myRandom.Next(1024), myRandom.Next(768), Rect.right - Rect.left, Rect.bottom - Rect.top, true);
        }
    }





<hr />
-Blog-
-Site Perso-
3
h0peless Messages postés 2 Date d'inscription jeudi 10 avril 2008 Statut Membre Dernière intervention 27 novembre 2008
27 nov. 2008 à 00:10
Yep ! ce code que j'avais déjà trouvé redimensionne seulement la fenêtre au premier plan !
Soit la console win32 de mon projet test lol ^^

mais finalement je viens de réussir à l'instant =D
enfait il suffisait de mettre à chaque fois un appel à OpenIcon(HWND) de user32.dll qui permet de restaurer une fenêtre correspondant au handle ^^ en gros à chaque processus présent dans la barre de tâche, il faut d'abord faire un OpenIcon puis un MoveWindow ^^

merci d'avoir répondu rapidement =o]
0
cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
27 nov. 2008 à 09:18
C'est pour cela qu'il y a un thread.sleep, ca donne le temps de donner la main à un autre programme. Ouvre un notepad, lance le programme, et pendant les 2 secondes, donne la main à ton notepad.
Tu verras que c'est lui qui est déplacé et pas la console....

Maintenant, si la fenêtre n'est pas ouverte mais qu'elle est dans la barre des taches (ce que tu n'avais pas précisé), je me doute qu'il ne puisse pas la déplacée et qu'il faille d'abord l'ouvrir, c'est pas illogique ;-)

<hr />
-Blog-
-Site Perso-
0
Rejoignez-nous