CGEventTapCreateForPSN
アプリケーションのキーをトラップおよびフィルタリングするために使用しています。他のアプリケーションのイベントをインターセプトすることに興味はありません。イベントタップは私の目的には重すぎると確信していますが、より良い方法を見つけることができず、イベントタップを使用すると機能します。
具体的には、このコードは私が望むことを行います。
GetCurrentProcess(&psn);
CFMachPortRef eventTap = CGEventTapCreateForPSN(
&psn,
kCGHeadInsertEventTap,
kCGEventTapOptionDefault,
CGEventMaskBit(kCGEventKeyDown)
| CGEventMaskBit(kCGEventKeyUp),
eventCallback,
userInfo);
また、コールバックは適切に処理され、イベントは現在のアプリケーションからのみインターセプトされます。
残念ながら、現在の値を取得するすべてのメソッドProcessSerialNumber
は 10.9 で廃止されました。ProcessSerialNumber
この初期化により、同じプロセス内の他のルーチンに渡す古い標準的な方法があります...
ProcessSerialNumber psn = { 0, kCurrentProcess };
しかし、それは呼び出し時には機能しませんCGEventTapCreateForPSN
。ヘッダー ファイル docs はそのことを示しており、次のコード スニペットは確認として返さNULL
れます。
ProcessSerialNumber psn = { 0, kCurrentProcess };
CFMachPortRef eventTap = CGEventTapCreateForPSN(
&psn,
kCGHeadInsertEventTap,
kCGEventTapOptionDefault,
CGEventMaskBit(kCGEventKeyDown)
| CGEventMaskBit(kCGEventKeyUp),
eventCallback,
userInfo);
使用できますCGEventTapCreate
が、ホスト全体をタップします。アプリケーションに向けられていないものをフィルタリングする必要があり、CGEventTapProxy
不透明であり、それを使用して自分のアプリかどうかを判断する方法がわかりません。
廃止されたコードがまだ機能することを確認しましたが、Apple はいつでも削除することができます。CGEventTapCreateForPSN
それで、 Mavericks以降に電話をかけるためにどのように進めるべきか、誰か知っていますか?
ありがとう!
アップデート
10.11(エルキャピタンだったと思います)では、新しい機能が追加されました。ドキュメントはありませんが、 とほぼ同じ署名がありCGEventTapCreateForPSN
ます。
CFMachPortRef CGEventTapCreateForPSN(
void *processSerialNumber,
CGEventTapPlacement place,
CGEventTapOptions options,
CGEventMask eventsOfInterest,
CGEventTapCallBack callback,
void *userInfo);
CFMachPortRef CGEventTapCreateForPid(
pid_t pid,
CGEventTapPlacement place,
CGEventTapOptions options,
CGEventMask eventsOfInterest,
CGEventTapCallBack callback,
void *userInfo);
したがって、PID を最初のパラメーターとして使用できるため、非推奨の関数は必要ありません。