8

iOS でタッチ イベントをシミュレートすることが可能であり、バックグラウンドで CTTelephonyCenterAddObserver と CFNotificationCenterAddObserver を使用してさまざまなシステム全体の通知を受け取ることができます。

ただし、バックグラウンドでタッチ通知を受け取る方法をまだ見つけていません。CFNotificationCenterAddObserver で使用できる「タッチ イベント」、使用できる別の通知センター、またはまったく異なるアプローチはありますか?

低レベルのタッチ情報 (例: x、y 座標、タッチ タイプ) に満足しますが、高レベルの情報 (例: キーが押された、戻るボタンが押されたなど) はさらに良いでしょう!

4

1 に答える 1

18

IOKit のIOHIDを使用して、x、y 座標を取得できます。

#include <IOHIDEventSystem.h>

IOHIDEventSystemClient を作成します。

void *ioHIDEventSystem = IOHIDEventSystemClientCreate(kCFAllocatorDefault);

コールバックを登録します。

IOHIDEventSystemClientScheduleWithRunLoop(ioHIDEventSystem, CFRunLoopGetCurrent(), kCFRunLoopDefaultMode);
IOHIDEventSystemClientRegisterEventCallback(ioHIDEventSystem, handle_event, NULL, NULL);

コールバックの登録を解除します:

IOHIDEventSystemClientUnregisterEventCallback(ioHIDEventSystem, handle_event, NULL, NULL);
IOHIDEventSystemClientUnscheduleWithRunLoop(ioHIDEventSystem, CFRunLoopGetCurrent(), kCFRunLoopDefaultMode);

折り返し電話:

void handle_event (void* target, void* refcon, IOHIDServiceRef service, IOHIDEventRef event) {
   if (IOHIDEventGetType(event)==kIOHIDEventTypeDigitizer){
       IOHIDFloat x=IOHIDEventGetFloatValue(event, (IOHIDEventField)kIOHIDEventFieldDigitizerX);
       IOHIDFloat y=IOHIDEventGetFloatValue(event, (IOHIDEventField)kIOHIDEventFieldDigitizerY);
       int width = [[UIScreen mainScreen] bounds].size.width;
       int height = [[UIScreen mainScreen] bounds].size.height;
       NSLog(@"click : %f, %f", x*width, y*height) ;
   }
}

また、これを確認することもできます: iOS6 で IOHIDEventSystemCreate が失敗しました。お役に立てれば。

編集: ログの結果を参照してください。iPhone 4 および 5 でテスト済み。

void handle_event (void* target, void* refcon, IOHIDServiceRef service, IOHIDEventRef event) {
    NSLog(@"handle_event : %d", IOHIDEventGetType(event));
if (IOHIDEventGetType(event)==kIOHIDEventTypeDigitizer){
    IOHIDFloat x=IOHIDEventGetFloatValue(event, (IOHIDEventField)kIOHIDEventFieldDigitizerX);
    IOHIDFloat y=IOHIDEventGetFloatValue(event, (IOHIDEventField)kIOHIDEventFieldDigitizerY);
    NSLog(@" x %f : y %f", x, y);
//2013-03-28 10:02:52.169 MyIOKit[143:907] handle_event : 11
//2013-03-28 10:02:52.182 MyIOKit[143:907]  x 0.766754 : y 0.555023
}
}
于 2013-03-21T14:54:59.883 に答える