2009-05-12 32 views
15

Tôi đang phát triển một ứng dụng OS X được cho là có đầu vào từ hai con chuột. Tôi muốn đọc chuyển động của từng con chuột một cách độc lập. cách nào tốt nhất để làm việc này?Nhiều con chuột trên OS X

Nếu điều đó là không thể, có cách nào để tắt/bật một trong hai con chuột theo chương trình không?

+3

Chắc chắn có thể: pop-pop, một trò chơi của Ambrosia Software, sử dụng hai con chuột cho chế độ nhiều người chơi của nó. Tôi không biết chính xác làm thế nào họ đã làm nó, nhưng tôi gần như chắc chắn nó đã được thông qua HID Manager. – hbw

Trả lời

12

Giao diện thiết bị lớp HID chắc chắn là những gì bạn cần. Về cơ bản có hai bước:

Trước tiên, bạn cần tìm các thiết bị chuột. Để làm điều này, bạn cần phải xây dựng một từ điển phù hợp và sau đó tìm kiếm IO Registry với nó. Có một số mã mẫu here, bạn sẽ cần phải thêm một số yếu tố bổ sung vào từ điển để bạn chỉ nhận được những con chuột thay vì tất cả các thiết bị HID trên hệ thống. Một cái gì đó như thế này nên làm các trick:

// Set up a matching dictionary to search the I/O Registry by class 
// name for all HID class devices` 
hidMatchDictionary = IOServiceMatching(kIOHIDDeviceKey); 

// Add key for device usage page - 0x01 for "Generic Desktop" 
UInt32 usagePage = 0x01; 
CFNumberRef usagePageRef = ::CFNumberCreate(kCFAllocatorDefault, kCFNumberLongType, &usagePage); 
::CFDictionarySetValue(hidMatchDictionary, CFSTR(kIOHIDPrimaryUsagePageKey), usagePageRef); 
::CFRelease(usagePageRef); 

// Add key for device usage - 0x02 for "Mouse" 
UInt32 usage = 0x02; 
CFNumberRef usageRef = ::CFNumberCreate(kCFAllocatorDefault, kCFNumberLongType, &usage); 
::CFDictionarySetValue(hidMatchDictionary, CFSTR(kIOHIDPrimaryUsageKey), usageRef); 
::CFRelease(usageRef); 

Sau đó bạn cần nghe hàng đợi nút X/Y/từ các thiết bị bạn tìm thấy ở trên. Điều này sample code nên chỉ cho bạn đi đúng hướng. Sử dụng callbacks hiệu quả hơn nhiều so với việc bỏ phiếu!

Mã HID trông phức tạp hơn rất nhiều - nó được tạo ra khá "dài dòng" bởi các công cụ CF.

0

Bạn có thể xem thiết bị USB/PS-2 bị gián đoạn. Thậm chí nếu bạn không muốn viết lại một trình điều khiển được gọi là, nó có thể hữu ích vì tất cả những con chuột gửi dữ liệu của họ thông qua.

Bạn cũng có thể kiểm tra trang này có thể đưa ra một số gợi ý http://multicursor-wm.sourceforge.net/

+0

Mac không có PS2 ngày hôm nay và họ không bao giờ có, kết nối cũ được gọi là ADB (Apple Desktop Bus) và nó trông giống như s-video hơn PS2 kết nối khôn ngoan. – Kris

+0

tôi không nghĩ rằng dừng lại trên này sẽ giúp đỡ. Ý tưởng là xem xét mức độ thấp hơn để có nhiều quyền kiểm soát hơn đối với thiết bị ... –

7

Dường như HID Manager là những gì bạn đang tìm kiếm.

1

Trừ khi bạn có thể buộc một trong những con chuột không bị xử lý như một con chuột, cả hai sẽ tiếp tục điều khiển con trỏ. Tuy nhiên, bạn có thể sử dụng IOKit để viết trình điều khiển USB HID tùy chỉnh để cho phép ứng dụng của bạn đọc từ một hoặc cả hai con chuột (mặc dù điều này có thể ảnh hưởng đến việc sử dụng chúng như những con chuột bình thường). Building Customized User Client Drivers for USB Devices sẽ là một nơi tốt để bắt đầu cách tương tác trực tiếp với chuột USB.

+0

Có thể ẩn con trỏ thực và vẽ riêng từng vị trí của chuột. –

+0

Bạn có thể ẩn con trỏ và hủy liên kết con trỏ khỏi con trỏ: http://developer.apple.com/documentation/GraphicsImaging/Conceptual/QuartzDisplayServicesConceptual/Articles/MouseCursor.html – Bids

3

Bạn sẽ muốn xem bộ công cụ quản lý I/O Kit và HID (Thiết bị giao diện con người).

Trình quản lý HID là một phần của I/O Kit, vì vậy việc xem xét có thể hữu ích. Có hai API cho quản lý HID, các older API là một chút đau đớn hơn và sau đó bạn có 10.5 and above API mới mà là một chút thoải mái hơn.

Điều quan trọng cần hiểu là điều này có thể không chỉ là sửa chữa nhanh, có thể mất một số công việc quan trọng để chạy nó. Nếu bạn có thể giả sử bạn sẽ có 10.5 hoặc cài đặt tốt hơn, sử dụng API Leopard chắc chắn sẽ giúp ích.

Ngoài ra; tùy thuộc vào cách bạn hoàn thành những gì bạn đang làm, có thể quan trọng để bạn ẩn con trỏ chuột vì nó vẫn có thể di chuyển rất nhiều ngay cả khi bạn nhận được thông tin từ cả hai con chuột. Nếu ứng dụng của bạn lấy màn hình, tôi sẽ sử dụng CoreGraphics để vô hiệu hóa con trỏ và chỉ vẽ của riêng tôi.

Bạn cũng có thể xem xét tìm trình bao bọc cho một trong các API này, ví dụ có thể được tìm thấy trong this question.

+1

Bạn có thể tìm thấy trình bao bọc C++ tại đây: http : //www.wooji-juice.com/free/pyhid/ – Ross

0

có thể đó là giải pháp để bạn sử dụng công cụ chuyển đổi usb->rsr232 và tự mình đọc bằng cổng nối tiếp?