2009-03-06 32 views
50

Tôi muốn đặt tùy chọn ẩn biểu tượng Dock và hiển thị số NSStatusItem. Tôi có thể tạo StatusItem nhưng tôi không biết cách xóa biểu tượng khỏi Dock. : -/Cách ẩn biểu tượng Dock

Bất kỳ ý tưởng nào?

+0

nếu ứng dụng của bạn được dựa trên Qt5, bạn cũng cần phải thiết lập các envvar 'QT_MAC_DISABLE_FOREGROUND_APPLICATION_TRANSFORM' –

Trả lời

63

Tôi nghĩ rằng bạn đang tìm kiếm LSUIElement trong Info.plist

LSUIElement (String). Nếu khóa này được đặt thành “1”, Launch Services sẽ chạy ứng dụng dưới dạng ứng dụng đại lý. Ứng dụng đại lý không xuất hiện trong Dock hoặc trong cửa sổ Force Quit. Mặc dù chúng thường chạy dưới dạng ứng dụng nền, nhưng chúng có thể đến nền trước để trình bày giao diện người dùng nếu muốn.

Xem một cuộc thảo luận ngắn here về biến nó on/off

2

Nếu bạn muốn làm cho nó một sở thích người dùng thì bạn không thể sử dụng UIElement. UIElement nằm trong gói ứng dụng, bạn không nên chỉnh sửa bất kỳ tệp nào trong gói ứng dụng vì điều này sẽ làm mất hiệu lực chữ ký nhóm.

Giải pháp tốt nhất tôi đã tìm được dựa trên this excellent article. Giải pháp của tôi dựa trên nhận xét của Dan. Tóm lại, không có cách nào để làm điều này với Cocoa, nhưng nó có thể với một chút nhỏ của mã Carbon.

Bài viết cũng đề xuất tạo ứng dụng trợ giúp xử lý độc quyền biểu tượng đế. Các ứng dụng chính sau đó bắt đầu và giết chết ứng dụng này tùy thuộc vào sở thích của người dùng. Cách tiếp cận này khiến tôi mạnh mẽ hơn việc sử dụng mã Carbon, nhưng tôi chưa thử nó.

43

Để làm điều đó trong khi tuân thủ các nguyên tắc của Apple không sửa đổi gói ứng dụng và để đảm bảo rằng ứng dụng Mac App Store/(ứng dụng Lion?) Sẽ không có chữ ký của chúng bị hỏng bởi sửa đổi info.plist, bạn có thể đặt LSUIElement thành 1 theo mặc định khi ứng dụng khởi chạy:

ProcessSerialNumber psn = { 0, kCurrentProcess }; 
TransformProcessType(&psn, kProcessTransformToForegroundApplication); 

để hiển thị biểu tượng đế hoặc bỏ qua nếu người dùng chọn không muốn biểu tượng.

Chỉ có một hiệu ứng phụ, menu của ứng dụng không được hiển thị cho đến khi nó bị mất và lấy lại tiêu điểm.

Nguồn: Making a Checkbox Toggle The Dock Icon On and Off

Cá nhân tôi không thích cài đặt bất kỳ tùy chọn Info.plist và sử dụng TransformProcessType(&psn, kProcessTransformToForegroundApplication) hoặc TransformProcessType(&psn, kProcessTransformToUIElementApplication) dựa trên các thiết lập người dùng là gì.

+0

Cảm ơn! Chỉ là những gì tôi đã tìm kiếm! – MrMage

+0

Mẹo tuyệt vời! Cảm ơn! Bạn sẽ luôn muốn ẩn biểu tượng Dock theo cách này để đảm bảo ứng dụng đã ký của bạn hoạt động. – Form

+1

Các giải pháp xuất phát từ codepath này không cho phép ứng dụng * thực sự muốn * là LSUIElement YES (như trong, không có thanh thực đơn, v.v.). Toggling quá trình trong thời trang này sẽ gây ra một trình đơn được hiển thị như đã nêu trong câu trả lời. Tôi chắc chắn tôn trọng rằng đây là điều gần nhất với câu trả lời cho chức năng bị bỏ qua này, nhưng nó không phải là một giải pháp chính xác. Tôi nói với người dùng chỉ cần thêm ứng dụng vào Dock theo cách thủ công nếu họ muốn có biểu tượng ở đó. – SG1

25

Trong Xcode 4, nó được hiển thị dưới dạng "Ứng dụng là tác nhân (UIElement)" và nó là Boolean.

Trong điều khiển Info.plist nhấp chuột vào một khoảng trống và chọn "Thêm hàng" từ menu Loại "Đơn đăng ký là đại lý (UIElement)" Đặt nó CÓ.

Để làm cho tùy chọn tôi thêm dòng sau vào mã của tôi (cảm ơn Valexa!)

// hide/display dock icon 
if (![[NSUserDefaults standardUserDefaults] boolForKey:@"hideDockIcon"]) { 
    //hide icon on Dock 
    ProcessSerialNumber psn = { 0, kCurrentProcess }; 
    TransformProcessType(&psn, kProcessTransformToForegroundApplication); 
} 
33

có động cơ từ here, bạn có thể làm:

[NSApp setActivationPolicy: NSApplicationActivationPolicyAccessory]; 

hoặc

[NSApp setActivationPolicy: NSApplicationActivationPolicyProhibited]; 

này nên ẩn các biểu tượng dock. Xem here để biết một số tài liệu về NSApplicationActivationPolicy.

Xem thêm câu hỏi liên quan "Start a GUI process in Mac OS X without dock icon".

+2

Đây chắc chắn là giải pháp thanh lịch nhất. Hoạt động hoàn hảo. – codingFriend1

+1

+1. 'NSApplicationActivationPolicyAccessory' thực sự cho phép menu chính hiển thị. –

+1

Từ tài liệu của Apple: Hiện tại, NSApplicationActivationPolicyNone và NSApplicationActivationPolicyAccessory có thể được thay đổi thành NSApplicationActivationPolicyRegular, nhưng các sửa đổi khác không được hỗ trợ. –

9

Cập nhật cho Swift: (Sử dụng cả hai cách đã trình bày ở trên, họ có kết quả tương tự)

public class func toggleDockIcon_Way1(showIcon state: Bool) -> Bool { 
    // Get transform state. 
    var transformState: ProcessApplicationTransformState 
    if state { 
     transformState = ProcessApplicationTransformState(kProcessTransformToForegroundApplication) 
    } 
    else { 
     transformState = ProcessApplicationTransformState(kProcessTransformToUIElementApplication) 
    } 

    // Show/hide dock icon. 
    var psn = ProcessSerialNumber(highLongOfPSN: 0, lowLongOfPSN: UInt32(kCurrentProcess)) 
    let transformStatus: OSStatus = TransformProcessType(&psn, transformState) 
    return transformStatus == 0 
} 

public class func toggleDockIcon_Way2(showIcon state: Bool) -> Bool { 
    var result: Bool 
    if state { 
     result = NSApp.setActivationPolicy(NSApplicationActivationPolicy.Regular) 
    } 
    else { 
     result = NSApp.setActivationPolicy(NSApplicationActivationPolicy.Accessory) 
    } 
    return result 
} 
Các vấn đề liên quan