Android Framework层截获按键消息

代码位置:

frameworks/base/services/input/InputDispatcher.cpp

所在函数:

  1. void InputDispatcher::notifyKey( const NotifyKeyArgs* args) {
  2. #if DEBUG_INBOUND_EVENT_DETAILS
  3. ALOGD( "notifyKey - eventTime=%lld, deviceId=%d, source=0x%x, policyFlags=0x%x, action=0x%x, "
  4. "flags=0x%x, keyCode=0x%x, scanCode=0x%x, metaState=0x%x, downTime=%lld",
  5. args->eventTime, args->deviceId, args->source, args->policyFlags,
  6. args->action, args->flags, args->keyCode, args->scanCode,
  7. args->metaState, args->downTime);
  8. #endif
  9. if (!validateKeyEvent(args->action)) {
  10. return;
  11. }
  12. uint32_t policyFlags = args->policyFlags;
  13. int32_t flags = args->flags;
  14. int32_t metaState = args->metaState;
  15. if ((policyFlags & POLICY_FLAG_VIRTUAL) || (flags & AKEY_EVENT_FLAG_VIRTUAL_HARD_KEY)) {
  16. policyFlags |= POLICY_FLAG_VIRTUAL;
  17. flags |= AKEY_EVENT_FLAG_VIRTUAL_HARD_KEY;
  18. }
  19. if (policyFlags & POLICY_FLAG_ALT) {
  20. metaState |= AMETA_ALT_ON | AMETA_ALT_LEFT_ON;
  21. }
  22. if (policyFlags & POLICY_FLAG_ALT_GR) {
  23. metaState |= AMETA_ALT_ON | AMETA_ALT_RIGHT_ON;
  24. }
  25. if (policyFlags & POLICY_FLAG_SHIFT) {
  26. metaState |= AMETA_SHIFT_ON | AMETA_SHIFT_LEFT_ON;
  27. }
  28. if (policyFlags & POLICY_FLAG_CAPS_LOCK) {
  29. metaState |= AMETA_CAPS_LOCK_ON;
  30. }
  31. if (policyFlags & POLICY_FLAG_FUNCTION) {
  32. metaState |= AMETA_FUNCTION_ON;
  33. }
  34. policyFlags |= POLICY_FLAG_TRUSTED;
  35. KeyEvent event;
  36. event.initialize(args->deviceId, args->source, args->action,
  37. flags, args->keyCode, args->scanCode, metaState, 0,
  38. args->downTime, args->eventTime);
  39. mPolicy->interceptKeyBeforeQueueing(&event, /*byref*/ policyFlags);
  40. if (policyFlags & POLICY_FLAG_WOKE_HERE) {
  41. flags |= AKEY_EVENT_FLAG_WOKE_HERE;
  42. }
  43. bool needWake;
  44. { // acquire lock
  45. mLock.lock();
  46. if (shouldSendKeyToInputFilterLocked(args)) {
  47. mLock.unlock();
  48. policyFlags |= POLICY_FLAG_FILTERED;
  49. if (!mPolicy->filterInputEvent(&event, policyFlags)) {
  50. return; // event was consumed by the filter
  51. }
  52. mLock.lock();
  53. }
  54. int32_t repeatCount = 0;
  55. KeyEntry* newEntry = new KeyEntry(args->eventTime,
  56. args->deviceId, args->source, policyFlags,
  57. args->action, flags, args->keyCode, args->scanCode,
  58. metaState, repeatCount, args->downTime);
  59. needWake = enqueueInboundEventLocked(newEntry);
  60. mLock.unlock();
  61. } // release lock
  62. if (needWake) {
  63. mLooper->wake();
  64. }
  65. }


notifyKey这个函数是按键消息,包括鼠标,键盘,遥控器,游戏手柄,虚拟键值等等消息的中转站
所以,在这个函数里你可以截获任何的按键消息,如HOME键等等,可以说这个函数就是一个水龙头,具体要做什么,就看有什么需求了。

猜你喜欢

转载自blog.csdn.net/grandgrandpa/article/details/81015283