Ứng dụng ca cao của tôi chạy các tác vụ nền, mà tôi muốn dừng khi người dùng không sử dụng (không có đầu vào bàn phím/chuột) và sau đó tiếp tục lại khi người dùng hoạt động trở lại. Có cách nào để đăng ký thông báo trạng thái rảnh không?Mục tiêu C: Nhận thông báo về tình trạng nhàn rỗi của người dùng
Trả lời
Trong trường hợp bạn không thể liên kết đến Carbon (. Tức là bạn muốn biên dịch x86_64 bit nhị phân), bạn có thể quấn chức năng này (mà trả về thời gian nhàn rỗi hiện nay ở độ phân giải giây như đôi - CFTimeInterval) trong một giờ:
#include <IOKit/IOKitLib.h>
CFTimeInterval CFDateGetIdleTimeInterval() {
mach_port_t port;
io_iterator_t iter;
CFTypeRef value = kCFNull;
uint64_t idle = 0;
CFMutableDictionaryRef properties = NULL;
io_registry_entry_t entry;
IOMasterPort(MACH_PORT_NULL, &port);
IOServiceGetMatchingServices(port, IOServiceMatching("IOHIDSystem"), &iter);
if (iter) {
if ((entry = IOIteratorNext(iter))) {
if (IORegistryEntryCreateCFProperties(entry, &properties, kCFAllocatorDefault, 0) == KERN_SUCCESS && properties) {
if (CFDictionaryGetValueIfPresent(properties, CFSTR("HIDIdleTime"), &value)) {
if (CFGetTypeID(value) == CFDataGetTypeID()) {
CFDataGetBytes(value, CFRangeMake(0, sizeof(idle)), (UInt8 *) &idle);
} else if (CFGetTypeID(value) == CFNumberGetTypeID()) {
CFNumberGetValue(value, kCFNumberSInt64Type, &idle);
}
}
CFRelease(properties);
}
IOObjectRelease(entry);
}
IOObjectRelease(iter);
}
return idle/1000000000.0;
}
Bạn sẽ cần liên kết mã của mình với IOKit.framework
Apple Technical Q&A QA1340 Registering and unregistering for sleep and wake notifications có thể là những gì bạn đang tìm kiếm.
Nếu bạn cần kiểm soát nhiều hơn NSWorkspaceWillSleepNotification (Liệt kê 1), sử dụng I/O Kit và đăng ký để nhận thông báo nguồn (Liệt kê 3).
Sự cố với tùy thuộc vào thông báo ngủ/thức là nếu người dùng đặt cài đặt ngủ của họ thành "không bao giờ", chúng sẽ không bao giờ được gửi. Tôi muốn đếm thời gian rảnh rỗi khi không có hoạt động bàn phím/chuột. – David
Xin lỗi, mặc dù bạn có nghĩa là khi ứng dụng vào giấc ngủ lý tưởng. Giải pháp của kperryua với CGEventSourceSecondsSinceLastEventType là chính xác cho thời gian giám sát kể từ lần nhập người dùng cuối cùng. –
Có API Carbon sẽ gửi thông báo khi không có sự kiện của người dùng sau một khoảng thời gian nhất định được gọi là EventLoopIdleTimer
. Uli Kusterer đã viết một trình bao bọc Cocoa cho here (look for UKIdleTimer).
Nếu bạn muốn mức độ thấp hơn, bạn có thể thực hiện hành vi bạn muốn bằng kết hợp bộ hẹn giờ và chức năng CoreGraphics CGEventSourceSecondsSinceLastEventType
(có sẵn trong <CoreGraphics/CGEventSource.h>
).
Tôi đã sử dụng một cách tiếp cận khác. Phân lớp UIApplication Tôi ghi đè lên phương pháp sendEvent lọc chạm (thực sự bạn có thể lọc bất kỳ loại sự kiện, tăng tốc, chạm, vv). Sử dụng biến được chia sẻ và bộ hẹn giờ nền tôi đã quản lý "không hoạt động". Mỗi khi người dùng chạm vào màn hình, biến được đặt với timeInterval hiện tại (thời gian hiện tại). Phương pháp lửa hẹn giờ kiểm tra thời gian trôi qua kể từ lần chạm cuối cùng, nếu lớn hơn ngưỡng (trong trường hợp của tôi là khoảng 90 giây), bạn có thể BẬT thông báo của riêng mình.
Tôi đã sử dụng phương pháp đơn giản này để tạo tập hợp ứng dụng tùy chỉnh sau một thời gian rảnh rỗi tự động gọi là ứng dụng "trình bảo vệ màn hình".
Không có gì thông minh, nó chỉ thực hiện công việc.
Hy vọng điều đó sẽ hữu ích.
- 1. Nhàn rỗi của Python và Bàn phímInterrupts
- 2. Tác động của hàng trăm chủ đề nhàn rỗi
- 3. Phát hiện nhàn rỗi hệ thống
- 4. Nhận mã thông báo người dùng facebook
- 5. nhập mô-đun vào ô nhàn rỗi
- 6. Ứng dụng WPF chậm khi trở về từ nhàn rỗi
- 7. Thời gian chờ IMAP nhàn rỗi
- 8. WPF: ứng dụng Thời gian nhàn rỗi
- 9. Mục tiêu c - Phát hiện khi người dùng thay đổi cài đặt thông báo của ứng dụng
- 10. Làm thế nào để được thông báo về tình trạng mạng wifi thay đổi?
- 11. IIS Auto-Start không tắt Thời gian chờ nhàn rỗi
- 12. AVRISPmkII tình trạng kết nối: Không rõ tình trạng 0x00
- 13. jQuery nhận tình trạng hộp kiểm
- 14. Người tiêu dùng tin nhắn RabbitMQ ngừng tiêu thụ thông báo
- 15. Thông báo cổng Mach trong Mục tiêu-C
- 16. Phát hành mục tiêu-C của người độc thân
- 17. Người tiêu dùng không nhận được tin nhắn từ ActiveMQ
- 18. Sử dụng CPU cao trong Eclipse khi nhàn rỗi
- 19. C# asp.net nhận tên người dùng
- 20. Thông báo Đẩy của Apple cho Người dùng cụ thể
- 21. Ẩn con trỏ chuột sau một thời gian nhàn rỗi
- 22. C# Nhận hình ảnh của người dùng (Avatar)
- 23. API tràn ngăn xếp: nhận "thư mới" của người dùng! thông báo?
- 24. Làm thế nào để sử dụng django-thông báo để thông báo cho người dùng khi ai đó nhận xét về bài đăng của họ
- 25. Số kết nối mở và ý nghĩa của tình trạng ngủ của một kết nối
- 26. Nhận thông báo GCM của Android khi ứng dụng ở trạng thái dừng
- 27. Django, cuộc thăm dò ý kiến dài của Ajax, Postgresql: giao dịch nhàn rỗi
- 28. Làm cách nào để nhận thông tin về Trình duyệt của Người dùng trong Flex?
- 29. Cách lưu trữ thông báo người dùng tốt nhất?
- 30. TÌNH TRẠNG TÌNH TRẠNG T-SQL bình thường ("lười")?
Chỉnh sửa nhỏ, mục nhập = IOIteratorNext (tầng) phải là mục nhập = IOIteratorNext (lặp). – Shaun
Xin lưu ý rằng HIDIdleTime không phải là rất đáng tin cậy và nó luôn luôn trả về số không trên một số máy Mac không rõ lý do (có lẽ một số thiết bị kết nối thiết lập lại số thời gian nhàn rỗi). –