无法使用 OpenFL Legacy Cpp Build 在 TextField 中使用 Ctrl+V
Cannot Ctrl+V in TextField with OpenFL Legacy Cpp Build
我目前正在开发一个使用 HaxeUI 库的应用程序。在我的应用程序中,我正在创建基于 OpenFL 的 TextField
的 TextInput
对象。不幸的是,在为 Windows 或 Neko 编译时,这些字段不允许像 Ctrl+V、[=33= 这样的基本功能]Ctrl+C,或Ctrl+A.
因此,我觉得我可以对 TextInput
class 进行自己的扩展,它只使用 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!"
和 "PASTE!"
.但是,我只得到 "CTRL PRESSED!"
,所以它不起作用。事实上,经过一些严格的测试,我发现如果按住 Ctrl 按钮,那么 KeyboardEvent.KEY_DOWN
将不会注册除 Alt[ 之外的任何其他按键。 =56=] 和 Shift 键。也就是说,检测到Ctrl和V同时被按住是不可能的除非V 先按下;但是,由于通常先按 Ctrl,这对我不起作用。
有没有办法可以在 OpenFL 的 TextField
中为 [=80] 注册像 Ctrl+V 这样的操作=]?或者至少,有没有一种方法可以检测 Ctrl 的顺序按键,然后是 V?我试过在 KEY_DOWN
上使用 Ctrl,在 KEY_UP
上使用 V,但它的响应速度不够实际使用.
我正在使用 OpenFL 3.6.0、Lime 2.9.0 和 HaxeUI 1.8.17。需要注意的是,HaxeUI 需要 OpenFL Legacy。在非旧版 OpenFL 中,我能够让 Ctrl+V 正常工作。
这就是他们接下来开发 OpenFL 的原因。我不确定是否不可能或不容易检测到旧版中的这些按键,但我非常怀疑此时会添加功能,因为您可以使用 next。
所以它有点像 "Will OpenFL add to their legacy codebase?" 与 "When does the next major version of HaxeUI come out?" 接下来的 TextFields 有很多问题他们可能不会同时解决 legacy 长期存在的问题。最终会出现一个新的 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();
}
}
}
}
虽然不是最优的,但这似乎工作得很好。
我目前正在开发一个使用 HaxeUI 库的应用程序。在我的应用程序中,我正在创建基于 OpenFL 的 TextField
的 TextInput
对象。不幸的是,在为 Windows 或 Neko 编译时,这些字段不允许像 Ctrl+V、[=33= 这样的基本功能]Ctrl+C,或Ctrl+A.
因此,我觉得我可以对 TextInput
class 进行自己的扩展,它只使用 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!"
和 "PASTE!"
.但是,我只得到 "CTRL PRESSED!"
,所以它不起作用。事实上,经过一些严格的测试,我发现如果按住 Ctrl 按钮,那么 KeyboardEvent.KEY_DOWN
将不会注册除 Alt[ 之外的任何其他按键。 =56=] 和 Shift 键。也就是说,检测到Ctrl和V同时被按住是不可能的除非V 先按下;但是,由于通常先按 Ctrl,这对我不起作用。
有没有办法可以在 OpenFL 的 TextField
中为 [=80] 注册像 Ctrl+V 这样的操作=]?或者至少,有没有一种方法可以检测 Ctrl 的顺序按键,然后是 V?我试过在 KEY_DOWN
上使用 Ctrl,在 KEY_UP
上使用 V,但它的响应速度不够实际使用.
我正在使用 OpenFL 3.6.0、Lime 2.9.0 和 HaxeUI 1.8.17。需要注意的是,HaxeUI 需要 OpenFL Legacy。在非旧版 OpenFL 中,我能够让 Ctrl+V 正常工作。
这就是他们接下来开发 OpenFL 的原因。我不确定是否不可能或不容易检测到旧版中的这些按键,但我非常怀疑此时会添加功能,因为您可以使用 next。
所以它有点像 "Will OpenFL add to their legacy codebase?" 与 "When does the next major version of HaxeUI come out?" 接下来的 TextFields 有很多问题他们可能不会同时解决 legacy 长期存在的问题。最终会出现一个新的 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();
}
}
}
}
虽然不是最优的,但这似乎工作得很好。