2009-03-12 12 views

cevap

12

Tüm Prosesleri gözden geçirin ve MainWindowTitle'u kontrol edin. sınıf adı ve üst pencere kolu tarafından

foreach(Process proc in Process.GetProcesses()) 
{ 
    if(proc.MainWindowTitle.StartsWith("Some String")) 
    { 
     IntPtr handle = proc.MainWindowHandle; 
     // ... 
    } 
} 
+1

İlginç. Çoğu durumda çalışmalıdır. Ancak bir süreç birden fazla üst düzey pencereye sahipse ne olur? –

+0

@Serge: Tam olarak emin değil ... –

+0

Teşekkürler! Vay canına, bununla uğraşacağını ve Win32 API kludgesinden sakınacağını asla bilemezdim. – Jonas

5

This CodeProject article, Üst düzey pencerelerin nasıl numaralandırılacağını anlatır (Win32 API EnumWindows'a dayanarak). Kısmen bir pencere başlığına filtre uygulamak için kolayca değiştirebilirsiniz: EnumWindowsCallBack'i değiştirin.

HTH.

2

Get (Sen, vb İfadelerinin kullanabilir veya StartsWith olabilir). Örneğin: win32api'yi kullanarak başlatma tutamacını başlatın. Önce spyxx aracını kullanarak ana pencere sınıfı adını biliyorsunuz.

[DllImport("user32.dll")] 
public static extern IntPtr FindWindowEx(IntPtr handleParent, IntPtr handleChild, string className, string WindowName); 
[DllImport("user32.dll")] 
public static extern IntPtr FindWindow(string className, string windowTitle); 

Kullanımı:

IntPtr handle = FindWindowEx(FindWindow("Shell_TrayWnd",null), new IntPtr(0), "Button", null); 
İlgili konular