键盘输入不适用于WebAssembly和Emscripten

时间:2019-05-02 14:34:26

标签: c++ emscripten wasm

我有一些基本的代码可以渲染到webgl canvas元素。当我调用事件注册方法时,我要么根本无法获得回调(当我如下指定画布名称或#canvas时,或者当我指定#document或#window与无法注册空对象有关时,chrome中出现错误)

emscripten_set_keydown_callback("#canvas", nullptr, true, Platform::keyCallback);
emscripten_set_keyup_callback("#canvas", nullptr, true, Platform::keyCallback);

我在html中的Canvas元素是

<canvas id="canvas" oncontextmenu="event.preventDefault()" width="640px" height="480px"></canvas>

我输入的测试方法是..

EM_BOOL Platform::keyCallback(int eventType, const EmscriptenKeyboardEvent *keyEvent, void *userData)
{
    printf("TEST\n");
}

注意:printf确实可以正常工作,因为我还有其他输出到控制台。

预先感谢您的帮助

2 个答案:

答案 0 :(得分:0)

原来问题出在HTML文件中。我需要在画布上添加“ tabindex = -1”。例如:

<canvas id="canvas" oncontextmenu="event.preventDefault()" width="640px" height="480px" tabindex=-1></canvas>

由于此更改,代码现在似乎可以正常工作。

答案 1 :(得分:0)

仅添加一个答案,因为我发现'tabindex = -1'还不够,需要使canvas对象聚焦。

我通过添加类似于以下内容的代码实现了这一点:

addOnPostRun(function()
{
     var canvas = document.getElementById('my_canvas');
     if (canvas)
         canvas.focus();
});

使用emcc构建时,在'--post-js ./your_postfix_file.js'中指定的后缀代码。