none
Insertion d'un autre programme dans c# RRS feed

  • Question

  • Salut tout le monde j'ai un formulaire qui contient un panel et je veut insérer dans ce panel Le programme de Winpad(Write.exe) a ce panel je sais que j'ouvre ce programme de la façon suivante MAIS POUR L'INTEGRE AU PANEL DE MON PROGRAMME la je sais pas si ca se fait

     [DllImport("USER32.dll")]
            static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent);
    
            [DllImport("USER32.dll")]  
            static extern bool MoveWindow(IntPtr hwnd, int x, int y, int cx, int cy, bool repaint);  
    
    private void tB_RJ_Click(object sender, EventArgs e)
            {
                try
                {
                    Process P = new Process();
                    P = Process.Start("c:\\Windows\\System32\\Write.exe", "C:/Rapport/RJ.rtf"); 
                    Thread.Sleep(500);
                    P.WaitForInputIdle();
                    SetParent(P.MainWindowHandle, panel1.Handle);
                    MoveWindow(P.MainWindowHandle, 0, 0, this.Width - 90, this.Height, false); 
                }
                catch { }
            } 

    J'ai essayer ca mais on dirais que win10 est récalcitrant

    Mais comment si cela ce fait, puis-je le faire

    Merci


    Daniel



    mercredi 4 novembre 2015 22:33

