2013-07-24 26 views
23

Tôi đang viết một ứng dụng Mac đơn giản được thiết kế để chạy ẩn và thực hiện các tác vụ nhất định bất cứ khi nào người dùng nhấp vào nút chuột. Ứng dụng được viết bằng Python sử dụng PyObjC. Tôi đang sử dụng addGlobalMonitorForEventsMatchingMask để xem cho NSLeftMouseDown sự kiện:NSEvent giám sát sự kiện toàn cầu ở chế độ nền

NSEvent.addGlobalMonitorForEventsMatchingMask_handler_(NSLeftMouseDownMask, handler) 

Mã này hoạt động hoàn hảo khi chạy trong nhà ga. Tuy nhiên, khi tôi gói nó như một ứng dụng độc lập (sử dụng py2app) và sau đó khởi động nó, ứng dụng không nhận được bất kỳ sự kiện nào lúc đầu. (Hoặc ít nhất, nếu có, nó không chạy mã trong phương thức xử lý của tôi.) Chỉ khi tôi nhấp vào ứng dụng trong Dock, nó bắt đầu nhận sự kiện, và sau đó, nó tiếp tục nhận sự kiện ngay cả sau khi nó trở về nền. Nhưng nó không nhận được bất cứ điều gì cho đến khi kích hoạt một lần.

Câu hỏi của tôi là: Làm cách nào để ứng dụng của tôi có thể bắt đầu nhận sự kiện ngay khi được khởi chạy mà không cần phải kích hoạt trước bằng cách nhấp vào biểu tượng Bến tàu? Đây có phải là một số quirk được biết đến của NSEvents, hoặc là có lẽ một cái gì đó sai với vòng chạy của tôi trong PyObjC?

Bất kỳ trợ giúp hoặc hướng dẫn nào được đánh giá cao!

Chỉnh sửa: Khi tiếp tục thử nghiệm, có vẻ như, trên thực tế, ứng dụng của tôi tự động bắt đầu nhận thông báo khoảng mười giây sau khi khởi chạy, bất kể tôi có kích hoạt hay không. Đó là hơi khó chịu, nhưng tốt.

Tuy nhiên, nếu tôi chạy ứng dụng với LSUIElement = true hoặc LSBackgroundOnly = true trong số Info.plist (mà cuối cùng tôi muốn làm, vì ứng dụng này chỉ chạy trong nền và không bao giờ xuất hiện trong Dock), tôi không bao giờ nhận được thông báo. Vì vậy, tôi vẫn còn bị mắc kẹt.

+1

Bạn có chắc chắn rằng dòng này thực hiện khi ứng dụng bắt đầu? – akaRem

+5

Bạn có thể đăng một [ví dụ tối thiểu, đầy đủ, hợp lệ] (http://stackoverflow.com/help/mcve) mà những người khác có thể sử dụng để tái sản xuất và có thể gỡ lỗi sự cố không? – abarnert

+0

kiểm tra xem nó có đáp ứng các nguyên tắc của AppStore hay không. nhưng nếu nó là để sử dụng cá nhân, hãy thử nó với Xcode. muốn một ví dụ? –

Trả lời

1

Như bạn nói "Chỉ khi tôi bấm vào ứng dụng trong Dock nó bắt đầu nhận các sự kiện", có nghĩa là xử lý được đăng ký sau khi bạn nhấp vào ứng dụng trong Dock.

Vì vậy, nó phụ thuộc vào thời điểm bạn đang gọi mã này: NSEvent.addGlobalMonitorForEventsMatchingMask_handler_ (NSLeftMouseDownMask, handler), đang đăng ký trình xử lý.

Bạn nên đăng ký trình xử lý trong hàm appdidfinishlaunching.

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