اختصار لوحة المفاتيح على مستوى النظام Java [مغلق

StackOverflow https://stackoverflow.com/questions/458756

سؤال

هل هناك أي طريقة للحصول على اختصار لوحة المفاتيح (العالمية) على مستوى النظام لإجراء إجراء في تطبيق Java؟

أي روابط AWT/SWAND؟

هل كانت مفيدة؟

المحلول

ليس هناك ، ولكن في Windows يمكنك استخدام هذا:

Jintellitype

لسوء الحظ ، لا يوجد شيء أعرفه لـ Linux و OSX ، وربما هذا هو السبب في أنه لا يأتي مع Java خارج الصندوق.

إذا وجدت للمنصات الأخرى نشرها هنا من فضلك :)

فقط من أجل couriosity ، ماذا تفعل بهذا؟

نصائح أخرى

أنا مؤلف كتاب JintellityPe وأستطيع أن أخبرك بحقيقة أنه يجب القيام بذلك أصلاً في DLL ودعا من Java Jni تمامًا مثل Jintellitype. هذا هو خطاف مستوى نظام التشغيل الذي لم يتم تنفيذه في JDK ، لذلك يجب استخدام مكتبات مثل JintellityPe و JxGrabkey. بقدر ما أعرف أنه لم يكتب أحد واحدة لـ OSX حتى الآن.

jintellitype مفتوح المصدر على Github ، لذلك إذا كنت تريد فكرة عن كيفية عملها ، فقط تحقق من مصدر الشفرة

لقد وجدت https://github.com/kwhat/jnativeHook

يبدو أن منصة متقاطعة.

إليك نموذج رمز الخاص بهم للاستماع إلى مكابس المفاتيح:

import org.jnativehook.GlobalScreen;
import org.jnativehook.NativeHookException;
import org.jnativehook.keyboard.NativeKeyEvent;
import org.jnativehook.keyboard.NativeKeyListener;

public class GlobalKeyListenerExample implements NativeKeyListener {
    public void nativeKeyPressed(NativeKeyEvent e) {
        System.out.println("Key Pressed: " + NativeKeyEvent.getKeyText(e.getKeyCode()));

        if (e.getKeyCode() == NativeKeyEvent.VC_ESCAPE) {
            GlobalScreen.unregisterNativeHook();
        }
    }

    public void nativeKeyReleased(NativeKeyEvent e) {
        System.out.println("Key Released: " + NativeKeyEvent.getKeyText(e.getKeyCode()));
    }

    public void nativeKeyTyped(NativeKeyEvent e) {
        System.out.println("Key Typed: " + e.getKeyText(e.getKeyCode()));
    }

    public static void main(String[] args) {
        try {
            GlobalScreen.registerNativeHook();
        }
        catch (NativeHookException ex) {
            System.err.println("There was a problem registering the native hook.");
            System.err.println(ex.getMessage());

            System.exit(1);
        }

        GlobalScreen.addNativeKeyListener(new GlobalKeyListenerExample());
    }
}

يعتمد التحقق من المعدلات على أقنعة البتات (الأشياء التي يجب أن نعرفها جميعًا ولكن ننسى دائمًا :- P):

    boolean isAltPressed = (e.getModifiers() & NativeKeyEvent.ALT_MASK) != 0;
    boolean isShiftPressed = (e.getModifiers() & NativeKeyEvent.SHIFT_MASK) != 0;

هذا يمكنك دمجه مع رمز المفاتيح:

if (e.getKeyCode() == NativeKeyEvent.VK_2 && isShiftPressed && isAltPressed){...}

هذا مثال معدّل من هنا

يجب عليك أيضًا تعديل سلوك التسجيل الافتراضي وإلا فإنه سيتم إرسال بريد إلكتروني إلى وحدة التحكم:

// Get the logger for "org.jnativehook" and set the level to warning.
Logger logger = Logger.getLogger(GlobalScreen.class.getPackage().getName());
logger.setLevel(Level.WARNING);

// Don't forget to disable the parent handlers.
logger.setUseParentHandlers(false);

مثال الرمز من هنا

تحديث: لا أعرف ما إذا كان يمكنك ربط الأحداث من خارج JVM. أعتقد أن مكون التأرجح/awt يجب أن يكون له التركيز لهذا العمل.

سترغب في ربط قائمة انتظار حدث Java Awt لتكون متأكدًا تمامًا من أنه يمكنك الحصول على مفتاحي عالمي (JVM Wide).

يستخدم

EventQueue ev = Toolkit.getSystemEventQueue();
// MyCustomEventQueue extends EventQueue and processes keyboard events in the dispatch
ev.push(new MyCustomEventQueue());

class MyEventQueue extends EventQueue
{
    protected void dispatchEvent(AWTEvent event)
    {
       // all AWTEvents can be indentified by type, KeyEvent, MouseEvent, etc
       // look for KeyEvents and match against you hotkeys / callbacks
    }
}

أعتقد أنه قد تكون هناك طرق أخرى لإنجاز مكابس رئيسية عالمية مع خرائط العمل. لقد استخدمت بالفعل ما سبق

بالنسبة لنظام التشغيل Windows ، تحتاج إلى خطاف لوحة المفاتيح DLL. يمكنك تهيئة DLL من Java ، مما سيؤدي إلى تسجيل المستمع. ستحصل على ما تحتاجه. تحقق من MSDN للحصول على خطافات DLL ، أو خطافات لوحة المفاتيح. يجب على واحد من هؤلاء إعدادك.

بالنسبة إلى Linux ، أعتقد أن هذا يجب أن يكون أسهل ، لكنني لم أفعل ذلك بنفسي.

http://ubuntuforums.org/showthread.php؟t=864566

النتيجة الأولى لـ Google لـ "Linux Beason for Global Key Presses" (بدون عروض أسعار) تحضر شيئًا أعتقد أنه سيساعدك على الخروج لبيئات X11

قد يكون OSX قادرًا على استخدام حل بالقرب من هذا. ولكن في النهاية ، ربما ستحتاج إلى DLL لكل منصة ، ما لم تتمكن JNA من القيام بذلك دون مشكلة ، ثم يتم القيام بالأسوأ.

يمكن أن يساعد JDIC (تكامل سطح المكتب Java)
https://jdic.dev.java.net/

يبدو أنه لم يتم صيانته قليلاً بالنسبة لي. لست واثق.
إذا كان شخص ما يعرف المزيد ، يرجى الإبلاغ!
أنا أيضًا مهتم جدًا بهذه الميزة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top