Câu hỏi Nhận số cửa sổ thông qua API trợ năng OSX


Tôi đang làm việc trên một ứng dụng di chuyển các cửa sổ của các ứng dụng của bên thứ ba xung quanh trên màn hình.

Để có cái nhìn tổng quan về tất cả các cửa sổ đang mở, tôi sử dụng

CGWindowListCopyWindowInfo(kCGWindowListOptionOnScreenOnly | kCGWindowListExcludeDesktopElements, kCGNullWindowID);

Điều này trả về một mảng từ điển xác định mỗi cửa sổ đang mở. Đây là một từ điển mẫu mực được trả về:

{
    kCGWindowAlpha = 1;
    kCGWindowBounds =         {
        Height = 442;
        Width = 475;
        X = 3123;
        Y = "-118";
    };
    kCGWindowIsOnscreen = 1;
    kCGWindowLayer = 0;
    kCGWindowMemoryUsage = 907184;
    kCGWindowName = Untitled;
    kCGWindowNumber = 7328;
    kCGWindowOwnerName = TextEdit;
    kCGWindowOwnerPID = 20706;
    kCGWindowSharingState = 1;
    kCGWindowStoreType = 2;
    kCGWindowWorkspace = 3;
},

Từ điển có đầy đủ thông tin tốt được sử dụng ở nơi khác nhưng thiếu một đối tượng trợ năng có thể được sử dụng để sửa đổi các vị trí của cửa sổ. Windows được xác định rõ ràng bằng số cửa sổ.

Tôi hiện đang sử dụng PID (kCGWindowOwnerPID) để tạo một đối tượng trợ năng cho ứng dụng của cửa sổ:

AXUIElementRef app = AXUIElementCreateApplication(pid);

Tiếp theo là truy xuất danh sách tất cả các cửa sổ mà ứng dụng đã mở bằng AXUIElementCopyAttributeValues:

NSArray *result;

AXUIElementCopyAttributeValues(
                               (AXUIElementRef) app, 
                               kAXWindowsAttribute,
                               0,
                               99999,
                               (CFArrayRef *) &result
                               );

Điều này làm việc và trả về một mảng các AXUIElements. Đây là nơi tôi bị mắc kẹt. Dường như không có lệnh gọi API để truy xuất Số cửa sổ của đối tượng trợ năng. Có cách nào để

a) Tìm số cửa sổ của đối tượng trợ năng (để cuối cùng lặp qua mảng và tìm cửa sổ bên phải)

hoặc là

b) Nếu không, hãy so khớp rõ ràng một cửa sổ được mô tả trong mảng được trả về bởi CGWindowListCopyWindowInfo đối với các đối tượng truy nhập được trả về bởi AXUIElementCopyAttributeValues?


21
2018-05-30 16:52


gốc




Các câu trả lời:


Chúng tôi đã kết thúc việc thuê một Nhà phát triển trợ năng chuyên dụng cho nhiệm vụ này.

Hóa ra không có cách nào để làm điều này mà không sử dụng các API không có giấy tờ (không có trong trường hợp của chúng tôi).

May mắn thay, có một giải pháp thực tế:

Vòng lặp trên tất cả các cửa sổ đang mở của ứng dụng. Nhận vị trí, kích thước và tiêu đề của họ:

AXUIElementCopyAttributeValue(target, kAXPositionAttribute, CFTypeRef*)&posValue);
AXUIElementCopyAttributeValue(target, kAXSizeAttribute, (CFTypeRef*)&sizeValue);
AXUIElementCopyAttributeValue(target, kAXTitleAttribute, (CFTypeRef*)&titleValue);

Tiếp theo, chuyển đổi vị trí và kích thước thành thực tế CGPoint và CGSize giá trị:

AXValueGetValue(posValue, kAXValueCGPointType, &point);
AXValueGetValue(sizeValue, kAXValueCGSizeType, &size);

So sánh kích thước, vị trí và tiêu đề so với các giá trị được trả về bởi đối tượng trong CGWindowListCopyWindowInfo(). Nếu chúng khớp nhau, bạn có thể giả định nó là cửa sổ bạn đang tìm kiếm và sử dụng AXUIElement đã mở (target trong trường hợp của chúng tôi) để làm việc đó.

Chi phí cho việc lặp qua tất cả các cửa sổ đang mở sẽ không đáng kể trên OSX. Có một nắp khá thấp trên bao nhiêu cửa sổ được mở cùng một lúc.

Ngoài ra, mặc dù điều này không chính xác 100% (có thể là 2 cửa sổ có cùng vị trí, kích thước và tiêu đề), chúng tôi chưa gặp phải bất kỳ tình huống nào trong quá trình sử dụng thực tế.


23
2018-06-15 22:19



Đối với những người có thể sử dụng API không có giấy tờ, làm thế nào nó sẽ được thực hiện? - Samuel


Có một chức năng riêng để có được số cửa sổ CG cho một đối tượng AX cho cửa sổ: _AXUIElementGetWindow . Thêm chi tiết trong thảo luận SO Nhận dạng duy nhất cửa sổ đang hoạt động trên OS X Có vẻ như không có API công khai để thực hiện tác vụ với xác suất 100%. Xác định các cửa sổ theo tiêu đề và khung (như được mô tả trong câu trả lời ở trên) sẽ hoạt động trong 99,9% các trường hợp.


8
2017-08-19 17:15