HarmonyOS鸿蒙Next中IM类应用适配PC快捷键最佳实践

HarmonyOS鸿蒙Next中IM类应用适配PC快捷键最佳实践

一、切换发送消息快捷键场景适配

场景介绍

IM(Instant Messaging,即时通讯)类应用在发送消息时,通常需要使用Enter键或Ctrl+Enter键作为发送消息快捷键,在使用TextArea/RichEditor组件作为输入组件时,Enter按键事件会被输入组件消费导致无法正确在onKeyEvent事件中响应事件。针对此场景,可以在应用内维护Ctrl键按下状态,通过keyEvent事件刷新状态,并使用输入组件的onSubmit回调作为响应入口,正确响应消息发送事件。

功能介绍

  1. 维护Ctrl按键状态并通过keyEvent事件刷新:
@State ctrlFlag: boolean = false; // 维护ctrl按键状态 

.onKeyEvent((event: KeyEvent) => { 
  if (event.getModifierKeyState) { 
    // 每次keyEvent更新ctrl按键状态 
    this.ctrlFlag = event.getModifierKeyState(['Ctrl']); 
  } 
})
  1. 响应onSubmit事件发送消息:
.enterKeyType(this.enterTypes[this.switchIndex]) // 通过switchIndex切换当前组件的enterKeyType 
.onSubmit((enterKey: EnterKeyType, event: SubmitEvent) => { 
  console.info('onSubmit', enterKey); 
  // 通过enterKeyType和ctrl状态判断当前执行发送还是换行逻辑 
  if ((enterKey === EnterKeyType.Send && !this.ctrlFlag) || (enterKey === EnterKeyType.NEW_LINE && this.ctrlFlag)) { 
    this.submit() // 执行发送逻辑 
  } else if (enterKey === EnterKeyType.Send && this.ctrlFlag){ 
    this.controller.addTextSpan('\n'); // 执行换行逻辑 
  } 
  event.keepEditableState(); // 输入框保持输入态,保证输入连续性 
}) 
  1. 使用Select组件切换消息发送快捷键:
@State enterTypes: Array<EnterKeyType> = [EnterKeyType.Send, EnterKeyType.NEW_LINE] 
@State switchText: string = 'Enter' 
@State switchIndex: number = 0; 
 
Select([{ value: 'Enter' }, { value: 'Ctrl + Enter' }]) 
  .selected(this.switchIndex) // 使用switchIndex作为当前选择模式的索引 
  .font({ size: 16, weight: 500 }) 
  .value(this.switchText) 
  .fontColor('#182431') 
  .selectedOptionFont({ size: 16, weight: 400 }) 
  .optionFont({ size: 16, weight: 400 }) 
  .menuAlign(MenuAlignType.START, { dx: 0, dy: 0 }) 
  .optionWidth(200) 
  .optionHeight(300) 
  .onSelect((index: number, text?: string | undefined) => { 
    console.info('Select:' + index) 
    this.switchIndex = index; 
    this.switchText = text as string; 
  })
  1. 使用Button组件作为发送消息的按钮:
Button('Submit').onClick(() => { 
  // submit为执行发送消息的逻辑处理  
  this.submit(); 
})

规范标准

按键事件数据流

71.png

按键事件由外设键盘等设备触发,经驱动和多模处理转换后发送给当前获焦的窗口,窗口获取到事件后,会尝试分发三次事件。三次分发的优先顺序如下,一旦事件被消费,则跳过后续分发流程。

  1. 首先分发给ArkUI框架用于触发获焦组件绑定的onKeyPreIme回调和页面快捷键。
  2. 再向输入法分发,输入法会消费按键用作输入。
  3. 再次将事件发给ArkUI框架,用于响应系统默认Key事件(例如走焦),以及获焦组件绑定的onKeyEvent回调。

因此,当某输入框组件获焦,且打开了输入法,此时大部分按键事件均会被输入法消费。例如字母键会被输入法用来向输入框中输入对应字母字符、方向键会被输入法用来切换选中备选词。如果在此基础上给输入框组件绑定了快捷键,那么快捷键会优先响应事件,事件也不再会被输入法消费。

按键事件到ArkUI框架之后,会先找到完整的父子节点获焦链。从叶子节点到根节点,逐一发送按键事件。

效果示例

72.gif


更多关于HarmonyOS鸿蒙Next中IM类应用适配PC快捷键最佳实践的实战教程也可以访问 https://www.itying.com/category-93-b0.html

2 回复

在HarmonyOS鸿蒙Next中适配PC快捷键,需使用ArkTS的键盘事件监听API。通过onKeyEvent回调处理按键事件,支持组合键(如Ctrl+C)。在IM类应用中,需注册全局快捷键并绑定对应业务逻辑,例如Enter键发送消息、Ctrl+F搜索。注意区分PC和移动端设备类型,使用featureAbility.getDeviceType()进行判断。

关键代码示例:

.onKeyEvent((event: KeyEvent) => {
  if (event.keyCode === 4097 && event.ctrlPressed) { // Ctrl+A
    selectAllMessages();
  }
})

需在manifest.json中声明键盘能力,并测试不同键盘布局的兼容性。

更多关于HarmonyOS鸿蒙Next中IM类应用适配PC快捷键最佳实践的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


针对HarmonyOS Next中IM类应用适配PC快捷键的问题,以下是关键实践要点:

  1. 消息发送快捷键适配:
  • 使用onKeyEvent监听Ctrl键状态,结合onSubmit回调处理发送逻辑
  • 通过enterKeyType切换Enter键行为(发送/换行)
  • 示例代码中展示了如何维护Ctrl状态并根据不同模式执行发送或换行操作
  1. 后台唤起功能:
  • 使用inputConsumer模块注册全局快捷键(如Ctrl+Alt+Z)
  • 在回调中调用window.restore()恢复窗口
  • 需注意权限声明和错误处理
  1. 截图功能实现:
  • 同样使用inputConsumer注册快捷键(如Ctrl+Alt+A)
  • 调用screenshot.pick()接口实现截图
  • 示例中包含完整的截图回调处理和资源释放

关键注意事项:

  • 输入法会优先消费按键事件,需合理设计事件处理流程
  • 使用keepEditableState保持输入框状态
  • 及时释放截图获得的PixelMap资源

这些实践方案已在示例代码中完整实现,可直接参考或集成到IM应用中。

回到顶部