2009-07-31 3 views
0

У меня есть консольное приложение (SRMan.exe), которое происходит от System.Windows.Forms.Form. Я мог бы скрыть форму во время работы exe. Код я использовал здесьПолучение ручки скрытой формы

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

АОЛО, сконфигурированный свойства формы ShowIcon и ShowInTaskbar ложь.

, но я не мог в состоянии получить дескриптор окна этого работает process.code я использовал здесь

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

Любая помощь приветствуется!

Thanks,
Karim.

ответ

0

Любая причина, по которой вы не можете просто захватить ручку из формы Handle формы? Все, что происходит от класса Control, которое Forms do, будет иметь свойство Handle.

Почему вы прибегаете к захвату его из процесса?

+0

Я бы начинать с другого процесса процесс (SRMan.exe), и я должен отправлять сообщения в этом запущенного процесса Поэтому мне нужно использовать Process [] process1 = Process.GetProcessesByName («SRMan»); IntPtr pt = process1 [0] .MainWindowHandle; – 2009-07-31 12:56:11

+1

, как указывает Sk93, попробуйте использовать process1 [0] .WaitForInputIdle(); работал на меня и в прошлом. –

2

В какой момент вы звоните:

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

пт будут возвращены как ноль или «MainWindowHandle» может выбросить исключение, если главное окно ручка не была создана.

Попробуйте изменить свой код:

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

как это заставит ваш код подождать, пока процесс не будет полностью загружен. (MSDN article)

В качестве примера, следующий код работает для меня:

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

Просто прочитайте, что вы вызываете Process.GetProcessByName() из отдельного приложения. Я был getti ng той же проблемы, что и вы, пока я не добавил метод WaitForInputIdle(), и он работал для меня :) – Sk93

+0

+1. 'Process1 [0] .WaitForInputIdle();' является важной частью для запоминания. –

Смежные вопросы