2010-05-28 30 views
11

Tôi đang gặp phải một số vấn đề với ứng dụng nền sử dụng LSUIElement = 1 để ẩn mục dock, thanh menu và ngăn không cho nó xuất hiện trong trình chuyển đổi ứng dụng Command-Tab.Snow Leopard & LSUIElement -> ứng dụng không kích hoạt đúng cách, cửa sổ không "hoạt động" mặc dù là "khóa"

Dường như đây chỉ là vấn đề về Snow Leopard.

Ứng dụng đặt một NSStatusItem vào thanh trình đơn và bật lên một menu khi được nhấp vào. Chọn "Tuỳ ​​chọn ..." sẽ hiển thị NSWindow với các tùy chọn.

Điều đầu tiên dường như không hoạt động là Cửa sổ không được đặt hàng ở phía trước, nhưng xuất hiện phía sau tất cả các cửa sổ ứng dụng khác.

Tôi cố gắng để khắc phục điều này bằng cách gọi

[[NSApplication sharedApplication] activateIgnoringOtherApps: YES] 

nhưng điều đó không làm việc.

Sau một thời gian tôi đã tìm ra rằng menu chặn tin nhắn tới các vòng lặp chạy từ được gửi đi, vì vậy tôi đã viết một phương pháp khác trên MainController và gửi tin nhắn với một sự chậm trễ:

[tự performSelector: @ bộ chọn (setFront :) withObject: [preferencesController window] afterDelay: 1.0];

-(void)setFront: (id) theWindow { 

[[NSApplication sharedApplication]activateIgnoringOtherApps:YES]; 
[theWindow orderFrontRegardless]; 
[theWindow makeKeyWindow]; 
     [[NSApplication sharedApplication] activateIgnoringOtherApps:YES]; 
} 

Lưu ý phương pháp gửi-mọi-có-thể-làm-cần-làm-đang-thực hiện.

Công trình, loại cửa sổ này được đưa lên phía trước trên tất cả các cửa sổ khác từ tất cả các ứng dụng, NHƯNG hầu hết thời gian không hoạt động, có nghĩa là thanh tiêu đề bị chuyển sang màu xám. Nhấp vào thanh tiêu đề sẽ không làm cho cửa sổ hoạt động. Nhấp vào INSIDE của cửa sổ sẽ làm cho nó hoạt động !?

Điều này dường như không phải là vấn đề trong Leopard; chỉ cần gọi activateIgnoringOtherApps và làm cho phím cửa sổ dường như hoạt động tốt.

Trong Snow Leopard có một API mới được thiết kế để thay thế LSUIElement đó là nghĩa vụ bắt chước hành vi của nó:

http://developer.apple.com/mac/library/releasenotes/cocoa/appkit.html

Tôi đã chơi xung quanh với điều đó, nhưng đó là SL-chỉ và tôi thiên đường' t có thể nhận được LSUIElement được thiết lập.

+0

Những gì bạn đang cố gắng làm có thể được coi là ăn cắp sự tập trung, điều này đã được thực hiện khá khó khăn. Và đó là một điều tốt. Thực đơn của bạn làm gì? '[preferencesController showWindow:]'? – zneak

+0

Nó hầu như không đánh cắp tiêu điểm khi người dùng chọn "Preferences ..." và bạn đặt hàng cửa sổ tùy chọn ở phía trước và làm cho nó chính, nhưng có những người đẹp tại táo có thể cố gắng ngăn cản bạn làm điều đó. –

Trả lời

4

Sau khi đăng câu hỏi trong tuyệt vọng, tôi đã tiếp tục tìm kiếm và cuối cùng đã tìm ra giải pháp. Kể từ khi điều này stumped tôi cho một vài ngày và có vẻ như không có câu trả lời khác ra khỏi đó mà google có thể tìm thấy, tôi sẽ giải thích các giải pháp cho "thế hệ tương lai".

Snow Leopard cho biết thêm một NSApplication presentationOptions API mới:

http://developer.apple.com/mac/library/releasenotes/cocoa/appkit.html

Đây là vụ để mô phỏng cách mà LSUIElement hoạt động, nhưng cung cấp kiểm soát phát triển hơn. Thật không may, mô phỏng không hoàn hảo nên có sự thay đổi hành vi giữa 10.5 và 10.6.

