1# 组件快捷键事件 2 3开发者可以设置组件的自定义组合键,每个组件可以设置多个组合键。 4 5即使组件未获焦或是在所在页面未展示,只要已经挂载到获焦窗口的组件树上就会响应自定义组合键。 6 7开发者在设置组合键的同时可以设置自定义事件,组合键按下时,触发该自定义事件,若没有设置自定义事件,则组合键行为与click行为一致。 8 9> **说明:** 10> 11> 从API Version 10开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 12 13## keyboardShortcut 14 15keyboardShortcut(value: string | FunctionKey, keys: Array\<ModifierKey>, action?: () => void): T 16 17设置组件的自定义组合键。 18 19**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。 20 21**系统能力:** SystemCapability.ArkUI.ArkUI.Full 22 23**参数:** 24 25| 参数名 | 参数类型 | 必填 | 参数描述 | 26| ----- | ------------------------------------- | ---- | ---------------------------------------- | 27| value | string \| [FunctionKey](ts-appendix-enums.md#functionkey) | 是 | 热键的单个字符(可以通过键盘输入的字符)或[FunctionKey](ts-appendix-enums.md#functionkey)。<br />空字符串意为取消快捷键绑定。<br/> | 28| keys | Array\<[ModifierKey](ts-appendix-enums.md#modifierkey)> | 是 | 热键组合。<br />仅当value为[FunctionKey](ts-appendix-enums.md#functionkey)的情况下可以为空。<br/> | 29| action | () => void | 否 | 组合快捷键触发成功后的自定义事件回调。<br/> | 30 31**返回值:** 32 33| 类型 | 说明 | 34| -------- | -------- | 35| T | 返回当前组件。 | 36 37## 快捷键使用注意事项 38 39快捷键是对系统按键的响应,优先于普通的按键事件`OnKeyEvent`,按键事件触发的逻辑详见[按键事件数据流](../../../ui/arkts-common-events-device-input-event.md#按键事件数据流)。 40 41| 场景 | 快捷键处理逻辑 | 例子 | 42| ---------------------------------------- | ---------------------------------- | ---------------------------------------- | 43| 所有支持onClick事件的组件 | 支持自定义组合键 | 无 | 44| 自定义组合键要求 | 控制键Ctrl、Shift、Alt及它们的组合加上其它可输入字符按键 | Button('button1').keyboardShortcut('a',[ModifierKey.CTRL]) | 45| 多个不同组件设置相同组合键 | 只响应结点树上的第一个组件,其它组件不响应快捷键。 | Button('button1').keyboardShortcut('a',[ModifierKey.CTRL])<br />Button('button2').keyboardShortcut('a',[ModifierKey.CTRL]) | 46| 无论组件是否获得焦点 | 只要窗口获焦快捷键就会响应 | 无 | 47| 使用单个`FunctionKey`触发快捷键 | 单个`FunctionKey`,没有`ModifierKey`,可以绑定为快捷键 | Button('button1').keyboardShortcut(FunctionKey.F2,[]) | 48| `keyboardShortcut`的入参`value`为空 | 取消绑定的快捷键。<br />绑定多个快捷键的时候无法取消快捷键。| Button('button1').keyboardShortcut('',[ModifierKey.CTRL])<br />Button('button2').keyboardShortcut('',[]) | 49| 独立pipeline子窗口、主窗口共存的情况下 | 获焦的窗口响应快捷键 | 无 | 50| keyboardShortcut接口中的keys命令中ctrl、shift、alt | 不区分左右键都响应 | Button('button1').keyboardShortcut('a',[ModifierKey.CTRL, ModifierKey.ALT]) | 51| keyboardShortcut接口中的value单个字符 | 不区分大小写都响应 | Button('button1').keyboardShortcut('a',[ModifierKey.CTRL])<br />Button('button2').keyboardShortcut('A',[ModifierKey.CTRL]) | 52| 快捷键的响应 | `keys`键处于按下状态且`value`键触发down事件(长按会连续响应) | 无 | 53| 隐藏组件<br /> | 响应快捷键 | 无 | 54| disable状态组件 | 不响应快捷键 | 无 | 55| 1. 组件的组合键(包括系统预定义快捷键)相同时。<br />2. 接口参数value有多个字符时。<br />3. 接口参数keys有重复的控制键时。 | 这几种情况不绑定组合键, 先前绑定的组合键仍然有效 | Button('button1').keyboardShortcut(FunctionKey.F4,[ModifierKey.ALT])<br />Button('button2').keyboardShortcut('ab',[ModifierKey.CTRL])<br />Button('button3').keyboardShortcut('ab',[ModifierKey.CTRL,ModifierKey.CTRL]) | 56 57### 禁止绑定的系统快捷键 58 59以下组合键绑定为快捷键不生效。 60 61- `Alt` + `F4` 62- `Alt` + `Shift` + `F4` 63- `Alt` + `TAB` 64- `Alt` + `Shift` + `TAB` 65- `Ctrl` + `Shift` + `ESC` 66 67### 系统已存在的按键事件 68 69已存在如下系统响应的按键事件,具体规格如下表。 70 71表中的按键事件与自定义按键事件的触发有优先级关系,高优先级的事件会拦截低优先级事件,焦点事件响应优先级详见[按键事件数据流](../../../ui/arkts-common-events-device-input-event.md#按键事件数据流)。 72 73| 快捷键 | 获焦组件 | 用途 | 事件处理类别 | 74| ----- | ---- | ---- | ---- | 75| 方向键、Shift + 方向键 | 输入框组件 | 移动光标 | 输入法 | 76| 方向键、Shift + 方向键 | 通用组件 | 系统处于走焦状态时,用于方向走焦 | 系统按键 | 77| TAB、Shift + TAB | 通用组件 | 触发进入走焦状态/走焦 | 系统按键 | 78 79## 示例 80 81### 示例1(设置组件快捷键) 82 83该示例通过设置组件的快捷键,同时按控制键+对应的字符可以触发组件响应快捷键,并触发onClick事件或自定义事件。 84 85```ts 86@Entry 87@Component 88struct Index { 89 @State message: string = 'Hello World' 90 91 build() { 92 Row() { 93 Column({ space: 5 }) { 94 Text(this.message) 95 Button("Test short cut 1").onClick((event: ClickEvent) => { 96 this.message = "I clicked Button 1"; 97 console.log("I clicked 1"); 98 }).keyboardShortcut('.', [ModifierKey.SHIFT, ModifierKey.CTRL, ModifierKey.ALT]) 99 .onKeyEvent((event: KeyEvent)=>{ 100 console.log("event.keyCode: " + JSON.stringify(event)); 101 }) 102 Button("Test short cut 2").onClick((event: ClickEvent) => { 103 this.message = "I clicked Button 2"; 104 console.log("I clicked 2"); 105 }).keyboardShortcut('1', [ModifierKey.CTRL]) 106 Button("Test short cut 3").onClick((event: ClickEvent) => { 107 this.message = "I clicked Button 3"; 108 console.log("I clicked 3"); 109 }).keyboardShortcut('A', [ModifierKey.SHIFT]) 110 Button("Test short cut 4").onClick((event: ClickEvent) => { 111 this.message = "I clicked Button 4"; 112 console.log("I clicked 4"); 113 }).keyboardShortcut(FunctionKey.F5, [], () => { 114 this.message = "I clicked Button 4"; 115 console.log("I clicked user callback."); 116 }).keyboardShortcut(FunctionKey.F3, []) 117 } 118 .width('100%') 119 } 120 .height('100%') 121 } 122} 123``` 124 125  126 127### 示例2(注册和解注册快捷键绑定) 128 129该示例演示了如何实现按键注册和解注册快捷键绑定。 130 131```ts 132@Entry 133@Component 134struct Index { 135 @State message: string = 'disable' 136 @State shortCutEnable: boolean = false 137 @State keyValue: string = '' 138 139 build() { 140 Row() { 141 Column({ space: 5 }) { 142 Text('Ctrl+A is ' + this.message) 143 Button("Test short cut").onClick((event: ClickEvent) => { 144 this.message = "I clicked Button"; 145 console.log("I clicked"); 146 }).keyboardShortcut(this.keyValue, [ModifierKey.CTRL]) 147 Button(this.message + 'shortCut').onClick((event: ClickEvent) => { 148 this.shortCutEnable = !this.shortCutEnable; 149 this.message = this.shortCutEnable ? 'enable' : 'disable'; 150 this.keyValue = this.shortCutEnable ? 'a' : ''; 151 }) 152 Button('multi-shortcut').onClick((event: ClickEvent) => { 153 console.log('Trigger keyboard shortcut success.') 154 }).keyboardShortcut('q', [ModifierKey.CTRL]) 155 .keyboardShortcut('w', [ModifierKey.CTRL]) 156 .keyboardShortcut('', []) // 不生效,绑定了多个快捷键的组件不能取消快捷键 157 } 158 .width('100%') 159 } 160 .height('100%') 161 } 162} 163``` 164 165 