在 wxperl 中捕获关键事件

Catching key event in wxperl

我想在 wxperl 应用程序的顶层捕获按键。 从文档看来应该使用 EVT_CHAR EVT_CHAR_HOOK EVT_KEY_DOWN.

之一

在以下代码中,EVT_LEFT_DOWN 有效,但 EVT_KEY_DOWN(或任何替代项)无效。

有人知道该怎么办吗? OS X,顺便说一句。

use warnings;
use strict;
use Wx;

package MyApp;
use base 'Wx::App';
use Wx::Event
    qw(EVT_LEFT_DOWN EVT_CHAR EVT_CHAR_HOOK EVT_KEY_DOWN);

sub OnInit {
    my( $self ) = @_;

    my $frame = Wx::Frame->new(
        undef,
        -1,
        'Hello World',
        [-1, -1],
        [250, 150],
    );

    EVT_KEY_DOWN( $frame, \&on_event ); # doesn't work
    # EVT_LEFT_DOWN( $frame, \&on_event ); # works
    $frame->Show( 1 );
    return 1;
}

sub on_event {
    print "peekaboo\n";
}

package main;

my $app = MyApp->new;
$app->MainLoop;

如果 window 有焦点,这应该有效(这有点重复,但根据定义,键盘事件只发送给焦点 window)。在 Mac 下,如果您不是来自适当 (Mac) 包的 运行 程序,您可能会遇到框架最初没有焦点的问题,但单击它仍然会提供它焦点。如果这仍然不起作用,请尝试创建一个 wxPanel 作为框架的子级并绑定到其上的事件。