我目前正在使用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 正常工作。
答案 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();
}
}
}
}
虽然不是最佳,但这似乎运作得很好。