2012-06-03 18 views
8

Amaç, bir Windows Formunu program aracılığıyla başlatmak, tanıtıcısını almak ve Win Api's SendMessage() işlevini kullanarak wndProc() işlevine bilgi göndermektir.C# 'de bir İşlem' ana pencere tanıtıcısını nasıl edinirsiniz?

SendMessage() parçasının halledildiğini biliyorum, ancak sorun işlem başlatıldıktan sonra formun tanıtıcısı oluyor.

Benim ilk tahminim Süreci MainWindowHandle özellik bana ne arıyorum kolu alacağı, ama süreci başlatmak sonra MainWindowHandle 0'a eşit kalır ve aşağıdaki kod yeni başladım sürecin kolu göstermiyor :

foreach (Process p in Process.GetProcesses()) 
{ 
Console.WriteLine(p.MainWindowHandle); 
} 

Birisi bana bunun nasıl yapılacağını ve gerçekten yapılıp yapılamayacağını söyleyebilir mi?

+2

İşlemi başlattıktan sonra "Thread.Sleep (3000)" işlemini deneyin; sonucun farklı olup olmadığını görün. Ayrıca, hangi süreç başlıyor? Penceresi bile var mı? – SimpleVar

+0

iş parçacığı uyumaya koymak gibi görünüyor. teşekkürler –

+0

@YoryeNathan Yorumunuzu cevap olarak ekleyebilir misiniz? –

cevap

9

Bazen Süreç herşeyi kurarken her şeyi alır, ancak nesne hemen döndürülür.

Bu nedenle, İşlemin gerçekten başlamasına izin vermek için biraz beklemeniz gerekir, ve daha sonra MainWindowHandle uygun şekilde, tüketilmeye hazır olarak ayarlanacaktır.

var proc = Process.Start("notepad"); 

Thread.Sleep(1000); // This will wait 1 second 

var handle = proc.MainWindowHandle; 

olacağını daha akıllı bir şekilde bunu yapmanın bir başka yolu:

var proc = Process.Start("notepad"); 

try 
{ 
    while (proc.MainWindowHandle == IntPtr.Zero) 
    { 
     // Discard cached information about the process 
     // because MainWindowHandle might be cached. 
     proc.Refresh(); 

     Thread.Sleep(10); 
    } 

    var handle = proc.MainWindowHandle; 
} 
catch 
{ 
    // The process has probably exited, 
    // so accessing MainWindowHandle threw an exception 
} 

süreç başlatmaya neden olur ve MainWindowHandle boş değil kadar bekleyecek.

+0

aslında Yorye, sanırım eğer gözlemlerime dayanarak bunu söylemediğimde şüphe duyarım, ikinci yaklaşımınız işe yaramaz, çünkü, bir sebepten dolayı, MainWindowHandle'a erişilmeden önce erişirseniz, başlangıçta olsun, yani while döngüsünüz sonsuza dek sürecek. Neden bu şekilde? Bilmiyorum, ama bana inanmıyorsan dene. –

+3

@JohnSmith Haklısınız, bilgi nesnede önbellekte saklanıyor. 'Refresh' yöntemini çağırmak, önbelleğe alınan bilgileri atar, böylece bir sonraki "MainWindowHandle" özelliğine erişirseniz, gerektiğinde gerçek pencereden alır. Yayımın güncellemesine bakın. – SimpleVar

+0

Bazen 3 yıl önce kendi cevaplarımdan yeni şeyler öğreniyorum. – SimpleVar

İlgili konular