【问题标题】:Problems with security and privacy with JNativeHook Mac OS XJNativeHook Mac OS X 的安全和隐私问题
【发布时间】:2014-05-05 07:21:04
【问题描述】:

您好,我正在使用 JNativeHook 向在屏幕右上角显示通知类型 jframe 的应用程序添加全局快捷方式。目前我的代码在 Eclipse 中运行时,程序运行良好。但是,在导出到可运行的 jar 文件后,应用程序崩溃了。经过几次谷歌搜索后,我发现我需要将 Jar Launcher 添加到偏好设置中安全窗格的辅助功能部分。

但是现在我遇到了一个新问题。我的程序运行但不接受我的全局快捷方式(按下时没有任何反应)。是不是我做错了什么?

这是我用来添加 JNativeHook 和键绑定的代码。

主文件:

    GlobalScreen.getInstance().addNativeKeyListener(new KeyManager());

密钥管理器:

    private String periodName = new String();


@Override
public void nativeKeyPressed(NativeKeyEvent arg0) {
    // TODO Auto-generated method stub







    if (arg0.getKeyCode() == NativeKeyEvent.VK_5 && NativeInputEvent.getModifiersText(arg0.getModifiers()).equals(
            "Ctrl")) {
        Calendar setup = Calendar.getInstance();
        GregorianCalendar cal = new GregorianCalendar(setup.get(Calendar.MONTH), setup.get(Calendar.DAY_OF_MONTH), setup.get(Calendar.HOUR_OF_DAY), setup.get(Calendar.MINUTE), 0);
        GregorianCalendar[] timesM = {new GregorianCalendar(setup.get(Calendar.MONTH), setup.get(Calendar.DAY_OF_MONTH), 9, 40, 0), new GregorianCalendar(setup.get(Calendar.MONTH), setup.get(Calendar.DAY_OF_MONTH),10, 30, 0), new GregorianCalendar(setup.get(Calendar.MONTH), setup.get(Calendar.DAY_OF_MONTH), 11, 55, 0), new GregorianCalendar(setup.get(Calendar.MONTH), setup.get(Calendar.DAY_OF_MONTH), 11, 20, 0), new GregorianCalendar(setup.get(Calendar.MONTH), setup.get(Calendar.DAY_OF_MONTH), 12, 15, 0), new GregorianCalendar(setup.get(Calendar.MONTH), setup.get(Calendar.DAY_OF_MONTH), 13, 15, 0), new GregorianCalendar(setup.get(Calendar.MONTH), setup.get(Calendar.DAY_OF_MONTH), 14, 10, 0), new GregorianCalendar(setup.get(Calendar.MONTH), setup.get(Calendar.DAY_OF_MONTH), 15, 05, 0), null};
        GregorianCalendar[] timesT = {new GregorianCalendar(setup.get(Calendar.MONTH), setup.get(Calendar.DAY_OF_MONTH), 9, 30, 0), new GregorianCalendar(setup.get(Calendar.MONTH), setup.get(Calendar.DAY_OF_MONTH), 10, 20, 0), new GregorianCalendar(setup.get(Calendar.MONTH), setup.get(Calendar.DAY_OF_MONTH), 10, 35, 0), new GregorianCalendar(setup.get(Calendar.MONTH), setup.get(Calendar.DAY_OF_MONTH), 11, 00, 0), new GregorianCalendar(setup.get(Calendar.MONTH), setup.get(Calendar.DAY_OF_MONTH), 11, 50, 0), new GregorianCalendar(setup.get(Calendar.MONTH), setup.get(Calendar.DAY_OF_MONTH), 12, 40, 0), new GregorianCalendar(setup.get(Calendar.MONTH), setup.get(Calendar.DAY_OF_MONTH), 14, 15, 0), new GregorianCalendar(setup.get(Calendar.MONTH), setup.get(Calendar.DAY_OF_MONTH), 15, 05, 0), null};
        GregorianCalendar[] timesW = {new GregorianCalendar(setup.get(Calendar.MONTH), setup.get(Calendar.DAY_OF_MONTH), 9, 30, 0), new GregorianCalendar(setup.get(Calendar.MONTH), setup.get(Calendar.DAY_OF_MONTH), 10, 20, 0), new GregorianCalendar(setup.get(Calendar.MONTH), setup.get(Calendar.DAY_OF_MONTH), 10, 35, 0), new GregorianCalendar(setup.get(Calendar.MONTH), setup.get(Calendar.DAY_OF_MONTH), 11, 00, 0), new GregorianCalendar(setup.get(Calendar.MONTH), setup.get(Calendar.DAY_OF_MONTH), 11, 50, 0), new GregorianCalendar(setup.get(Calendar.MONTH), setup.get(Calendar.DAY_OF_MONTH), 12, 40, 0), new GregorianCalendar(setup.get(Calendar.MONTH), setup.get(Calendar.DAY_OF_MONTH), 14, 15, 0), new GregorianCalendar(setup.get(Calendar.MONTH), setup.get(Calendar.DAY_OF_MONTH), 15, 05, 0), null};
        GregorianCalendar[] timesTh = {new GregorianCalendar(setup.get(Calendar.MONTH), setup.get(Calendar.DAY_OF_MONTH), 9, 30, 0), new GregorianCalendar(setup.get(Calendar.MONTH), setup.get(Calendar.DAY_OF_MONTH), 10, 20, 0), new GregorianCalendar(setup.get(Calendar.MONTH), setup.get(Calendar.DAY_OF_MONTH), 10, 35, 0), new GregorianCalendar(setup.get(Calendar.MONTH), setup.get(Calendar.DAY_OF_MONTH), 11, 00, 0), new GregorianCalendar(setup.get(Calendar.MONTH), setup.get(Calendar.DAY_OF_MONTH), 11, 50, 0), new GregorianCalendar(setup.get(Calendar.MONTH), setup.get(Calendar.DAY_OF_MONTH), 12, 40, 0), new GregorianCalendar(setup.get(Calendar.MONTH), setup.get(Calendar.DAY_OF_MONTH), 14, 15, 0), new GregorianCalendar(setup.get(Calendar.MONTH), setup.get(Calendar.DAY_OF_MONTH), 15, 05, 0), null};
        GregorianCalendar[] timesF = {new GregorianCalendar(setup.get(Calendar.MONTH), setup.get(Calendar.DAY_OF_MONTH), 9, 35, 0), new GregorianCalendar(setup.get(Calendar.MONTH), setup.get(Calendar.DAY_OF_MONTH), 10, 30, 0), new GregorianCalendar(setup.get(Calendar.MONTH), setup.get(Calendar.DAY_OF_MONTH), 11, 50, 0), new GregorianCalendar(setup.get(Calendar.MONTH), setup.get(Calendar.DAY_OF_MONTH), 11, 15, 0), new GregorianCalendar(setup.get(Calendar.MONTH), setup.get(Calendar.DAY_OF_MONTH), 12, 30, 0), new GregorianCalendar(setup.get(Calendar.MONTH), setup.get(Calendar.DAY_OF_MONTH), 13, 25, 0), new GregorianCalendar(setup.get(Calendar.MONTH), setup.get(Calendar.DAY_OF_MONTH), 14, 15, 0), new GregorianCalendar(setup.get(Calendar.MONTH), setup.get(Calendar.DAY_OF_MONTH), 15, 05, 0), null};
        System.out.println("Hour of day" + setup.get(Calendar.HOUR_OF_DAY));
        GregorianCalendar[] a = null;


        System.out.println("Pressed");
        Calendar currentDay = Calendar.getInstance();
        System.out.println(currentDay.get(Calendar.DAY_OF_WEEK));
        Boolean wasFound = false;
        switch (currentDay.get(Calendar.DAY_OF_WEEK)) {
            case Calendar.MONDAY:
                a = timesM;
                a[8] = cal;
                System.out.println("Monday");
                System.out.println(a.length);
                for (int i = 0; i < a.length - 1; i++) {
                    System.out.println(cal.before(a[i]));

                    if (cal.before(a[i])) {
                        periodName = lincoln.getCurrentPeriod(0, i++);
                        System.out.println(periodName);

                        wasFound = true;
                        break;

                    }
                }
                break;
            case Calendar.TUESDAY:
                a = timesT;
                a[8] = cal;
                for (int i = 0; i < a.length - 1; i++) {
                    if (cal.before(a[i])) {
                        periodName = lincoln.getCurrentPeriod(0, i++);
                        System.out.println(periodName);

                        wasFound = true;
                        break;

                    }
                }
                break;
            case Calendar.WEDNESDAY:
                a = timesW;
                a[8] = cal;
                for (int i = 0; i < a.length - 1; i++) {
                    if (cal.before(a[i])) {
                        periodName = lincoln.getCurrentPeriod(0, i++);
                        System.out.println(periodName);

                        wasFound = true;
                        break;

                    }
                }
                break;
            case Calendar.THURSDAY:
                a = timesTh;
                a[8] = cal;
                for (int i = 0; i < a.length - 1; i++) {
                    if (cal.before(a[i])) {
                        periodName = lincoln.getCurrentPeriod(0, i++);
                        System.out.println(periodName);

                        wasFound = true;
                        break;

                    }
                }
                break;
            case Calendar.FRIDAY:
                a = timesF;
                a[8] = cal;
                for (int i = 0; i < a.length - 1; i++) {
                    if (cal.before(a[i])) {
                        periodName = lincoln.getCurrentPeriod(0, i++);
                        System.out.println(periodName);

                        wasFound = true;
                        break;

                    }
                }

                break;
            default:
                System.out.println("Weekends");
                periodName = "Weekends";

                break;







        }
        if (!wasFound || periodName == "Weekends") {

            Alert alert = new Alert("School is not currently on.", "Please check during a valid time.");
        }
        else {
            Alert alert = new Alert(periodName, "Yet to be added");

        }


    }


}