Réponses

    • Marqué comme réponse DanielMorais jeudi 12 novembre 2015 02:09
    vendredi 6 novembre 2015 12:27
  • Bnojour,

    En utilisant ProcessStartInfo j'ai inséré wordpad dans un panel.

    J'ai mis la propriete CreateNoWindow a true

       process.StartInfo.CreateNoWindow         = true    ;

    Comme dans l'exmaple du thread  Créer un IDE avec rendu "en direct"

    J'ai crée un panel avec un background noir qui recoit le handle du process wordpad (write.exe).

    Joël


    • Modifié JoelG_ mardi 10 novembre 2015 07:09 typo
    • Marqué comme réponse DanielMorais jeudi 12 novembre 2015 02:09
    mardi 10 novembre 2015 07:08
  • Bonjour, DanielMorais,

    J’ai testé votre extrait de code mais n’ai pas observé d’irrégularités. Si vous augmentez l’intervalle dans Thread.Sleep() à 1500 ou 2500 ms, est-ce que cela apporte un changement ?

    Cordialement,
    Dimitar

    jeudi 5 novembre 2015 21:38
    Modérateur
  • Salut tout le monde j'ai un formulaire qui contient un panel et je veut insérer dans ce panel Le programme de Winpad(Write.exe) a ce panel je sais que j'ouvre ce programme de la façon suivante MAIS POUR L'INTEGRE AU PANEL DE MON PROGRAMME la je sais pas si ca se fait

     [DllImport("USER32.dll")]
            static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent);
    
            [DllImport("USER32.dll")]  
            static extern bool MoveWindow(IntPtr hwnd, int x, int y, int cx, int cy, bool repaint);  
    
    private void tB_RJ_Click(object sender, EventArgs e)
            {
                try
                {
                    Process P = new Process();
                    P = Process.Start("c:\\Windows\\System32\\Write.exe", "C:/Rapport/RJ.rtf"); 
                    Thread.Sleep(500);
                    P.WaitForInputIdle();
                    SetParent(P.MainWindowHandle, panel1.Handle);
                    MoveWindow(P.MainWindowHandle, 0, 0, this.Width - 90, this.Height, false); 
                }
                catch { }
            } 

    J'ai essayer ca mais on dirais que win10 est récalcitrant

    Mais comment si cela ce fait, puis-je le faire

    Merci


    Daniel



         J'aurai essayer mais ca fonctionne pas Write.exe ne le permet pas

         La seule commande que j'ai trouver qui semblais fonctionner est celle-ci avec certain exe seulement comme

        

         Notepad.exe de Windows

    try { var p = Process.Start(Environment.GetEnvironmentVariable("windir")
    + \\notepad.exe"); Thread.Sleep(2500); SetParent(p.MainWindowHandle, this.Handle); } catch { }


         Mais plutôt null pour lire un fichier .RTF qui contient des tableaux.


    Daniel

    • Marqué comme réponse DanielMorais jeudi 12 novembre 2015 02:09
    vendredi 6 novembre 2015 17:54
  • Bonjour encore merci mais j'ai ce code et ca fonctionne toujours pas

    using System;
    using System.Diagnostics;
    using System.Runtime.InteropServices; 
    using System.Threading;
    using System.Windows.Forms;
    
    
    namespace DMApp1
    {
        public partial class mForm : Form
        {  
            public mForm()
            {
                InitializeComponent();
            }
    
            [System.Runtime.InteropServices.DllImport("user32.dll", SetLastError = true)] 
            static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndParent);
           
            private void tB_RJ_Click(object sender, EventArgs e)
            {
                 try
                {
                    var p = Process.Start(Environment.GetEnvironmentVariable("windir") + "\\write.exe", "C:/Rapport/RJ.rtf");
                    p.StartInfo.CreateNoWindow = true;
                    Thread.Sleep(500); 
                    SetParent(p.MainWindowHandle, this.panel1.Handle);
                   
                }
                catch { } 
            }
           
    
        }
    }
    


    Daniel

    • Marqué comme réponse DanielMorais jeudi 12 novembre 2015 02:09
    mercredi 11 novembre 2015 15:07
  • Bonjour encore merci mais j'ai ce code et ca fonctionne toujours pas

    using System;
    using System.Diagnostics;
    using System.Runtime.InteropServices; 
    using System.Threading;
    using System.Windows.Forms;
    
    
    namespace DMApp1
    {
        public partial class mForm : Form
        {  
            public mForm()
            {
                InitializeComponent();
            }
    
            [System.Runtime.InteropServices.DllImport("user32.dll", SetLastError = true)] 
            static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndParent);
           
            private void tB_RJ_Click(object sender, EventArgs e)
            {
                 try
                {
                    var p = Process.Start(Environment.GetEnvironmentVariable("windir") + "\\write.exe", "C:/Rapport/RJ.rtf");
                    p.StartInfo.CreateNoWindow = true;
                    Thread.Sleep(500); 
                    SetParent(p.MainWindowHandle, this.panel1.Handle);
                   
                }
                catch { } 
            }
           
    
        }
    }
    


    Daniel

    Finalement j'ai réussi avec cette façon de faire

    using System; using System.Diagnostics; using System.Runtime.InteropServices; using System.Threading; using System.Windows.Forms; namespace DMApp1 { public partial class mForm : Form { public mForm() { InitializeComponent(); } [System.Runtime.InteropServices.DllImport
    ("user32.dll", SetLastError = true)] static extern IntPtr SetParent(IntPtr hWndChild,
    IntPtr hWndParent); [System.Runtime.InteropServices.DllImport("user32.dll",
    SetLastError = true)] internal static extern bool MoveWindow(IntPtr hWnd,
    int X, int Y, int nWidth, int nHeight, bool bRepaint); private void tB_RJ_Click(object sender, EventArgs e) { try { Process p = Process.Start("write.exe",
    "C:\\Rapport\\RJ.rtf"); p.StartInfo.CreateNoWindow = true; Thread.Sleep (200); SetParent(p.MainWindowHandle, panel1.Handle); MoveWindow(p.MainWindowHandle, 0, 0, this.panel1.Width
    ,this.Height, true); } catch { } } } }

    Merci de votre coup de main.



    Daniel

    • Marqué comme réponse DanielMorais jeudi 12 novembre 2015 02:09
    jeudi 12 novembre 2015 02:08

