【问题标题】:How do I intercept ALT-META_LEFT getKeyCode();?如何拦截 ALT-META_LEFT getKeyCode();?
【发布时间】:2012-08-02 15:30:47
【问题描述】:

更新: 我误读了参考资料。我无法停止的关键代码是 ALT 和 META_LEFT

我已经更新了这篇文章的标题。我很抱歉。

我有一个使用蓝牙鼠标演示器来控制它的应用程序。我已经拦截了设备上的所有按钮,除了一个。当它被按下时,我会得到一些不在我的应用程序中发生的事情,比如去 Google Play,或者一个弹出窗口询问我想使用什么音乐播放器。我试图拦截它但失败了。即使是不让键码通过的测试代码,只做一个 Toast 也会让这个键码通过。

有问题的键码是 57 和 117,根据this 是 ALT-MENU。

这是可以成功拦截除此之外的任何其他键的代码。例如,我可以为 24 添加一个 case,平板电脑或鼠标演示器上的音量增大键将不再起作用。

@override // tried both with and without the override
public boolean dispatchKeyEvent(KeyEvent ke){
    int keyCode = ke.getKeyCode();
    if(ke.getAction() == KeyEvent.ACTION_DOWN){
        Toast.makeText(this, String.valueOf(keyCode), Toast.LENGTH_SHORT).show();
        switch (keyCode)
        {
            case 117:
            case 57:
            case 44:
            case 59:
                return true;

            case 30:
                Intent target = new Intent(this, StartLine2.class);
                startActivity(target);
                return true;
            case 19:
                new Thread(new Runnable() {         
                    @Override
                    public void run() {                 
                        new Instrumentation().sendKeyDownUpSync(KeyEvent.KEYCODE_TAB);
                    }   
                }).start();
                return true;
            case 20:
                new Thread(new Runnable() {         
                    @Override
                    public void run() {                 
                        new Instrumentation().sendKeyDownUpSync(KeyEvent.KEYCODE_DPAD_CENTER);
                    }   
                }).start();
                return true;
        }
    }
    else if(ke.getAction() == KeyEvent.ACTION_UP){
        switch (keyCode){
            case 117:
            case 57:
            case 30:
            case 44:
            case 59:
            case 19:
            case 20:
                return true;
        }
    }

    return super.dispatchKeyEvent(ke);
}

我期望的是 57 和 117 都没有传递给 dispatchKeyEvent,因此什么也不做。然而,正如我所说,他们启动了一些过程。它曾经是 Google Play,但现在似乎要求我选择一个音乐播放器“使用...完成操作”

理想情况下,我想将该键用于一些有用的事情,但作为后备,只是让错误地点击它而不弄乱我的应用程序将是一个不错的第二选择。

我不知道该怎么做,很想在这个问题上得到一些帮助。

【问题讨论】:

  • @Tim 你能对此发表评论吗?

标签: android keyboard


【解决方案1】:

我用下面的代码拦截

ownET.setOnKeyListener(new OnKeyListener() {
    public boolean onKey(View v, int keyCode, KeyEvent event) {
    if (event.getAction() == KeyEvent.ACTION_DOWN) {

        switch (keyCode) {
        case KeyEvent.KEYCODE_DPAD_CENTER:
        case KeyEvent.KEYCODE_ENTER:
        ...;
        return true;
        default:
        break;
        }
    }
    return false;
    }
});

我希望这可以捕获所有关键事件... 抱歉,我无法尝试自己,因为我无法获得 ALT-MENU...

【讨论】:

  • 我无法运行此代码。我声明了一个 EditText 变量,因为 Eclipse 抱怨没有它,但我真的不知道为什么,因为我没有尝试编辑任何文本。我只是想通过发送一个 TAB 来移动焦点,另一个代码来按下按钮,并使用其他键来启动其他活动来按下按钮。网络是致命的异常,应用程序退出。这段代码看起来与我使用的非常相似,除了 onKey 和 getKeyCode。我想尝试不同的方法,但需要一些帮助才能使其运行。
  • 你从哪里得到你的关键事件?它是您应用程序中的一个简单按钮吗?顺便说一句,您是对的,此代码附加到 EditText 上,因为我假设您想从那里捕获关键事件。但是在屏幕上有一个简单的 EditText 字段就可以了……
  • 我的按键事件来自蓝牙鼠标演示器。我列出的 jave 代码将显示 Toast 中的关键代码。这些代码含义的翻译在我帖子中“根据此”下的链接中给出(单击“此”)。我已经使用来自演示者的已知代码检查了这些代码,例如音量增大,即 24。蓝牙设备的按下被应用程序拦截,并且从我的代码中可以看到各种事情发生。我现在只有三个键,第四个是我无法控制的,因为它会导致平板电脑离开我的应用
  • 哦,我明白了,虽然我不了解 BT 鼠标演示器,但我会假设 ALT 不会更改键代码,在许多系统中,ALT 被检查为每个键的状态修饰符.因此,我希望您甚至需要完全按下 ALT,而与按下哪个其他键无关。从这个意义上说,ALT 与 Shift 非常不同。我希望 Ctrl 也是如此。
  • 我确信如果我可以阻止 META_LEFT (getKeyCode() = 117) 我会很高兴。问题是我该怎么做?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-08-04
  • 1970-01-01
  • 1970-01-01
  • 2020-08-24
  • 1970-01-01
  • 2019-03-21
  • 1970-01-01
相关资源
最近更新 更多