java - 阻止 Win+R 打开运行工具

标签 java javafx keyevent

在我的 javafx 程序中有一个弹出窗口,它允许用户按键,然后相应地设置标签。我的问题是组合键是底层操作系统的快捷方式,例如,如果用户按下 Win+R,然后 Run.exe 启动,但我的程序应该只将标签设置为“Win+R”。我的问题是如何阻止按键事件触发操作系统快捷方式。

这是相关代码。

public void showInput() {
        Set codes = new HashSet();

        Stage inputWindow = new Stage();
        GridPane pane = new GridPane();
        Scene scene = new Scene(pane);
        Label label = new Label("Here comes the pressed keys");

        scene.setOnKeyPressed(e -> {
            e.consume();
            int code = e.getCode().ordinal();

            if (label.getText().equals("Here comes the pressed keys")){
                codes.add(code);
                label.setText(String.valueOf(e.getCode().getName()));

            } else if (!codes.contains(code)){
                codes.add(code);
                label.setText(label.getText() + "+" + e.getCode().getName());
            }
        });

        scene.setOnKeyReleased(e -> {
            e.consume();
            inputWindow.close();
        });

        pane.add(label, 0, 0);

        inputWindow.setScene(scene);
        inputWindow.show();
    }

我尝试了 e.consume() 但它没有帮助。

最佳答案

JNA 是可能的,但这是一个坏主意。不要拦截众所周知的组合键。

尽管如此,下面是一个工作示例。它主要使用 SetWindowsHookEx Win32 API,然后在 Hook 回调中阻止 Win+R 组合键。

import com.sun.jna.platform.win32.*;

public class Test {

    public static User32.HHOOK hHook;
    public static User32.LowLevelKeyboardProc lpfn;

    public static void main(String[] args) throws Exception {
        WinDef.HMODULE hMod = Kernel32.INSTANCE.GetModuleHandle(null);
        lpfn = new User32.LowLevelKeyboardProc() {
            boolean winKey = false;
            public WinDef.LRESULT callback(int nCode, WinDef.WPARAM wParam, WinUser.KBDLLHOOKSTRUCT lParam) {
                if (lParam.vkCode == 0x5B)
                    winKey = (lParam.flags & 0x80) == 0;
                if (lParam.flags == 0 && lParam.vkCode == 0x52 && winKey) {
                    System.out.println("Win-R pressed");
                    return new WinDef.LRESULT(-1);
                }
                return User32.INSTANCE.CallNextHookEx(hHook, nCode, wParam, lParam.getPointer());
            }
        };
        hHook = User32.INSTANCE.SetWindowsHookEx(User32.WH_KEYBOARD_LL, lpfn, hMod, 0);
        if (hHook == null) {
            System.out.println("Unable to set hook");
            return;
        }
        User32.MSG msg = new User32.MSG();
        while (User32.INSTANCE.GetMessage(msg, null, 0, 0) != 0) {
        }
        if (User32.INSTANCE.UnhookWindowsHookEx(hHook))
            System.out.println("Unhooked");
    }
}

(所需的 JNA JAR 依赖项是 net.java.dev.jna : platform )

关于java - 阻止 Win+R 打开运行工具,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45133017/

相关文章:

java - 为什么此 CompletionStage 代码会导致编译错误?

java - 如何迭代 MultiKeyMap?

JavaFX BarChart,按系列名称设置系列颜色

当我将 font aweasome 添加到我的 fxml 文件时出现 java.lang.NoClassDefFoundError

java - 如何使这些按钮在按下按键时起作用?

java - 静态与新对象

java - Mysql 查询在 java 中返回未知列。使用intellij

JavaFx 我的 css 文件无法正常工作

javascript - android上的keyCode总是229

java - 为什么我的按键事件不起作用?