我正在尝试用Java创建一个自动点击器(只有我知道的语言,我刚刚学习了Threads)。我想让applet在它自己的窗口中打开(不在网页上),我希望能够在没有选择窗口的情况下使用空格键启动和停止程序,这样我就可以在另一个程序上使用自动点击器并且能够在没有alt-f4ing一堆东西的情况下阻止它。
有什么可以推荐给我的,可以帮助我吗?或者您有什么建议吗?
答案 0 :(得分:6)
迟到的答案,但希望有用:)
你可以使用JNA,这是一个小蛋糕!
以
格式为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); }
只需查看以下页面,即可清楚了解工作原理:
ħ**号码://msdn.microsoft.com/en-us/library/ms646309%28VS.85%29.aspx
ħ**号码://msdn.microsoft.com/en-us/library/ms684242%28VS.85%29.aspx
ħ**号码://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_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链接重命名为h ** p :) Stackoverflow规则 斯特凡诺
答案 1 :(得分:2)
这可能超出了Java applet的范围。事实上,全局键盘钩子绝对不能简单地使用Java,但我可以帮助你朝着正确的方向前进。
然而,你有一些希望。我将指向JNI (Java Native Interface)的方向,这将允许您使用本机库。现在,既然你想留在Java世界,我建议不要直接使用JNI,因为你必须编写一些令人困惑的本机代码(通常是C,C ++)。有几个JNI的包装器允许你使用这些函数,但原生实现被抽象掉了,但是其中很多都要花钱。
因此,我认为最好的解决方案是JNA (Java Native Access)。这允许您直接从Java中调用本机库。 (注意:实现不是跨平台的。您必须为Windows,Linux等单独实现。)在项目网站的示例中有一个很好的Windows键盘钩子示例。
至于打开它自己的窗口不在网页中,你是否希望applet不在浏览器中运行,而是在它自己的单独进程中运行,或者只是在一个单独的窗口中,仍然依赖浏览器窗口打开? / p>
如果您只想启动一个新窗口并仍然需要打开浏览器,那么这是一个很好的例子:
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();
}
});
如果您希望applet生成新流程并在不需要浏览器的情况下运行,请查看JavaFX。
答案 2 :(得分:-2)
我认为您可以使用setVisible(false)
方法执行此操作。
窗口将在那里,但用户将无法看到它。