2009-05-12 3 views
15

두 마우스에서 입력을 받아야하는 OS X 응용 프로그램을 개발 중입니다. 각 마우스의 움직임을 독립적으로 읽고 싶습니다. 이 작업을 수행하는 가장 좋은 방법은 무엇입니까?OS X에서 여러 개의 마우스

그럴 수 없다면 마우스 중 하나를 프로그래밍 방식으로 사용/사용 중지 할 수있는 방법이 있습니까?

+3

확실히 가능합니다 : Ambrosia Software의 게임 인 pop-pop은 멀티 플레이어 모드로 두 마리의 마우스를 사용했습니다. 정확히 어떻게했는지는 모르겠지만 HID 관리자를 통해 나온 것이 거의 확실합니다. – hbw

답변

12

HID 클래스 장치 인터페이스가 확실히 필요한 것입니다. 기본적으로 두 단계가 있습니다 :

먼저 마우스 장치를 찾아야합니다. 이렇게하려면 일치하는 사전을 만든 다음 IO 레지스트리를 검색해야합니다. 일부 샘플 코드 here이 있습니다. 사전에 몇 가지 요소를 추가해야 시스템의 모든 HID 장치 대신 마우스를 사용할 수 있습니다.

그런 다음 X를들을 필요가
// 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); 

/장치에서 Y/버튼 큐가 위에서 발견 : 이런 식으로 뭔가 트릭을 할해야합니다. 이 sample code은 올바른 방향으로 사용자를 안내해야합니다. 콜백을 사용하는 것이 폴링보다 훨씬 효율적입니다!

HID 코드는 CF보다 훨씬 복잡합니다.

0

USB/PS-2 장치 인터럽트를 볼 수 있습니다. 소위 드라이버를 다시 쓰지 않으려는 경우에도 모든 마우스가 데이터를 전송하므로 유용 할 수 있습니다.

또한 그것은 HID Manager과 같은 몇 가지 힌트 http://multicursor-wm.sourceforge.net/

+0

Mac은 오늘 PS2를 가지고 있지 않으며 절대로 사용하지 않았습니다. 이전 연결은 ADB (Apple Desktop Bus)라고 불리며 PS2 커넥터보다 s- 비디오와 훨씬 비슷해 보입니다. – Kris

+0

나는 이것에 멈추는 것이 도움이 될 것이라고 생각하지 않는다. 아이디어는 장치에 대한 더 많은 제어를하기 위해 더 낮은 레벨을 바라 보는 것입니다. –

7

을 줄 수있는이 페이지를 확인할 수 있습니다 당신을 위해 무엇을 찾고있는 사람입니다.

1

마우스 중 하나를 마우스로 처리하지 않는 한, 둘 다 포인터를 계속 제어합니다. 그러나 IOKit을 사용하여 사용자 정의 USB HID 드라이버를 작성하여 앱을 마우스 중 하나 또는 둘 다에서 읽을 수 있도록 할 수 있습니다 (보통 마우스처럼 사용할 수는 있지만). Building Customized User Client Drivers for USB Devices은 USB 마우스와 직접 상호 작용하는 방법을 시작하기에 좋은 장소입니다.

+0

하나는 실제 커서를 숨기고 각 마우스의 위치를 ​​개별적으로 그릴 수 있습니다. –

+0

커서를 숨기고 커서에서 마우스의 연결을 해제 할 수 있습니다. http://developer.apple.com/documentation/GraphicsImaging/Conceptual/QuartzDisplayServicesConceptual/Articles/MouseCursor.html – Bids

3

I/O 키트 및 HID (Human Interface Device) 관리자 물건을 확인하고 싶습니다.

HID 관리자는 I/O Kit의 일부이므로 유용 할 수 있습니다. HID 관리를위한 두 가지 API가 있습니다. older API은 좀 더 고통 스럽습니다. 그러면 좀 더 편한 새로운 10.5 and above API을 갖게됩니다.

이해해야 할 중요한 사항은 이것이 곧바로 해결되지는 않을 것입니다. 실행하기 위해 중요한 작업이 필요할 수 있습니다. 10.5 이상을 설치했다고 가정 할 수 있다면 Leopard API를 사용하는 것이 분명 도움이 될 것입니다.

또한; 두 마우스의 정보를받는 경우에도 마우스 커서를 숨기려면 마우스 커서를 숨기는 것이 중요 할 수 있습니다. 응용 프로그램이 화면을 움켜 잡으면 CoreGraphics를 사용하여 커서를 비활성화하고 내 자신을 그립니다.

this question에서 이러한 API 중 하나에 대한 래퍼를 찾을 수도 있습니다.

+1

여기에서 C++ 래퍼를 찾을 수 있습니다. http : //www.wooji-juice.com/free/pyhid/ – Ross

0

아마도 usb->rsr232 변환기를 사용하고 직접 직렬 포트를 읽으려는 해결책일까요?