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

时间:2016-04-06 03:10:47

标签: haxe openfl haxeui

我目前正在使用HaxeUI库处理应用程序。在我的应用程序中,我正在创建Visual Studio个对象,这些对象基于OpenFL的TextInput。不幸的是,在编译Windows或Neko时,这些字段不允许基本功能,如 Ctrl + V Ctrl + C < / kbd>,或 Ctrl + A

结果,我觉得我可以自己扩展TextField类,只使用TextInput事件来检测这些特定的功能。以下是我实施的相关摘要:

KeyboardEvent.KEY_DOWN

如果我按 Ctrl 然后 V ,它应打印出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 PRESSED!"。但是,我只得到"PASTE!",所以它不起作用。事实上,经过一些严格的测试后,我发现如果按住 Ctrl 按钮,那么"CTRL PRESSED!"将不会注册除 Alt 和<之外的任何其他按键。 kbd> Shift 键。换句话说,检测 Ctrl V 是不可能的,除非先按下 V ;但是,由于首先按下 Ctrl ,这对我不起作用。

有没有办法可以在OpenFL for Windows中的KeyboardEvent.KEY_DOWN中注册 Ctrl + V 等操作?或者至少,有没有办法可以检测 Ctrl 的顺序按键,然后是 V ?我已尝试在TextField上的 Ctrl KEY_DOWN上的 V ,但它的响应性不足以实际使用。

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

2 个答案:

答案 0 :(得分:1)

这就是他们接下来制作OpenFL的原因。我不确定在遗留下检测这些按键是否不可能或不容易,但我非常怀疑此时会添加功能,因为您可以使用它来继续使用。

所以它有点“OpenFL会增加他们的遗留代码库吗?”“HaxeUI的下一个主要版本什么时候出来?”有足够的问题随着TextFields的出现,他们可能不会解决传统长期存在的问题。新的HaxeUI最终即将到来。

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

答案 1 :(得分:0)

经过一番思考之后,我开始意识到使用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();
            }
        }
    }
}

虽然不是最佳,但这似乎运作得很好。