2012-02-12 21 views
11

Pencereyi bir adla (örneğin, hesap makinesi vb. Herhangi bir uygulama) kapatmak istiyorum. C# nasıl yapılır? WinAPI işlevlerini içe aktarma Evet, Windows API işlevlerini almalısınız: FindWindow(), SendMessage();Pencerenin adı nasıl kapatılır?

+3

http://www.codeproject.com/Articles/22257/Find-and-Close-the-Window-using-Win-API ... google rox bildiğiniz – m0s

+0

Olası kopya. http://stackoverflow.com/questions/116090/how-do-i-kill-a-process-using-vb-net-or-c – Lloyd

+0

@Lloyd: Yinelenen değil, bir işlemi öldürmek aynı şeyle aynı şey değildir. bir pencereyi kapatmak. –

cevap

23

ve WM_CLOSE sabitidir. Windows API işlevlerinin

Yerli tanımları:

[DllImport("user32.dll", SetLastError = true)] 
static extern IntPtr FindWindow(string lpClassName, string lpWindowName); 

/// <summary> 
/// Find window by Caption only. Note you must pass IntPtr.Zero as the first parameter. 
/// </summary> 
[DllImport("user32.dll", EntryPoint = "FindWindow", SetLastError = true)] 
static extern IntPtr FindWindowByCaption(IntPtr ZeroOnly, string lpWindowName); 

[DllImport("user32.dll", CharSet = CharSet.Auto)] 
static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, IntPtr wParam, IntPtr lParam); 

const UInt32 WM_CLOSE = 0x0010; 

Müşteri kodu:

IntPtr windowPtr = FindWindowByCaption(IntPtr.Zero, "Untitled - Notepad"); 
if (windowPtr == IntPtr.Zero) 
{ 
    Console.WriteLine("Window not found"); 
    return; 
} 

SendMessage(windowPtr, WM_CLOSE, IntPtr.Zero, IntPtr.Zero); 
+1

Evet, bu Not Defteri için gayet iyi çalışıyor (tabii ki, pencere başlığı tam olarak burada verdiğiniz şeydir, ki bu muhtemelen büyük ihtimalle değil). Ancak, üst düzey bir pencerenin kapatılmasından sonra tüm uygulamayı kapatmak için özel olarak tasarlanmadıkça, çok sayıda üst düzey pencereye sahip uygulamalar için çalışmaz. Aksi halde, uygulamanın kapandığından emin olmak için en üst düzey pencerelerin * her birine * "WM_CLOSE" göndermeniz gerekir. –

+1

Ayrıca, uygulamalar, "WM_CLOSE" işlevine yanıt vermeyi seçebilirler. Örneğin, bazı programlar, aslında aslında kapatmak yerine, bu iletinin alınmasından sonra görev çubuğunun bildirim alanına en aza indirmeyi seçer. Uygulamanın iletiye nasıl yanıt verdiğini kontrol edemediğinizden, bu yöntemi kapsamlı olarak test etmeniz ve bilinmeyen ve test edilmemiş uygulamalarla uğraşırken ne kadar hassas olabileceğini fark etmeniz gerekir. –

+0

Bu 'CloseWindow (windowPtr) 'gibi mi? –

1

Diğer işlemler ait pencereleri kapatmak için çalışıyoruz. Bu güvenilir bir şekilde gideceğini varsayabilecek bir şey değil. Bir şey için, bu pencerelere sahip değilsiniz, bu yüzden diğer süreçlerin pencereleri ile uğraşmak ve karmaşa yapmak için herhangi bir otomatik yetkiniz yok.

Diğer yanıtta da görüldüğü gibi, pencereye bir WM_CLOSE göndermeyi deneyebilirsiniz, ancak diğer sürecin onu onurlandırma hakkına sahip olmadığı konusunda uyarıda bulunabilirsiniz. WM_CLOSE'a yanıt, kabul edilebilirlik ve tamamen reddedilmeye temiz bir kapatma olabilir. İkinci durumda gerçekten başka seçeneğin yok. Bu senin sürecin değil. Aralarında gördüğünüz gibi, üzerinde durmanız gereken herhangi bir ara pencere, diyalog kutusu, vb. Olabilir.

Peki burada ne elde etmeye çalışıyorsunuz? Neden diğer süreçlere ait pencereleri kapatmaya çalışıyorsunuz? Amacın ne olduğunu açıklığa kavuşturmak yardımcı olabilir.

İlgili konular