You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Forge Viewer自定义工具中deactivateTool方法在Windows系统下不生效,Mac系统正常的问题求助

Forge Viewer自定义工具中deactivateTool方法在Windows系统下不生效,Mac系统正常的问题求助

我最近在做一个Forge Viewer的自定义工具,想要实现只有按住Shift键的时候才启用框选功能。这个功能在Mac设备上完全符合预期,但在Windows上却出问题了——框选能被正常激活,可一旦松开Shift键,框选就停不下来,始终处于激活状态。

我已经确认过,handleKeyDown和handleKeyUp这两个事件处理函数在两个系统上都会被正常触发,所以我猜测问题出在deactivateTool这个内部函数的执行上。我试着调试了相关逻辑,发现代码里有一些针对Mac的特定处理,但还是没找到问题的根源。

我还尝试同时检查event.key和keyCode来兼容不同平台的键值差异,但并没有解决问题。

下面是我写的自定义框选工具代码:

/**
 * Custom forge viewer tool to restrict box-selection to the shift key
 * @param viewer Reference to the forge viewer instance
 * @see Forge Documentation
 */
export const getCustomBoxSelectionTool = (viewer) => {
  if (!viewer?.toolController) return null;

  const customTool = {
    active: false,
    getName: () => 'custom-box-selection',
    getNames: () => ['custom-box-selection'],
    getPriority: () => 1, // Set priority in the tool chain
    activate: () => {
      customTool.active = true;
    },
    deactivate: () => {
      customTool.active = false;
    },
    handleKeyDown: (event, keyCode) => {
      // Prevent the default box-selection behaviour
      if (event.key === 'Control' || keyCode === 17) {
        viewer.toolController.deactivateTool('box-selection');
        return true; // Stop propagation
      }

      // Enable new box-selection behaviour
      if (event.key === 'Shift' || keyCode === 16) {
        viewer.toolController.activateTool('box-selection');
      }

      return false; // Allow propagation
    },
    handleKeyUp: (event, keyCode) => {
      // Disable box-selection after shift is released
      if (event.key === 'Shift' || keyCode === 17) {
        viewer.toolController.deactivateTool('box-selection');
      }

      return false; // Allow propagation
    }
  };

  return customTool;
};

我的解答:

嘿,兄弟,我一眼就看到你代码里有个超容易踩的小坑!看你handleKeyUp里的判断条件:

if (event.key === 'Shift' || keyCode === 17)

这里的keyCode === 17写错啦!17是Ctrl键的键码,Shift键的键码明明是16啊!

这就完美解释了为啥Windows出问题:Windows系统下大概率更依赖keyCode判断按键,你松开Shift时keyCode是16,根本不满足17的条件,所以deactivateTool根本没被执行;而Mac系统下event.key === 'Shift'这个条件能命中,所以一切正常。

你把这里的17改成16,应该就能直接解决Windows上的问题了,修正后的handleKeyUp代码如下:

handleKeyUp: (event, keyCode) => {
  // Disable box-selection after shift is released
  if (event.key === 'Shift' || keyCode === 16) {
    viewer.toolController.deactivateTool('box-selection');
  }

  return false; // Allow propagation
}

另外提个小建议:你在handleKeyDown里对Ctrl键的处理,是要禁用默认框选对吧?可以后续再确认下Windows上Ctrl键的event.key取值是否和Mac一致,但先把Shift这个错误改了,核心问题肯定能解决!

备注:内容来源于stack exchange,提问作者Michael Rayner

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 15:38:01