1

我目前正在使用 HaxeUI 库开发一个应用程序。在我的应用程序中,我正在创建TextInput基于 OpenFL 的TextField. 不幸的是,在为 Windows 或 Neko 编译时,这些字段不允许使用Ctrl+ VCtrl+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然后V,它应该打印出"CTRL PRESSED!"and "PASTE!"。但是,我只得到"CTRL PRESSED!",所以它不起作用。事实上,经过一番激烈的测试,我发现如果Ctrl按住按钮,则KeyboardEvent.KEY_DOWN不会注册除Alt和键之外的任何其他按键Shift。也就是说,除非先按下,否则无法同时检测CtrlV保持;但是,由于通常先按下,这对我不起作用。 VCtrl

有没有办法可以在 OpenFL for Windows中注册Ctrl+之类V的操作?TextField或者至少,有没有一种方法可以检测到的顺序按键Ctrl,然后是V?我已经尝试过CtrlonKEY_DOWNVon KEY_UP,但它对实际使用的响应速度不够快。

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

4

2 回答 2

1

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

所以这有点像“OpenFL 会添加到他们的遗留代码库吗?” “HaxeUI 的下一个主要版本何时发布?” 接下来的 TextFields 有足够多的问题,它们可能不会解决遗留的长期问题。一个新的 HaxeUI 终将到来。

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

于 2016-04-09T23:44:38.533 回答
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();
            }
        }
    }
}

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

于 2016-04-10T23:59:36.077 回答