修改 electron 中 textarea/menu 的 undo/redo 行为

Modify undo/redo behaviour on a textarea/menu in electron

我开发电子应用
使用 canvas 和多个文本区域编辑 UML 序列图的应用程序。
由于 window 上的文本区域接受撤消 (Ctrl + z),因此不会调用 Electron 菜单上的撤消。
如何使文本区域的撤消无效并将 Control + z 传递给电子菜单?

重现步骤

在 Electron 的菜单中注册撤消 (Ctrl + z)。
创建包含文本区域的应用程序屏幕。
启动应用程序。
编辑文本区域。
(不关注文本区域)按 Ctrl + z。

我希望看到的

调用了 Electron 菜单中的撤消。

我看到的是什么

焦点移动到文本区域。
textarea的内容被撤销
不调用 Electron 菜单中的撤消。

其他

并不完美。

我今天遇到了同样的问题。我认为这是电子中的一个错误,当设置加速器时,它们不会覆盖输入字段的本机 ctrl + z 和 ctrl + y。

我找到了解决这个问题的方法:

let zDown = false;
let zFired = false;
let yDown = false;
let yFired = false;
document.onkeydown = function(e) {
    if (e.ctrlKey) {
        if (e.key === 'z') {
            zDown = true;
        }
        else if (e.key === 'y') {
            yDown = true;
        }
    }
};
document.onkeyup = function(e) {
    if (e.key === 'z' && zDown) {
        if (!zFired) {
            menu.getMenuItemById('undo').click();
        }
        zDown = zFired = false;
    }
    else if (e.key === 'y' && yDown) {
        if (!yFired) {
            menu.getMenuItemById('redo').click();
        }
        yDown = yFired = false;
    }
};

let menu = Menu.buildFromTemplate([{
    "label": "Edit",
    "submenu": [{
        "id": "undo",
        "label": "Undo",
        "accelerator": "CmdOrCtrl + z",
        click: () => {
            zFired = true;
            app.undo();
        }
    }, {
        "id": "redo",
        "label": "Redo",
        "accelerator": "CmdOrCtrl + y",
        click: () => {
            yFired = true;
            app.redo();
        }
    }]
}]);

它很脏,但它能用。