2009-03-30 2 views
4

Я пытаюсь создать автозагрузчик в Java (только язык, который я знаю, и я только что изучил темы). Я хочу, чтобы апплет открывался в собственном окне (а не на веб-странице), и я хочу иметь возможность запускать и останавливать программу с помощью пробела без выбранного окна, чтобы я мог использовать автоклиент в другой программе и быть в состоянии остановить его без alt-f4ing кучу вещей.Java Keylistener без открытия окна?

Есть ли что-нибудь, что вы можете мне отсылать, чтобы помочь мне вместе с этим? Или у вас есть предложения?

ответ

2

Это может быть вне сферы применения апплета Java. Фактически, глобальные перехватчики клавиатуры, безусловно, выходят за рамки простого использования Java, но я могу помочь вам двигаться в правильном направлении.

Однако у вас есть надежда. Я укажу вам в сторону JNI (Java Native Interface), что позволит вам использовать собственные библиотеки. Теперь, поскольку вы хотите остаться в мире Java, я предлагаю не напрямую использовать JNI, потому что вам придется написать какой-то запутанный собственный код (обычно C, C++). Для JNI существует несколько оболочек, которые позволяют вам использовать функции, но собственные реализации абстрагируются, но многие из них стоят денег.


Так что лучшим решением для вас, я думаю, JNA (Java Native Access). Это позволяет вам напрямую обращаться к родным библиотекам из Java. (ПРИМЕЧАНИЕ. Реализация не будет кросс-платформой. Вы должны сделать отдельные реализации для Windows, Linux и т. Д.). В примерах на веб-сайте проекта есть хороший пример для клавиатурных клавиш Windows.

Что касается открытия собственного окна не на веб-странице, вы хотите, чтобы апплет не запускался в браузере, а в отдельном отдельном процессе или просто находился в отдельном окне и все еще полагался на открытое окно браузера?

  • Если вы хотите, чтобы просто запустить новое окно и по-прежнему требуется браузер, чтобы быть открытым, то вот хороший пример:

    final Frame window = new Frame("This is the Frame's Title Bar!"); 
    window.add(new Label("This is the Frame.")); 
    window.setSize(300,200); 
    window.setVisible(true); 
    
    window.addWindowListener(new WindowAdapter(){ 
        public void windowClosing(WindowEvent we){ 
         window.dispose(); 
        } 
    }); 
    
  • Если вы хотите апплет, чтобы породить новый процесс и бежать без необходимости браузера, посмотрите на JavaFX.

+0

В своем собственном отдельном окне, вероятно, было бы лучше. – Azreal

6

поздний ответ, но, надеюсь, полезно :)

Вы можете с помощью ЮНА, это прогулкой !!

  1. получить ЮНА (jna.jar)
  2. создать собственное отображение для User32 (User32.dll) в виде

     
    public interface User32 extends StdCallLibrary { 
    User32 INSTANCE = (User32) Native.loadLibrary("User32", User32.class, Options.UNICODE_OPTIONS); 
    
    
    // dwWakeMask Constants 
    public static final int QS_ALLEVENTS = 0x04BF; 
    public static final int QS_ALLINPUT = 0x04FF; 
    public static final int QS_ALLPOSTMESSAGE = 0x0100; 
    public static final int QS_HOTKEY = 0x0080; 
    public static final int QS_INPUT = 0x407; 
    public static final int QS_KEY = 0x0001; 
    public static final int QS_MOUSE = 0x0006; 
    public static final int QS_MOUSEBUTTON = 0x0004; 
    public static final int QS_MOUSEMOVE = 0x0002; 
    public static final int QS_PAINT = 0x0020; 
    public static final int QS_POSTMESSAGE = 0x0008; 
    public static final int QS_RAWINPUT = 0x0400; 
    public static final int QS_SENDMESSAGE = 0x0040; 
    public static final int QS_TIMER = 0x0010; 
    
    
    public static final int INFINITE = 0xFFFFFFFF; 
    
    
    /* 
    DWORD WINAPI MsgWaitForMultipleObjects(
    __in DWORD nCount, 
    __in const HANDLE *pHandles, 
    __in BOOL bWaitAll, 
    __in DWORD dwMilliseconds, 
    __in DWORD dwWakeMask 
    );*/ 
    
    
    int MsgWaitForMultipleObjects(int nCount, Pointer pHandles, boolean bWaitAll, int dwMilliSeconds, int dwWakeMask); 
    
    
    /* fsModifiers vaues */ 
    public static final int MOD_ALT = 0x0001; 
    public static final int MOD_CONTROL = 0x0002; 
    public static final int MOD_NOREPEAT = 0x4000; 
    public static final int MOD_SHIFT = 0x0004; 
    public static final int MOD_WIN = 0x0008; 
    
    
    /* BOOL WINAPI RegisterHotKey(
    __in_opt HWND hWnd, 
    __in  int id, 
    __in  UINT fsModifiers, 
    __in  UINT vk 
    ); 
    */ 
    boolean RegisterHotKey(Pointer hWnd, int id, int fsModifiers, int vk); 
    } 
    
  3. Просто проверьте следующие страницы, чтобы получить четкое представление о том, как работают вещи под капотом:

ч ** р: //msdn.microsoft.com/en-us/library/ms646309%28VS.85%29.aspx

h ** p: //msdn.microsoft.com/en-us/library/ms684242%28VS.85%29.ASPX

  1. Проверить эту страницу, чтобы увидеть, какие ключевые константы, которые вы можете зарегистрировать функцию обратного вызова для

ч ** р: //msdn.microsoft.com/en-us/library/dd375731% 28В = VS.85% 29.aspx

  1. Создайте тестовую программу, как это:
 
User32 user32 = User32.INSTANCE; 
boolean res = user32.RegisterHotKey(Pointer.NULL, 9999, User32.MOD_ALT | User32.MOD_CONTROL, WINUSER.VK_LEFT); 
if(!res) 
    System.out.println("Couldn't register hotkey"); 

System.out.println("Starting and waiting"); 
user32.MsgWaitForMultipleObjects(0, Pointer.NULL, true, User32.INFINITE, User32.QS_HOTKEY); 
System.out.println("Ending"); 

User32.INFINITE недокументированная константа со значением 0xFFFFFFFF

К сожалению о HTTP ссылки переименованы в ч ** р :) Stackoverflow правила Стефано

-2

Я думаю, что вы можете сделать это с помощью метода setVisible(false). Окно будет, но пользователь не сможет его увидеть.

Смежные вопросы