2012-02-12 24 views
11

Tôi muốn đóng cửa sổ với một số tên (bất kỳ ứng dụng nào, ví dụ, máy tính và vv). Làm thế nào để làm điều đó trong C#? Nhập các hàm WinAPI?Làm thế nào để đóng cửa sổ theo tên của nó?

+3

http://www.codeproject.com/Articles/22257/Find-and-Close-the-Window-using-Win-API ... google rox bạn biết – m0s

+0

Có thể trùng lặp. http://stackoverflow.com/questions/116090/how-do-i-kill-a-process-using-vb-net-or-c – Lloyd

+0

@Lloyd: Không phải là một bản sao, giết chết một quá trình không giống như đóng cửa sổ. –

Trả lời

23

Có, bạn nên nhập chức năng API của Windows: FindWindow(), SendMessage(); và WM_CLOSE không đổi.

định nghĩa Native trong những chức năng của Windows API:

[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; 

Khách hàng mã:

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

Vâng, điều này hoạt động tốt cho Notepad (giả sử, tất nhiên, tiêu đề cửa sổ chính xác là những gì bạn đã đưa ra ở đây, mà nó có lẽ không phải là hầu hết thời gian). Nhưng nó sẽ không hoạt động đối với các ứng dụng có nhiều cửa sổ cấp cao nhất, trừ khi chúng được thiết kế đặc biệt để đóng toàn bộ ứng dụng sau khi đóng một cửa sổ cấp cao nhất. Nếu không, bạn cần gửi 'WM_CLOSE' đến * mỗi * của các cửa sổ cấp cao nhất để đảm bảo ứng dụng bị đóng. –

+1

Ngoài ra, các ứng dụng có thể chọn trả lời 'WM_CLOSE' theo ý muốn. Ví dụ: một số chương trình chọn giảm thiểu chính mình xuống vùng thông báo của thanh tác vụ khi nhận được thông báo này, thay vì thực sự đóng. Vì bạn không thể kiểm soát cách ứng dụng đáp ứng với thông báo, bạn cần phải thử nghiệm phương thức này một cách rộng rãi và nhận ra khả năng nó dễ vỡ khi xử lý các ứng dụng chưa biết và chưa được kiểm tra. –

+0

Có đúng như thế này 'CloseWindow (windowPtr)'? –

1

Bạn đang cố gắng để đóng cửa sổ thuộc quá trình khác. Đó không phải là một cái gì đó bạn có thể giả định sẽ đi đáng tin cậy. Đối với một điều, bạn không sở hữu những cửa sổ để bạn không thực sự có bất kỳ quyền tự động để đi và lộn xộn với các cửa sổ các quá trình khác.

Như câu trả lời khác cho thấy, bạn có thể thử gửi WM_CLOSE đến cửa sổ nhưng nó đi kèm với cảnh báo rằng quy trình khác không thực sự có quyền tôn vinh nó. Câu trả lời cho WM_CLOSE có thể là bất cứ điều gì để chấp nhận và tắt máy hoàn toàn để từ chối hoàn toàn. Trong trường hợp sau, bạn thực sự không có tùy chọn. Nó không phải là quá trình của bạn. Ở giữa, như bạn đã thấy, có thể có bất kỳ loại cửa sổ trung gian, hộp thoại nào, v.v mà bạn phải tranh luận.

Vì vậy, bạn đang cố gắng đạt được điều gì ở đây? Tại sao bạn cố gắng đóng cửa sổ thuộc các quy trình khác? Nó có thể giúp làm rõ mục đích là gì.

Các vấn đề liên quan