2011-11-03 17 views
18

Tôi có ứng dụng này, nơi tôi cần kích hoạt mục menu của ứng dụng khác (như In cmd + p) từ trong ứng dụng của tôi. Ngay bây giờ tôi đang sử dụng CGEventPostToPSN() để thực hiện công việc và nó hoạt động tốt, nhưng khi tôi kích hoạt hộp cát, nó ngừng hoạt động.Giải pháp thay thế cho CGEventPostToPSN() để kích hoạt mục menu của ứng dụng khác trong môi trường sandbox?

CGEventPostToPSN(&psn, keyDownEvent); 
CFRelease(keyDownEvent); 
CGEventPostToPSN(&psn, keyUpEvent); 
CFRelease(keyUpEvent); 

Câu hỏi của tôi bây giờ là những gì tôi có thể làm khi cần kích hoạt hộp cát? Tôi đã nghe rất nhiều về API trợ năng nhưng tôi không thể tìm hiểu cách tôi có thể kích hoạt mục menu của ứng dụng khác. Tôi rất biết ơn vì bất kỳ câu trả lời nào về vấn đề này.

Fabian

+0

Khi tôi thấy "mục trạng thái", tôi nghĩ bạn đang đề cập đến 'NSStatusItem', nhưng In sẽ là một mục menu thông thường. – JWWalker

+0

Cảm ơn, tôi đã sửa nó. –

+1

Nếu bạn cần nói chuyện với một ứng dụng khác, bạn không nên bật hộp cát. Tôi nghi ngờ Apple sẽ không bao giờ phê duyệt ứng dụng của bạn yêu cầu người dùng bật API trợ năng để ứng dụng của bạn có thể hoạt động chính xác. Điều tốt nhất bạn có thể làm bây giờ là gửi yêu cầu tính năng tới Apple nơi bạn mô tả sự cố bạn đang cố giải quyết. – Kentzo

Trả lời

2

Tôi vẫn chưa có câu trả lời cuối cùng cho câu hỏi này, nhưng dường như có thể với API trợ năng như được đề xuất bởi @nielsbot.

Có một số chức năng đầy hứa hẹn như AXUIElementPostKeyboardEvent()AXUIElementPerformAction(). Sự cố: Sử dụng API trợ năng để kiểm soát ứng dụng khác bị cấm trong Hướng dẫn hộp cát của Apple.

Lưu ý: Với App Sandbox, bạn có thể và sẽ cho phép ứng dụng của bạn truy cập, như được mô tả trong tài liệu này. Tuy nhiên, bạn không thể sandbox một ứng dụng trợ giúp như trình đọc màn hình và bạn không thể sandbox ứng dụng điều khiển ứng dụng khác.

Nếu bạn gặp phải câu hỏi này và có cùng vấn đề với tôi, tôi e rằng bạn không may mắn. Xem xét lại nếu bạn thực sự phải kiểm soát một ứng dụng khác và nếu có, bạn có thể không phân phối được ứng dụng của mình trên Mac App Store, xin lỗi.

Fabian

4

Trong một môi trường sandbox, bạn vẫn có thể gửi của Apple kiện khác ứng dụng bạn chỉ cần nộp đơn xin "Apple tổ chức sự kiện ngoại lệ tạm thời" cho ứng dụng của bạn. Chi tiết này được trình bày chi tiết trong phần "Apple Event Temporary Exception" của Apple trong số các "Element Key Reference".

của Apple tổ chức sự kiện tạm thời ngoại lệ
Khi bạn áp dụng App Sandbox, ứng dụng của bạn vẫn giữ được khả năng:
● Nhận các sự kiện của Apple
● Gửi sự kiện Apple để tự
● Đáp ứng với các sự kiện của Apple mà nó nhận được
Tuy nhiên, với App Sandbox bạn không thể gửi các sự kiện của Apple đến các ứng dụng khác trừ khi bạn định cấu hình quyền lợi ngoại lệ tạm thời của sự kiện táo.

Đối với mỗi ứng dụng bạn muốn gửi sự kiện của Apple đến, chỉ định mã nhận diện gói của ứng dụng, trong tất cả các ký tự chữ thường, dưới dạng giá trị chuỗi cho mảng giá trị của khóa này. Ví dụ: để cho phép gửi sự kiện Apple tới iPhoto từ ứng dụng của bạn, hãy sử dụng giá trị chuỗi com.apple.iphoto.

chính Entitlement Capability
com.apple.security.temporary-exception.apple-events Cho phép gửi các sự kiện của Apple cho một hoặc nhiều ứng dụng đích.

Theo như tôi biết, Apple chưa xác định một cách rõ ràng 'tạm thời' trong bối cảnh này, nhưng sự đồng thuận là Apple đang cho phép này cho bây giờ nhưng một số cửa hàng ứng dụng trong tương lai hoặc Mac OS X cập nhật có thể loại bỏ khả năng làm điều này.

Lưu ý rằng bạn phải nêu rõ trước các ứng dụng mà bạn cần để có thể gửi sự kiện đến — không thể chọn ứng dụng này hoặc ứng dụng của bạn theo thời gian.

+0

Tôi biết về ngoại lệ tạm thời đó và nó sẽ không sao để sử dụng trong ứng dụng của tôi. Bạn có biết cách tôi có thể kích hoạt mục menu trong ứng dụng khác bằng Apple Events không? –

+0

@FabianKreiser, tôi không nghĩ rằng có bất kỳ cách chung nào để gọi một mục menu bằng cách sử dụng Sự kiện của Apple. Tất nhiên, nếu bạn đang viết cả ứng dụng người gửi và ứng dụng người nhận, bạn có thể thiết kế bất kỳ giao thức AppleEvent nào bạn muốn. – JWWalker

+1

@FabianKreiser, bạn có thực sự cần vận hành một mục menu không? Bạn không thể gửi sự kiện ''pdoc'' (' kCoreEventClass', 'kAEPrintDocuments')? –

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