无法使用OpenFL Legacy Cpp Build在TextField中使用Ctrl+V



我目前正在使用HaxeUI库开发一个应用程序。在我的应用程序中,我正在创建基于OpenFL的TextFieldTextInput对象。不幸的是,在为Windows或Neko进行编译时,这些字段不允许使用基本功能,如Ctrl+V、<kbd]Ctrl>+CCtrl+A

因此,我觉得我可以对TextInput类进行自己的扩展,它只需使用KeyboardEvent.KEY_DOWN事件来检测这些特定的函数。以下是我的实现的相关片段:

class SmartTextInput extends TextInput {
    public function new() {
        super();
        this.addEventListener(KeyboardEvent.KEY_DOWN, performPress);
    }
    private function performPress(e:KeyboardEvent):Void {
        if(e.ctrlKey) {
            trace("CTRL PRESSED!");
            switch(e.keyCode) {
                case Keyboard.V: trace("PASTE!");
            }
        }
    }
}

看起来,如果我按Ctrl,然后按Vtrl按钮,那么KeyboardEvent.KEY_DOWN将不会注册任何其他按键,除了Alt+kbd>和ShifttrlV是不可能的,除非<kbd]V>被首先按下;然而,由于传统的Ctrl是先按下的,这对我来说不起作用。

有没有一种方法可以在OpenFL for Windows的TextField中注册像Ctrl+V这样的操作?或者至少,有没有一种方法可以检测Ctrl的顺序按键,然后是Vtrl,在KEY_UP上使用V

我使用的是OpenFL 3.6.0、Lime 2.9.0和HaxeUI 1.8.17。需要注意的是,HaxeUI需要OpenFL Legacy。在非传统的OpenFL中,我能够使Ctrl+V正常工作。

这就是他们下一步创建OpenFL的原因。我不确定在遗留系统中检测这些按键是不可能还是不容易,但我非常怀疑在这一点上是否会添加功能,因为您可以在下一步使用它。

因此,这有点像"OpenFL会添加到他们的遗留代码库中吗?"与"HaxeUI的下一个主要版本什么时候发布?"接下来的TextFields有足够多的问题,他们可能无法解决遗留的长期问题。一个新的HaxeUI最终会出现。

所以。。。不,你不能。还没有。

经过一番思考,我意识到使用KEY_UP作为解决方法时缺乏响应性是在V之前释放CTRL的结果。在正常应用程序中,这是可能的,因为粘贴操作发生在按下键时。

为了解决这个问题,我只是推迟了CTRL:的发布

class SmartTextInput extends TextInput {
    public function new() {
        super();
        ctrlDown = false;
        this.addEventListener(KeyboardEvent.KEY_DOWN, keyDown);
        this.addEventListener(KeyboardEvent.KEY_UP, keyUp);
    }
    private static inline var CTRL_SENSITIVITY = 100;
    private var ctrlDown:Bool;
    private function keyDown(e:KeyboardEvent):Void {
        if (e.keyCode == Keyboard.CONTROL || e.keyCode == Keyboard.COMMAND)
            ctrlDown = true;
    }
    private function keyUp(e:KeyboardEvent):Void {
        if (e.keyCode == Keyboard.CONTROL || e.keyCode == Keyboard.COMMAND)
        //  The delay here is for people who release control before releasing the letter key
            Timer.delay(function() {  ctrlDown = false; }, CTRL_SENSITIVITY);
        if (ctrlDown) {
            switch(e.keyCode) {
                case Keyboard.C: copy();
                case Keyboard.V: paste();
            }
        }
    }
}

虽然不是最佳的,但这似乎已经足够好了。

相关内容

  • 没有找到相关文章

最新更新