2010-10-15 27 views
28

Trong Windows, sự khác nhau giữa cửa sổ hoạt động trước và sau là gì? Cụ thể, trong những trường hợp nào có thể một cửa sổ nền trước không phải là một cửa sổ đang hoạt động? Nếu 2 thuật ngữ đề cập đến cùng một khái niệm thì tại sao có 2 thuật ngữ.Foreground Vs Cửa sổ hiện hoạt

Các tài liệu MSDN ở đây đề cập đến "nhấp chuột vào một cửa sổ, hoặc bằng cách sử dụng các ALT +TAB hay ALT +ESC tổ hợp phím" làm cho một cửa sổ hoạt động cũng như foreground. Không có gì rõ ràng về sự khác biệt giữa 2 điều khoản.Check MSDN.

Trả lời

37

Cửa sổ hiện hoạt (kết quả là GetActiveWindow()) là cửa sổ được gắn với chủ đề gọi được nhập. Cửa sổ nền trước (kết quả của GetForegroundWindow()) là cửa sổ hiện đang nhận được đầu vào bất kể mối quan hệ của nó với chuỗi cuộc gọi. Cửa sổ hoạt động về cơ bản được bản địa hóa cho ứng dụng của bạn; cửa sổ nền trước là toàn cầu cho hệ thống.

Ví dụ: nếu cửa sổ thuộc một quy trình khác là tiền cảnh, hãy gọi GetActiveWindow() từ trong quá trình của riêng bạn sẽ trả lại NULL.

Tôi tin rằng đúng là cửa sổ nền trước ngụ ý là cửa sổ hiện hoạt, nhưng ngược lại không đúng.Cũng lưu ý rằng trong Windows hiện đại, các ứng dụng thường không thể sử dụng SetForegroundWindow() để lấy cắp tiêu điểm từ quá trình khác (trừ khi quá trình đó đã cho phép rõ ràng qua AllowSetForegroundWindow).

+1

Đây là câu trả lời đúng _the_. Cũng hữu ích để đọc là [bài đăng trên blog này] (http://blogs.msdn.com/b/oldnewthing/archive/2008/10/06/8969399.aspx). – Ruslan

+0

Nó không phải là đúng sự thật, mà gọi 'GetActiveWindow' từ một thread nền trả về' NULL'. Cửa sổ của luồng nền có thể được kích hoạt mà không cần đặt cửa sổ nền trước (ví dụ: bằng cách gọi 'SetForegroundWindow' mà không đáp ứng yêu cầu hoặc nếu bạn chuyển sang ứng dụng khác giữa khởi chạy ứng dụng và ứng dụng hiển thị giao diện người dùng). Bạn gần như đúng về cửa sổ đang hoạt động, mặc dù: Cửa sổ hoạt động được ảo hóa cho mỗi ** thread ** (hoặc nhóm luồng được đính kèm đầu vào), không phải cho mỗi ứng dụng hoặc quá trình. – IInspectable

+0

Câu trả lời trước tôi chấp nhận sau đó đã được chỉnh sửa và có ý nghĩa với tôi ngay bây giờ. Vì vậy, tôi đã thay đổi câu trả lời chấp nhận của tôi cho điều này, sau 5 và 1/2 năm !!!!!!!!!!!!!!!!!!!!!! – JavaMan

8

tôi thấy mô tả trong MSDN một chút bối rối cũng nhưng ở đây là mất sửa đổi của tôi:

Lần đầu tiên một foreground và cửa sổ nền không có gì để làm với các cửa sổ hoạt động, nó đã làm với luồng, xem dưới đây. Vì vậy, về mặt kỹ thuật, có thể có cửa sổ nền dưới dạng cửa sổ hoạt động nhưng điều này gây nhầm lẫn và hệ thống không thực hiện điều này cho bạn, thay vào đó ứng dụng của bạn cần gọi điện, ví dụ: SetWindowPos để làm cho cửa sổ nền hoạt động.

Hệ thống chỉ có thể có một cửa sổ cấp cao hoạt động cùng một lúc, hệ thống sẽ kích hoạt cửa sổ cấp cao nhất nếu bạn đang làm việc trên cửa sổ con. Tất cả đầu vào sau đó được chuyển đến cửa sổ đang hoạt động và sau đó thường được chuyển đến cửa sổ con.

/----------------------\ 
|      | 
| FOREGROUND WINDOW |--\ 
|      | | 
\----------------------/ | 
    | BACKGROUND WINDOW  | 
    \-----------------------/ 

/----------------------\ 
|      | 
| ACTIVE WINDOW  |--\ 
|      | | 
\----------------------/ | 
    | BACKGROUND WINDOW  | 
    \-----------------------/ 

Từ MSDN

Active Window

Một cửa sổ tích cực là cửa sổ cấp cao nhất của các ứng dụng mà người dùng hiện đang làm việc. Để cho phép người dùng dễ dàng xác định cửa sổ đang hoạt động, hệ thống đặt cửa sổ ở đầu đơn đặt hàng z và thay đổi màu của thanh tiêu đề và đường viền thành màu cửa sổ đang được hệ thống xác định. Chỉ một cửa sổ cấp cao mới có thể là một cửa sổ đang hoạt động. Khi người dùng đang làm việc với một cửa sổ con, hệ thống sẽ kích hoạt cửa sổ cha cấp cao nhất được liên kết với cửa sổ con.

Foreground/Background

Mỗi quá trình có thể có nhiều bài thi, và mỗi chủ đề có thể tạo ra các cửa sổ. Chủ đề đã tạo cửa sổ mà người dùng hiện đang làm việc được gọi là luồng tiền cảnh và cửa sổ được gọi là cửa sổ nền trước. Tất cả các chủ đề khác là các chủ đề nền và các cửa sổ được tạo bởi các chủ đề nền được gọi là các cửa sổ nền.

+0

Microsoft cho biết, một cửa sổ nền trước (thuộc về chủ đề tiền cảnh) được ưu tiên hơn. Trong trường hợp thứ 3 của bạn, WINDOW HOẠT ĐỘNG có được đặc quyền giống nhau không? – pinichi

+0

Mô tả của msdn về Cửa sổ hiện hoạt: * Cửa sổ hoạt động là cửa sổ cấp cao nhất của ứng dụng mà người dùng hiện đang làm việc. Để cho phép người dùng dễ dàng xác định cửa sổ đang hoạt động, hệ thống đặt nó ở đầu ** của thứ tự z ** và thay đổi màu của thanh tiêu đề và đường viền thành màu cửa sổ đang được hệ thống xác định. Chỉ một cửa sổ cấp cao mới có thể là một cửa sổ đang hoạt động. Khi người dùng đang làm việc với cửa sổ con, hệ thống sẽ kích hoạt cửa sổ cấp cao nhất được liên kết với cửa sổ con. * Vì vậy, có thể có trường hợp thứ 3 được nêu ở trên? – JavaMan

+2

Có, có thể. Cửa sổ Alway On Top (có WS_EX_TOPMOST) có thể chồng chéo lên một cửa sổ đang hoạt động (làm mờ thanh tiêu đề, chọn văn bản không hightling, text cursor ... mặc dù) – pinichi

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