Toutes les réponses

  • Bonjour, DanielMorais,

    J’ai testé votre extrait de code mais n’ai pas observé d’irrégularités. Si vous augmentez l’intervalle dans Thread.Sleep() à 1500 ou 2500 ms, est-ce que cela apporte un changement ?

    Cordialement,
    Dimitar

    jeudi 5 novembre 2015 21:38
    Modérateur
  • Non Malheureusement

    cela ne fait qu'ouvrir le programme a l'extérieure du panel et de la forme comme deux programme ouvert un par dessus l'autre et non dans le panel Control du formulaire


    Daniel

    vendredi 6 novembre 2015 02:33
    • Marqué comme réponse DanielMorais jeudi 12 novembre 2015 02:09
    vendredi 6 novembre 2015 12:27
  • Salut tout le monde j'ai un formulaire qui contient un panel et je veut insérer dans ce panel Le programme de Winpad(Write.exe) a ce panel je sais que j'ouvre ce programme de la façon suivante MAIS POUR L'INTEGRE AU PANEL DE MON PROGRAMME la je sais pas si ca se fait

     [DllImport("USER32.dll")]
            static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent);
    
            [DllImport("USER32.dll")]  
            static extern bool MoveWindow(IntPtr hwnd, int x, int y, int cx, int cy, bool repaint);  
    
    private void tB_RJ_Click(object sender, EventArgs e)
            {
                try
                {
                    Process P = new Process();
                    P = Process.Start("c:\\Windows\\System32\\Write.exe", "C:/Rapport/RJ.rtf"); 
                    Thread.Sleep(500);
                    P.WaitForInputIdle();
                    SetParent(P.MainWindowHandle, panel1.Handle);
                    MoveWindow(P.MainWindowHandle, 0, 0, this.Width - 90, this.Height, false); 
                }
                catch { }
            } 

    J'ai essayer ca mais on dirais que win10 est récalcitrant

    Mais comment si cela ce fait, puis-je le faire

    Merci


    Daniel



         J'aurai essayer mais ca fonctionne pas Write.exe ne le permet pas

         La seule commande que j'ai trouver qui semblais fonctionner est celle-ci avec certain exe seulement comme

        

         Notepad.exe de Windows

    try { var p = Process.Start(Environment.GetEnvironmentVariable("windir")
    + \\notepad.exe"); Thread.Sleep(2500); SetParent(p.MainWindowHandle, this.Handle); } catch { }


         Mais plutôt null pour lire un fichier .RTF qui contient des tableaux.


    Daniel

    • Marqué comme réponse DanielMorais jeudi 12 novembre 2015 02:09
    vendredi 6 novembre 2015 17:54
  • Bnojour,

    En utilisant ProcessStartInfo j'ai inséré wordpad dans un panel.

    J'ai mis la propriete CreateNoWindow a true

       process.StartInfo.CreateNoWindow         = true    ;

    Comme dans l'exmaple du thread  Créer un IDE avec rendu "en direct"

    J'ai crée un panel avec un background noir qui recoit le handle du process wordpad (write.exe).

    Joël


    • Modifié JoelG_ mardi 10 novembre 2015 07:09 typo
    • Marqué comme réponse DanielMorais jeudi 12 novembre 2015 02:09
    mardi 10 novembre 2015 07:08
  • Bonjour encore merci mais j'ai ce code et ca fonctionne toujours pas

    using System;
    using System.Diagnostics;
    using System.Runtime.InteropServices; 
    using System.Threading;
    using System.Windows.Forms;
    
    
    namespace DMApp1
    {
        public partial class mForm : Form
        {  
            public mForm()
            {
                InitializeComponent();
            }
    
            [System.Runtime.InteropServices.DllImport("user32.dll", SetLastError = true)] 
            static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndParent);
           
            private void tB_RJ_Click(object sender, EventArgs e)
            {
                 try
                {
                    var p = Process.Start(Environment.GetEnvironmentVariable("windir") + "\\write.exe", "C:/Rapport/RJ.rtf");
                    p.StartInfo.CreateNoWindow = true;
                    Thread.Sleep(500); 
                    SetParent(p.MainWindowHandle, this.panel1.Handle);
                   
                }
                catch { } 
            }
           
    
        }
    }
    


    Daniel

    • Marqué comme réponse DanielMorais jeudi 12 novembre 2015 02:09
    mercredi 11 novembre 2015 15:07
  • Bonjour encore merci mais j'ai ce code et ca fonctionne toujours pas

    using System;
    using System.Diagnostics;
    using System.Runtime.InteropServices; 
    using System.Threading;
    using System.Windows.Forms;
    
    
    namespace DMApp1
    {
        public partial class mForm : Form
        {  
            public mForm()
            {
                InitializeComponent();
            }
    
            [System.Runtime.InteropServices.DllImport("user32.dll", SetLastError = true)] 
            static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndParent);
           
            private void tB_RJ_Click(object sender, EventArgs e)
            {
                 try
                {
                    var p = Process.Start(Environment.GetEnvironmentVariable("windir") + "\\write.exe", "C:/Rapport/RJ.rtf");
                    p.StartInfo.CreateNoWindow = true;
                    Thread.Sleep(500); 
                    SetParent(p.MainWindowHandle, this.panel1.Handle);
                   
                }
                catch { } 
            }
           
    
        }
    }
    


    Daniel

    Finalement j'ai réussi avec cette façon de faire

    using System; using System.Diagnostics; using System.Runtime.InteropServices; using System.Threading; using System.Windows.Forms; namespace DMApp1 { public partial class mForm : Form { public mForm() { InitializeComponent(); } [System.Runtime.InteropServices.DllImport
    ("user32.dll", SetLastError = true)] static extern IntPtr SetParent(IntPtr hWndChild,
    IntPtr hWndParent); [System.Runtime.InteropServices.DllImport("user32.dll",
    SetLastError = true)] internal static extern bool MoveWindow(IntPtr hWnd,
    int X, int Y, int nWidth, int nHeight, bool bRepaint); private void tB_RJ_Click(object sender, EventArgs e) { try { Process p = Process.Start("write.exe",
    "C:\\Rapport\\RJ.rtf"); p.StartInfo.CreateNoWindow = true; Thread.Sleep (200); SetParent(p.MainWindowHandle, panel1.Handle); MoveWindow(p.MainWindowHandle, 0, 0, this.panel1.Width
    ,this.Height, true); } catch { } } } }

    Merci de votre coup de main.



    Daniel

    • Marqué comme réponse DanielMorais jeudi 12 novembre 2015 02:09
    jeudi 12 novembre 2015 02:08
  • Bonjour,

    Voici mon code.

     Process process = new Process();
                ProcessStartInfo psi = new ProcessStartInfo();
    
                psi.FileName = "write.exe";
                psi.Arguments = "c:\\temp\\AfxDlg.rtf";
                
                process.StartInfo = psi;
                process.StartInfo.CreateNoWindow = true;
                process.StartInfo.RedirectStandardOutput = false;
                process.StartInfo.UseShellExecute = true;
    
                process.StartInfo.WindowStyle = ProcessWindowStyle.Minimized;
    
                process.Start();
    
                while (process.MainWindowHandle.Equals(IntPtr.Zero))
                {
                    Thread.Sleep(10);
                    process.Refresh();
                }
    
                SetParent(process.MainWindowHandle, panel1.Handle);
                SetWindowPos(process.MainWindowHandle, IntPtr.Zero, 0, 0, 600, 200, 0);

    Je pense le problème viens que vous n'attendez pas que la valeur MainWindowHandle ne soit plus null avant d'affecter le handle au Panel.

    il faut utiliser la fonction Refresh pour mettre a jour cette propriété.

    https://msdn.microsoft.com/fr-fr/library/system.diagnostics.process.mainwindowhandle(v=vs.110).aspx

    Joël

    jeudi 12 novembre 2015 06:28