簡體   English   中英

按下 alt 時,KeyEventDispatcher 不會捕獲選項卡

[英]KeyEventDispatcher doesn't catch tab when alt is pressed

我開始編寫自定義 KeyAdaptor,以便釋放 alt 鍵會觸發一個事件,突出顯示菜單欄中的第一項,以模擬本地 Windows 程序通常如何工作。 然后我注意到當我 alt-tab 退出並釋放 alt 時,程序會失去焦點並同時突出顯示菜單項,這會導致散焦的程序閃爍通知。

我發現這種行為很煩人,所以我嘗試在按下 Tab 時禁用 alt 釋放事件。 然后我發現因為 tab 是一個焦點遍歷鍵,它被焦點系統消耗了。 所以我閱讀了 KeyEventDispatcher,它預先偵聽關鍵事件,然后切換到它。 現在它確實檢測到 Tab 按下,但不是當 alt 鍵按下時。 為什么會發生這種情況,我該如何解決?

private class KeyController implements KeyEventDispatcher {
    //true == pressed, false == not pressed
    private boolean[] keyStates = new boolean[256];
    private boolean ignoreNextAltRelease = false;

    private void keyReleased(KeyEvent e) {
        if (e.getKeyCode() == KeyEvent.VK_ALT) {
            if (!ignoreNextAltRelease) {
                SwingUtilities.invokeLater(new Runnable() {
                    @Override
                    public void run() {
                        menuBar.getMenu(0).doClick();
                    }
                });
            }
            ignoreNextAltRelease = false;
        }
    }

    private void keyPressed(KeyEvent e) {
        if (e.getKeyCode() == KeyEvent.VK_TAB) {
            if (keyStates[KeyEvent.VK_ALT]) {
                ignoreNextAltRelease = true;
            }
        }
    }

    @Override
    public boolean dispatchKeyEvent(KeyEvent e) {
        if (e.getID() == KeyEvent.KEY_PRESSED) {
            keyStates[e.getKeyCode()] = true;
            keyPressed(e);
        }
        else if (e.getID() == KeyEvent.KEY_RELEASED) {
            keyStates[e.getKeyCode()] = false;
            keyReleased(e);
        }

        return false;
    }

當我按下 alt 然后按 tab 時,keyPressed 方法永遠不會在 tab 上被調用,但是當 tab 被釋放時,keyReleased 方法在 tab 上被調用。 當我同時釋放兩個鍵時,在 alt 和 tab 上都會調用 keyReleased 方法。

在 macOS 下,有com.apple.eawt.AppForegroundListener它會告訴您何時將應用程序移至后台(當用戶按下 CMD + TAB 時會發生這種情況,這反過來對應於 Windows 下的 ALT + TAB)。 當應用程序移動到后台(即另一個應用程序處於活動狀態)或再次移動到前台時,會觸發AppForegroundEvent

我想在 Windows 下會有一個類似的包,它允許跟蹤在操作系統基礎上處理的那些事件。

com.apple.eawt本身似乎自 Java 9 以來不再可用,因此請查看網絡以查看更多最新實現。

如果您打算在應用程序中處理 ALT + TAB 鍵,則應實現appMovedToBackground(AppForegroundEvent e) ,檢測應用程序是否通過 ALT + TAB 或單擊另一個應用程序圖標/窗口(猜測將是最難的部分)。 然后再次將您的應用程序置於前台,並使用 ALT + TAB 鍵事件執行您打算執行的任何操作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM