在JFrame后面select一个窗口

好吧,给你一些背景知识,当用户在键盘上键入一个按键时,我已经操作了一个JFrame,它是一个全屏透明覆盖层。

目标是我希望用户select任何以前打开的窗口(所以可能是现在使用的Web浏览器),然后进一步操作我的程序。 我有覆盖工作与JIntellitype和Swing的漂亮的扩展状态方法pipe理全局按键全屏幕… ness。

我遇到的问题是,即使看起来像我想要的那样,看起来非常漂亮的覆盖层,因为JFrame已经覆盖了它们,所以无法select任何窗口。 我需要它像ScreenCloud的截图select一样(在他们的video中查看0:19),但用户只需在覆盖/消息出现时单击一个窗口即可。

我正在研究JNA获取窗口大小和其他信息,以便以后在我的应用程序中使用。 我对如何解决这个问题有任何想法。 最糟糕的情况是我会做一些你在CTRL-ALT-TAB窗口切换器上看到的select窗口。

注意 :如果它有帮助,我使用TrayIcon作为我的应用程序的中心,然后调用并创buildJFrames等。

Solutions Collecting From Web of "在JFrame后面select一个窗口"

对于未来,如果有人(我怀疑有人)遇到这个问题,让JNA抓住每个窗口的矩形和它们分层的顺序(例如“文件管理器” – (0,0)(250,250) ,“Eclipse” – (0,0)(1920,1080) – 这就是说窗口“文件管理器”在最上面)。 然后让JFrame在其框架上监听鼠标点击事件; 使用这些坐标来查找您使用JNA生成的矩形的任何碰撞。 那些想要它的代码示例(JNA方面):

public static List<WindowInfo> getWindows() { final List<WindowInfo> inflList = new ArrayList<WindowInfo>(); final List<Integer> order = new ArrayList<Integer>(); int top = User32.instance.GetTopWindow(0); while (top!=0) { order.add(top); top = User32.instance.GetWindow(top, User32.GW_HWNDNEXT); } User32.instance.EnumWindows(new WndEnumProc() { @Override public boolean callback(int hWnd, int lParam) { if (User32.instance.IsWindowVisible(hWnd)) { RECT r = new RECT(); User32.instance.GetWindowRect(hWnd, r); if (r.left>-32000) { // minimized byte[] buffer = new byte[1024]; User32.instance.GetWindowTextA(hWnd, buffer, buffer.length); String title = Native.toString(buffer); inflList.add(new WindowInfo(hWnd, r, title)); } } return true; } }, 0); Collections.sort(inflList, new Comparator<WindowInfo>() { @Override public int compare(WindowInfo o1, WindowInfo o2) { return order.indexOf(o1.hwnd)-order.indexOf(o2.hwnd); } }); return inflList; } public static interface WndEnumProc extends StdCallLibrary.StdCallCallback { boolean callback (int hWnd, int lParam); } public static interface User32 extends StdCallLibrary { final User32 instance = (User32) Native.loadLibrary ("user32", User32.class); User32 INSTANCE = (User32) Native.loadLibrary("user32", User32.class, W32APIOptions.DEFAULT_OPTIONS); boolean EnumWindows (WndEnumProc wndenumproc, int lParam); boolean IsWindowVisible(int hWnd); int GetWindowRect(int hWnd, RECT r); void GetWindowTextA(int hWnd, byte[] buffer, int buflen); int GetTopWindow(int hWnd); int GetWindow(int hWnd, int flag); HWND FindWindow(String lpClassName, String lpWindowName); final int GW_HWNDNEXT = 2; } 

请注意,因为这是Windows(如User32类所示)。 WindowInfo类包含每个窗口的矩形,标题和句柄。 然后这被抛回到Mouselistner。

编辑 :在这里找到它https://stackoverflow.com/a/3238193/3502776