INVALID_HANDLE_VALUE
được định nghĩa là -1. Giá trị HWND
không hợp lệ được định nghĩa là 0. Không có API nào trả về HWND(-1)
do lỗi, vì vậy việc kiểm tra INVALID_HANDLE_VALUE
là vô nghĩa, nó sẽ không bao giờ xảy ra.
Tuy nhiên, có một số hàm API mà chấp nhận reserved phi zero-HWND
giá trị như đầu vào, và do đó không thể được sử dụng như HWND
giá trị trả về giá trị, một trong hai:
PeekMessage()
và GetMessage()
:
Nếu hWnd là NULL, (Peek/Get) Thông báo truy xuất thư cho bất kỳ cửa sổ nào thuộc về chuỗi hiện tại và bất kỳ thư nào trên hàng đợi thư của chuỗi hiện tại có giá trị hwnd là NULL (xem cấu trúc MSG). Do đó, nếu hWnd là NULL, cả thông điệp cửa sổ và thông điệp luồng đều được xử lý.
Nếu hWnd là -1, (Peek/Nhận) nhắn lấy chỉ tin nhắn trong hàng đợi thông điệp các thread hiện hành có giá trị hwnd là NULL, đó là, các thông điệp chủ đề như được đăng bởi PostMessage (khi tham số hWnd là NULL) hoặc PostThreadMessage.
Vì vậy, có sự khác biệt hợp lý giữa HWND(0)
và HWND(-1)
. Và trên thực tế, vì sự khác biệt đó, một HWND
hợp lệ sẽ không bao giờ là -1 vì vòng lặp thông báo sẽ không bao giờ có thể truy xuất thư cho nó.
Cũng SetWindowPos()
có một số giá trị dự trữ cũng như:
hWndInsertAfter [trong, không bắt buộc]
Loại: HWND
Một handle cửa sổ để đặt trước cửa sổ vị trí theo thứ tự Z. Tham số này phải là một tay cầm cửa sổ hoặc một trong các giá trị sau.
HWND_BOTTOM
(HWND) 1
Địa điểm cửa sổ ở dưới cùng của thứ tự Z. Nếu tham số hWnd xác định cửa sổ trên cùng, cửa sổ sẽ mất trạng thái trên cùng và được đặt ở cuối tất cả các cửa sổ khác.
HWND_NOTOPMOST
(HWND) -2
Địa điểm cửa sổ trên tất cả các cửa sổ không phải trên cùng (có nghĩa là, đằng sau tất cả các cửa sổ trên cùng). Cờ này không có hiệu lực nếu cửa sổ đã là một cửa sổ không phải trên cùng.
HWND_TOP
(HWND) 0
Đặt cửa sổ ở đầu đơn đặt hàng Z.
HWND_TOPMOST
(HWND) -1
Địa điểm cửa sổ trên tất cả các cửa sổ không phải trên cùng. Cửa sổ duy trì vị trí trên cùng của nó ngay cả khi nó bị vô hiệu hóa.
Sai lầm là một từ lớn. Nhưng chắc chắn, một cửa sổ xử lý sẽ không bao giờ có giá trị đó, nó chỉ được sử dụng cho kernel32 xử lý. –
@HansPassant trong thực tế, có, nhưng nó không chỉ là một chi tiết thực hiện? – Paul
Nếu bạn nhìn vào các hàm khác nhau trả về HANDLE, bạn sẽ thấy rằng một số hàm trả về NULL (như CreateThread) và một số hàm trả về INVALID_HANDLE_VALUE (như CreateFile). Bạn phải kiểm tra tài liệu để xem mỗi hàm cụ thể trả về lỗi gì. Giá trị trả về rất không phù hợp vì lý do lịch sử. Các giá trị được chọn để tương thích với Windows 16 bit. Các hàm 16-bit OpenFile, _lopen và _lcreat trả về -1 về lỗi, do đó hàm CreateFile 32 bit trả về INVALID_HANDLE_VALUE để tạo điều kiện chuyển mã từ Win16. – Marichyasana