Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
没有打开窗口的Java Keylistener?_Java_Keylistener - Fatal编程技术网

没有打开窗口的Java Keylistener?

没有打开窗口的Java Keylistener?,java,keylistener,Java,Keylistener,我正在尝试用Java创建一个自动点击器(我只知道一种语言,而且我刚刚学习了线程)。我想让小程序在它自己的窗口中打开(而不是在网页上),并且我想能够在不选择窗口的情况下使用空格键启动和停止程序,这样我就可以在另一个程序上使用自动点击器,并且能够在不使用alt-F4键的情况下停止它 你有什么可以帮我的吗?或者您有什么建议吗?这可能超出Java小程序的范围。事实上,全局键盘挂钩绝对超出了简单使用Java的范围,但我可以帮助您朝着正确的方向前进 然而,你有一些希望。我将为您指出的方向是,它将允许您使用本

我正在尝试用Java创建一个自动点击器(我只知道一种语言,而且我刚刚学习了线程)。我想让小程序在它自己的窗口中打开(而不是在网页上),并且我想能够在不选择窗口的情况下使用空格键启动和停止程序,这样我就可以在另一个程序上使用自动点击器,并且能够在不使用alt-F4键的情况下停止它


你有什么可以帮我的吗?或者您有什么建议吗?

这可能超出Java小程序的范围。事实上,全局键盘挂钩绝对超出了简单使用Java的范围,但我可以帮助您朝着正确的方向前进

然而,你有一些希望。我将为您指出的方向是,它将允许您使用本机库。现在,由于您希望留在Java世界,我建议不要直接使用JNI,因为您必须编写一些令人困惑的本机代码(通常是C、C++)。JNI有几个包装器,允许您使用这些函数,但是本机实现被抽象掉了,但是其中很多都要花钱


因此,我认为,对你来说,最好的解决办法是。这允许您直接从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();
        }
    });
    
  • 如果希望小程序生成新进程并在不需要浏览器的情况下运行,请查看


迟来的回答,但希望有帮助:)

你可以使用JNA,这是一个骗局

  • 获取JNA(JNA.jar)
  • 在表单中为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); } 公共接口User32扩展StdCallLibrary{ User32实例=(User32)Native.loadLibrary(“User32”,User32.class,Options.UNICODE\u Options); //DWW掩码常数 公共静态最终内部事件=0x04BF; 公共静态最终输入QS_ALLINPUT=0x04FF; 公共静态最终int QS_ALLPOSTMESSAGE=0x0100; 公共静态最终int QS_热键=0x0080; 公共静态最终整数QS_输入=0x407; 公共静态最终整数QS_KEY=0x0001; 公共静态最终int QS_鼠标=0x0006; 公共静态最终int QS_鼠标按钮=0x0004; 公共静态最终int QS_MOUSEMOVE=0x0002; 公共静态最终内部QS_油漆=0x0020; 公共静态最终int QS_POSTMESSAGE=0x0008; 公共静态最终整数QS_RAWINPUT=0x0400; 公共静态最终int QS_SENDMESSAGE=0x0040; 公共静态最终int QS_计时器=0x0010; 公共静态final int INFINITE=0xFFFFFFFF; /* DWORD WINAPI MsgWaitForMultipleObjects( __在德沃德·恩科特, __在常量句柄*幻影中, __在布尔布韦特尔, __在德沃德, __在德沃德·德沃克 );*/ int-MsgWaitForMultipleObjects(int-nCount、指针幻影、布尔bWaitAll、int-dwmillizes、int-dwWakeMask); /*修改器vaues*/ 公共静态最终int MOD_ALT=0x0001; 公共静态最终int MOD_CONTROL=0x0002; 公共静态最终int MOD_NOREPEAT=0x4000; 公共静态最终int MOD_SHIFT=0x0004; 公共静态最终整数MOD_WIN=0x0008; /*BOOL-WINAPI寄存器hotkey( __在_opthwnd HWND中, __在int-id中, __在UINT fsModifiers中, __在UINT vk中 ); */ 布尔寄存器hotkey(指针hWnd、int-id、int-fsModifiers、int-vk); }
  • 只需查看以下页面,就可以清楚了解引擎盖下的工作原理:

  • h**p://msdn.microsoft.com/en-us/library/ms646309%28VS.85%29.aspx

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

  • 检查此页面以查看可以注册回调的键常量
  • h**p://msdn.microsoft.com/en-us/library/dd375731%28v=VS.85%29.aspx

  • 创建一个如下所示的测试程序:
  • User32 User32=User32.INSTANCE; boolean res=user32.RegisterHotKey(Pointer.NULL,9999,user32.MOD_ALT | user32.MOD_控件,WINUSER.VK_左); 如果(!res) System.out.println(“无法注册热键”); System.out.println(“启动和等待”); MsgWaitForMultipleObjects(0,Pointer.NULL,true,user32.INFINITE,user32.QS_热键); 系统输出打印项次(“结束”); User32.INFINITE是一个值为0xFFFFFF的未记录常量

    很抱歉将http链接重命名为h**p:)Stackoverflow规则
    Stefano

    我认为您可以使用
    setVisible(false)
    方法来实现这一点。
    窗口将在那里,但用户将无法看到它。

    在它自己的单独窗口中可能是最好的。 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");