2009-07-31 11 views
0

Ich habe eine Konsolenanwendung (SRMan.exe), die von System.Windows.Forms.Form abgeleitet ist. Ich könnte in der Lage sein, das Formular zu verstecken, während exe ausgeführt wird. i-Code verwendet wird, ist hierDen Griff eines versteckten Formulars bekommen

this.Opacity = 0; 
    this.Size = new Size(0, 0); 
    this.Location = new Point(-100, -100); 
    this.Visible = false; 

Aslo, Formulareigenschaften ShowIcon und ShowInTaskbar auf falsch konfiguriert.

aber ich kann ich das Fenster zu bekommen Griff die diesen Lauf process.code verwenden nicht in der Lage ist hier

Process[] process1 = Process.GetProcessesByName("SRMan"); 
IntPtr pt = process1[0].MainWindowHandle; 

Jede Hilfe ist willkommen!

Danke,
Karim.

Antwort

0

Sie können den Griff nicht einfach aus der Handle Eigenschaft des Formulars greifen? Alles, was von der Control Klasse abgeleitet ist, welche Forms das tun, wird eine Handle Eigenschaft haben.

Warum greifen Sie auf den Prozess zurück?

+0

ich den Prozess würde beginnen (SRMan.exe) aus einem anderen Prozess, und ich habe die Nachrichten in diesem laufenden Prozess posten Also muss ich Process [] process1 = Process.GetProcessesByName ("SRMan"); IntPtr pt = process1 [0]. MainWindowHandle; –

+1

als Sk93 weist darauf hin, versuchen Sie mit process1 [0]. WaitForInputIdle(); hat in der Vergangenheit auch für mich gearbeitet. –

2

An welchem ​​Punkt rufen Sie an:

Process[] process1 = Process.GetProcessesByName("SRMan"); 
IntPtr pt = process1[0].MainWindowHandle; 

pt als Null zurückgegeben wird oder „Mainwindowhandle“ kann eine Ausnahme auslösen, wenn das Hauptfenster Griff noch nicht erstellt.

Versuchen Sie Ihren Code zu ändern:

wird
Process[] process1 = Process.GetProcessesByName("SRMan"); 
process1[0].WaitForInputIdle(); 
IntPtr pt = process1[0].MainWindowHandle; 

wie dies Ihr Code zwingen, zu warten, bis der Prozess vollständig geladen ist. (MSDN article)

Als Beispiel der folgende Code funktioniert gut für mich:

private Thread thd; 

private void Form1_Load(object sender, EventArgs e) 
{    
    thd = new Thread(new ThreadStart(GetHandle)); 
    thd.Start(); 
    this.Opacity = 0; 
    this.Size = new Size(0, 0); 
    this.Location = new Point(-100, -100); 
    this.Visible = false; 
} 

private void GetHandle() 
{ 
    Process[] process1 = Process.GetProcessesByName("WindowsFormsApplication12.vshost"); 
    process1[0].WaitForInputIdle(); 
    IntPtr pt = process1[0].MainWindowHandle; 
    MessageBox.Show(pt.ToString()); 
} 
+0

Nur lesen Sie rufen Process.GetProcessByName() aus einer separaten App. Ich wurde Getti ng das gleiche Problem wie Sie, bis ich die WaitForInputIdle() -Methode hinzugefügt und es für mich funktioniert :) – Sk93

+0

+1. Der 'process1 [0] .WaitForInputIdle();' ist der wichtige Teil, den man sich merken sollte. –

Verwandte Themen