@Override
public void nativeKeyReleased(NativeKeyEvent arg0) {
    // TODO Auto-generated method stub

}

@Override
public void nativeKeyTyped(NativeKeyEvent arg0) {
    // TODO Auto-generated method stub

}

最后提醒:

    JOptionPane.showMessageDialog(null, "Works!");
        final Timer timer = new Timer(10000, this);
        frame = new JFrame();
        frame.setBounds(100, 100, 250, 100);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    JLabel label = new JLabel(Title);
    frame.getContentPane().add(label, BorderLayout.NORTH);

    JLabel lblNewLabel = new JLabel(information);
    frame.getContentPane().add(lblNewLabel, BorderLayout.CENTER);

    JButton btnDismiss = new JButton("Dismiss");
    btnDismiss.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            frame.setVisible(false);
            timer.stop();
        }
    });
    frame.getContentPane().add(btnDismiss, BorderLayout.SOUTH);
    GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();

    frame.setLocation( (int) (ge.getMaximumWindowBounds().getWidth() -     frame.getWidth()), 25);

    frame.setUndecorated(true);
    frame.setVisible(true);

    timer.start();

【问题讨论】:

    标签: java eclipse macos


    【解决方案1】:

    您正在以新的有趣方式滥用事件修饰符;)尝试以下操作:

    if (arg0.getKeyCode() == NativeKeyEvent.VK_5 && arg0.getModifiers() & NativeInputEvent.CTRL_MASK) {
    

    如果您将 JNativeHook 与 Swing/AWT 一起使用,请阅读working with swing wiki 部分了解如何正确交互。

    解决可访问性问题;在 OS X

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-29
      • 2021-08-12
      • 1970-01-01
      相关资源
      最近更新 更多