Bonjour,
J'éssaye depuis plusieurs semaines d'encrer une application dans une winform cependant mon programme me lance l'erreur suivante :
L'application sur laquelle j'effectue mon test est Mozilla Firefox donc pour résumé l'application lance bien Firefox mais ne peut pas l'ancrer car c'est comme s'il ne le détectait pas alors que quand notepad se lance il est directement ancrer voici mon codeLes informations demandées ne sont plus disponibles, car le processus n'est plus exécuté.
J'ai également essayer avec cette méthode mais j'ai le même problème
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59 IntPtr appWin1; IntPtr appWin2; [DllImport("user32.dll", SetLastError = true)] private static extern long SetParent(IntPtr hWndChild, IntPtr hWndNewParent); [DllImport("user32.dll", SetLastError = true)] private static extern long SetWindowPos(IntPtr hwnd, long hWndInsertAfter, long x, long y, long cx, long cy, long wFlags); [DllImport("user32.dll", SetLastError = true)] private static extern bool MoveWindow(IntPtr hwnd, int x, int y, int cx, int cy, bool repaint); private void button1_Click(object sender, EventArgs e) { try { ProcessStartInfo ps1 = new ProcessStartInfo("notepad.exe"); ps1.WindowStyle = ProcessWindowStyle.Minimized; Process p1 = Process.Start(ps1); Thread.Sleep(1000); // Allow the process to open it's window appWin1 = p1.MainWindowHandle; // Put it into this form SetParent(appWin1, this.Handle); // Move the window to overlay it on this window MoveWindow(appWin1, 0, 0, this.Width / 2, this.Height, true); ProcessStartInfo ps2 = new ProcessStartInfo(@"C:\Program Files\Mozilla Firefox\firefox.exe"); //ps2.WindowStyle = ProcessWindowStyle.Minimized; Process p2 = Process.Start(ps2); Thread.Sleep(1000); // Allow the process to open it's window appWin2 = p2.MainWindowHandle; // Put it into this form SetParent(p2.MainWindowHandle, this.Handle); MoveWindow(p2.MainWindowHandle, this.Width / 2, 0, this.Width / 2, this.Height, true); } catch (Exception ex) { MessageBox.Show(this, ex.Message, "Error"); } } private void Form1_Resize(object sender, EventArgs e) { if (this.appWin1 != IntPtr.Zero) { MoveWindow(appWin1, 0, 0, this.Width / 2, this.Height, true); } if (this.appWin2 != IntPtr.Zero) { MoveWindow(appWin2, this.Width / 2, 0, this.Width, this.Height, true); } //base.OnResize(e); }
j'ai vu qu'il y avait sûrement la possibilité d'utiliser WH_SHELL mais je ne sais pas du tout comment l'utiliser
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 ProcessStartInfo info = new ProcessStartInfo(); info.FileName = "firefox.exe"; info.Arguments = ""; info.UseShellExecute = true; info.CreateNoWindow = true; info.WindowStyle = ProcessWindowStyle.Maximized; info.RedirectStandardInput = false; info.RedirectStandardOutput = false; info.RedirectStandardError = false; System.Diagnostics.Process p = System.Diagnostics.Process.Start(info); p.WaitForInputIdle(); Thread.Sleep(3000); Process[] p1; if (p.MainWindowHandle == null) { List<String> arrString = new List<String>(); foreach (Process p2 in Process.GetProcesses()) { // Console.WriteLine(p1.MainWindowHandle); arrString.Add(Convert.ToString(p2.ProcessName)); } p1 = Process.GetProcessesByName("Firefox"); //p.WaitForInputIdle(); Thread.Sleep(5000); SetParent(p1[0].MainWindowHandle, tabControl1.TabPages[0].Handle); } else { SetParent(p.MainWindowHandle, tabControl1.TabPages[0].Handle); }
Partager