Suy nghĩ đầu tiên của tôi được liệt kê bên dưới nhưng nếu bạn tuyên bố rằng bạn đang chắc chắn rằng GetWindowRect
đang trả lại giá trị không chính xác, hãy xem GIẢI PHÁP.
"Có gì sai với GetSystemMetrics(SM_CXBORDER)
và GetSystemMetrics(SM_CYBORDER)
?
Phương pháp bạn đang sử dụng dường như là một cách rất vòng xoay để làm việc đó, và nếu bạn có thể gọi GetWindowRect()
, tôi khá chắc chắn bạn có thể gọi GetSystemMetrics()
là tốt.
Một khả năng khác là sử dụng GetWindowRect
để có được toàn bộ hình chữ nhật bounding cho cửa sổ và GetClientRect
để có được những hình chữ nhật bounding cho khu vực khách hàng (không biên giới).
này nên cung cấp cho bạn một cái gì đó giống như (100,200),(1000,900)
và (112,227),(988,888)
tương ứng và bạn có thể làm việc ra biên giới hàng đầu như 227-200
, phía dưới như 900-888
, trái như 112-100
và đúng như 900-888
(27,12,12,12).
NGHỊ QUYẾT:
Một chút điều tra lần lượt lên this. Đó là một chủ đề từ năm 2006 nói rằng bạn có thể không nhận được các giá trị chính xác từ GetWindowsRect
. Chủ đề chỉ cho tôi điều này đã nêu:
Các ứng dụng dưới Vista không được liên kết với WINVER = 6 sẽ nhận được một tập hợp giá trị gây hiểu nhầm ở đây, không tính thêm phần đệm "kính" pixel Vista Aero áp dụng cho cửa sổ. Điều này dường như xảy ra ngay cả trong Aero Basic (không có Glass) để duy trì tính nhất quán kích thước. Cách giải quyết (nếu bạn không muốn thiết lập WINVER = 6) dường như liên kết động với dwmapi.dll và sử dụng GetProcAddress() để lấy hàm DwmGetWindowAttribute() và gọi nó với đối số DWMWA_EXTENDED_FRAME_BOUNDS để yêu cầu cửa sổ chính hãng kích thước khung hình.
Vì vậy, về cơ bản, sử dụng một cái gì đó tương tự (bạn có thể phải sử dụng ctypes để làm điều này từ Python):
RECT r;
HRESULT stat = DwmGetWindowAttribute (
hwnd,
DWMWA_EXTENDED_FRAME_BOUNDS,
&r,
sizeof(r));
và rằng sẽ cung cấp cho bạn những hình chữ nhật bounding đúng.
Vâng, nó trả về 1. 1 không phải là chiều rộng của bất kỳ đường viền nào trên cửa sổ đó. Tôi chắc rằng các giá trị tôi muốn cho cửa sổ đó là 8 và 30. –
Bạn nhận được 8 và 30 như thế nào? Khung tìm kiếm chính xác dường như có cùng chiều rộng ở phía dưới giống như ở hai bên. – paxdiablo
Tôi cũng quan tâm đến hàng đầu. –