Autor Beitrag
lolnowai
Hält's aus hier
Beiträge: 1



BeitragVerfasst: Di 12.02.08 19:40 
Moinmoin,
also einmal die Grundidee der Software:
Man hat eine WinForm mit einem TaoSdl Panel.
Dann kann man mit Hilfe einer ListBox aus den aktuell laufenden Prozessen einen auswaehlen und "in die Kontainerapplikation schieben".
Sprich es wird mithilfe der Api Funktion SetParent ein neues Parentfenster zugewiesen.

Man kann ohne Probleme jeden Prozess mit MainWindow in den Kontainer verschieben, das wieder "hinausschieben" geht jedoch nur, wenn innerhalb von einer Funktion das "einlagern" und "auslagern" geschiet.
Wenn man es z.B. auf 2 Buttons aufteilt (einer zum ein-, einer zum auslagern),
funktioniert das einlagern, beim auslagern jedoch verschwindet das MainWindow jedoch aus dem Kontainer und taucht auch nicht auf dem Desktop wieder auf (der Prozess laeuft aber weiter).

Erstmal ein bischen Code:
der Einlagerbutton funktioniert in etwa wie folgt:

ausblenden C#-Quelltext
1:
2:
IntPtr processWindowHandle = Process.GetProcessById(procId).MainWindowHandle;
SetParent(processWindowHandle, SdlPanel.Handle);

->procId enthaelt die ProzessId des einzulagernden Prozesses und SdlPanel.Handle ist der Windowhandle des SdlPanels welches als Kontainer arbeitet

der Auslagerbutton funktioniert genauso, nur das anstelle von SdlPanel.Handle new IntPtr(0) verwendet wird, welches den Desktop als Parent definiert.

SetParent ist wiefolgt importiert:
ausblenden C#-Quelltext
1:
2:
[DllImport("user32.dll", SetLastError = true)]
static extern IntPtr SetParent(IntPtr child, IntPtr newParent);



Also mein Problem ist, wenn ich folgenden Code benutzte:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
private void AllesClick(object sender, EventArgs e)
{
   IntPtr processWindowHandle = Process.GetProcessById(procId).MainWindowHandle;
   SetParent(processWindowHandle, SdlPanel.Handle);
   SetParent(processWindowHandle, new IntPtr(0));
}

funktioniert es Problemlos, teile ich es nun auf in:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
private void EinlagernClick(object sender, EventArgs e)
{
   IntPtr processWindowHandle = Process.GetProcessById(procId).MainWindowHandle;
   SetParent(processWindowHandle, SdlPanel.Handle);
}

und
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
private void AuslagernClick(object sender, EventArgs e)
{
   IntPtr processWindowHandle = Process.GetProcessById(procId).MainWindowHandle;
   SetParent(processWindowHandle, new IntPtr(0));
}

verschwindet das MainWindow des Prozesses einfach, der Prozess jedoch laeuft weiter.

Eventuell hat ja jemand eine Idee, woran das liegen koennte.
MfG

P.S. Wenn das, das falsche Forum fuer diese Frage ist tut es mir leid, ich war mir unsicher

Moderiert von user profile iconChristian S.: C#-Tags hinzugefügt