Cụ thể, nếu ứng dụng của bạn có dòng LSUIElement = 1 trong info.plist của nó, Snow Leopard sẽ khởi chạy "presentationOptions của ứng dụng ..đến một sự kết hợp tương đương với cờ NSApplicationPresentationOptions thay thế ".

Chỉ nó không thực sự Nó đặt NSApplication setActivationPolicy mới để NSApplicationActivationPolicyAccessory:

" Việc áp dụng không xuất hiện trong Dock và không có một thanh menu , nhưng nó có thể được kích hoạt theo chương trình hoặc bằng cách nhấp vào một trong các cửa sổ của nó. Điều này tương ứng với giá trị của khóa LSUIElement trong của ứng dụng Info.plist là 1."

Mặc dù đề cập đến được kích hoạt programatically, activateIgnoringOtherApps: chỉ đơn giản là bỏ qua hoàn toàn

Giải pháp là để thiết lập các chính sách kích hoạt để. "bình thường":

[[NSApplication sharedApplication] setActivationPolicy: NSApplicationActivationPolicyRegular]; 

Tất nhiên, bạn chỉ có thể làm điều này nếu bạn sử dụng SDK 10,6 với Căn cứ SDK, một cái gì đó rất ít người muốn làm vào lúc này, vì vậy dưới đây là một cách 10,5-an toàn để làm điều này :

NSApplication* app = [NSApplication sharedApplication]; 

if([app respondsToSelector: @selector(setActivationPolicy:)]) { 

    NSMethodSignature* method = [[app class] instanceMethodSignatureForSelector: @selector(setActivationPolicy:)]; 
    NSInvocation* invocation = [NSInvocation invocationWithMethodSignature: method]; 
    [invocation setTarget: app]; 
    [invocation setSelector: @selector(setActivationPolicy:)]; 
    NSInteger myNSApplicationActivationPolicyAccessory = 0; 
    [invocation setArgument: &myNSApplicationActivationPolicyAccessory atIndex: 2]; 
    [invocation invoke]; 

} 

Tôi hy vọng ai đó sẽ thấy điều này hữu ích.

+0

Thật không may, điều này mang lại hiệu quả cho biểu tượng Dock. – stephencelis

+0

có nó. bummer – david

8

Thật kỳ lạ - tôi đang viết một ứng dụng LSUIElement dưới Snow Leopard và tôi không gặp phải vấn đề như bạn đã mô tả ... Tôi đã gặp sự cố khi cửa sổ mới được tạo không xuất hiện ở phía trước, nhưng tôi đã sửa nó bằng cách gọi activateIgnoringOtherApps. Đây là tất cả những gì tôi phải làm để làm cho nó hoạt động như bình thường:

[NSApp activateIgnoringOtherApps: YES]; 
[preferencesWindow makeKeyAndOrderFront: self]; 

Tôi thậm chí không chạm vào bất cứ thứ gì có 'chính sách' trong tên.

+0

Tôi nghĩ những gì tôi đã trải nghiệm là một sự tương tác giữa chính sách kích hoạt và cái gì đó khác. Mã bổ sung để chọn chính sách kích hoạt đã bị xóa khỏi chương trình của tôi một vài tuần trước mà không bị ảnh hưởng xấu? Đó là một trong những thứ không hoạt động và sau đó đột nhiên bắt đầu làm việc tốt một lần nữa (nó có thể là một trong những cập nhật điểm OS X của khóa học). Có lẽ cửa sổ tôi đang làm việc không thể trở thành chìa khóa hay chính !? –

+0

Điều này làm việc cho tôi. Tôi cũng có tình huống tương tự. Nhưng vấn đề của tôi hơi rắc rối. Nếu tôi chạy nó từ XCode, nó hoạt động hoàn hảo. Nếu tôi chạy ứng dụng từ Finder, cửa sổ sẽ không xuất hiện. Thêm dòng này đã giúp tôi rất hạnh phúc. – Vojto

+0

Nó đã khiến tôi rất đau đầu. Cảm ơn vì giải pháp thanh lịch này – Tibidabo

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