2010-03-10 42 views
11

Giả sử tôi muốn viết một ứng dụng Cocoa đơn giản để làm cho tính năng Spaces của Leopard trở nên hữu ích hơn. Tôi muốn cấu hình mỗi không gian có, nói, khác nhauPhát hiện khi không gian thay đổi trong Không gian trong Mac OS X

  • màn hình độ phân giải
  • bố trí bàn phím
  • khối lượng (cho âm thanh)

Vì vậy, có hai phần câu hỏi của tôi:

  1. Tôi cho rằng có nhiều cách để sửa đổi ba điều này độc lập với Spaces, đúng không? Nếu vậy, làm thế nào?
  2. Làm cách nào tôi có thể phát hiện trong ứng dụng của mình khi xảy ra thay đổi không gian và khi điều đó xảy ra, hãy xác định không gian nào người dùng vừa chuyển sang? Có phải Leopard gửi một số thông báo được phân phối hay gì đó không?

Cập nhật: Có một số cách API công khai để thực hiện việc này, đánh giá từ tất cả các ứng dụng liên quan đến Spaces trên Mac App Store.

Trả lời

9

Như Peter nói, trong 10.6 bạn có thể sử dụng NSWorkSpaceNSWorkspaceActiveSpaceDidChangeNotification để nhận thông báo khi không gian làm việc thay đổi.

Sau đó, bạn có thể xác định dung lượng hiện tại bằng cách sử dụng API Quartz, khóa từ điển kCGWindowWorkspace giữ không gian làm việc. ví dụ:

int currentSpace; 
// get an array of all the windows in the current Space 
CFArrayRef windowsInSpace = CGWindowListCopyWindowInfo(kCGWindowListOptionAll | kCGWindowListOptionOnScreenOnly, kCGNullWindowID);  

// now loop over the array looking for a window with the kCGWindowWorkspace key 
for (NSMutableDictionary *thisWindow in (NSArray *)windowsInSpace) 
{ 
    if ([thisWindow objectForKey:(id)kCGWindowWorkspace]) 
     { 
      currentSpace = [thisWindow objectForKey(id)kCGWindowWorkspace] intValue]; 
      break; 
     } 
} 

Hoặc bạn có thể nhận được không gian sử dụng API tư nhân, hãy nhìn vào CGSPrivate.h cho phép bạn làm điều này:

int currentSpace = 0; 
CGSGetWorkspace(_CGSDefaultConnection(), &currentSpace); 

Để thay đổi độ phân giải màn hình, bạn sẽ muốn xem Quartz services, để thay đổi âm lượng this may be helpful.

+0

Cảm ơn. Nhưng nếu không có cửa sổ trong không gian thì sao? Trường hợp đó có thể được xử lý thông qua API công cộng không? – Enchilada

+1

Trong ứng dụng của bạn tạo ra một cửa sổ trong suốt và đặt nó tham gia tất cả Spaces, sau đó tìm nó trong dãy cửa sổ. Để đặt cửa sổ ở tất cả các khoảng trống, hãy sử dụng điều này: [transparentWindow setCollectionBehavior: NSWindowCollectionBehaviorCanJoinAllSpaces] – BendiLow

+1

Khi sử dụng 'kCGWindowWorkspace', tôi nhận thấy rằng ID Space thay đổi sau khi khởi động lại các dấu cách sau dấu đầu tiên (trên Lion). Điều đó làm cho việc lưu trữ ID khá nhiều vô ích ... Có API công cộng khác cho điều này không? (Có thể liên quan đến điều này: http://openradar.appspot.com/9241430) – Mark

5

NSWorkspace đăng NSWorkspaceActiveSpaceDidChangeNotification trên trung tâm thông báo của riêng mình, nhưng chỉ trên Snow Leopard.

+1

Có, nhưng thông báo đó chỉ cho bạn biết rằng không gian thay đổi. Nhưng không có từ điển userInfo với thông báo đó với thông tin như không gian hiện tại là gì, vv Vì vậy, nó không thực sự là một thông báo mạnh mẽ .. – Enchilada

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