首页 > 系统相关 >关于java:Windows:如何获取所有可见窗口的列表,并将指定窗口置顶

关于java:Windows:如何获取所有可见窗口的列表,并将指定窗口置顶

时间:2023-12-06 09:02:32浏览次数:43  
标签:java title int hWnd User32 new 窗口 public 置顶

import com.sun.jna.Native;
import com.sun.jna.Structure;
import com.sun.jna.win32.StdCallLibrary;
import org.apache.commons.lang3.StringUtils;

import java.util.*;

public class BringToForeground {

    public static void main(String[] args) {
        BringToForeground m = new BringToForeground();
        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() {
            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) {     // If it's not minimized
                        byte[] buffer = new byte[1024];
                        User32.instance.GetWindowTextA(hWnd, buffer, buffer.length);
                        String title = Native.toString(buffer,"GBK");
                        inflList.add(new WindowInfo(hWnd, r, title));
                    }
                }
                return true;
            }
        }, 0);

        Collections.sort(inflList, new Comparator<WindowInfo>() {
            public int compare(WindowInfo o1, WindowInfo o2) {
                return order.indexOf(o1.hwnd) - order.indexOf(o2.hwnd);
            }
        });
        for (WindowInfo w : inflList) {
            System.out.println(w);
            if(StringUtils.equals(w.title,"QtScrcpy")){
                User32.instance.SetForegroundWindow(w.hwnd); // bring to front
            }
        }
    }

    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);
        final int GW_HWNDNEXT = 2;

        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);

        void SetForegroundWindow(int hWnd);
    }

    public static class RECT extends Structure {
        public int left, top, right, bottom;

        @Override
        protected List getFieldOrder() {
            return Arrays.asList(new String[]{"left", "top", "right", "bottom"});
        }
    }

    public static class WindowInfo {
        public final int hwnd;
        public final RECT rect;
        public final String title;

        public WindowInfo(int hwnd, RECT rect, String title) {
            this.hwnd = hwnd;
            this.rect = rect;
            this.title = title;
        }

        public String toString() {
            return String.format("(%d,%d)-(%d,%d) : %s",
                    rect.left, rect.top,
                    rect.right, rect.bottom,
                    title);
        }
    }
}

  

标签:java,title,int,hWnd,User32,new,窗口,public,置顶
From: https://www.cnblogs.com/lambertwe/p/17878741.html

相关文章

  • 浏览器跨 Tab 窗口通信原理
    目录浏览器跨Tab窗口通信原理BroadcastChannelSharedWorkerAPIlocalStorage/sessionStorage跨Tab窗口通信应用场景浏览器跨Tab窗口通信原理所谓多窗口下进行互相通信,是指在浏览器中,不同窗口(包括不同标签页、不同浏览器窗口甚至不同浏览器实例)之间进行数据传输和通信的......
  • Java第三课_流程控制
    1.流程控制判断结构:if/*流程控制:程序是怎样运行的1.顺序结构:函数内部:从上向下逐行执行,语句从左向右执行,赋值从右向左2.判断结构:if注意:a.当大括......
  • 2023/12/5日 学习Java数据结构
    今日学习了单链表和一部分的双向链表,还有一个月的时间就要期末考试了,但是我的数据结构还是一点也不会,只能抓紧学了packagecom.ityuhao;importjavax.swing.*;publicclassLinkList{//头节点privateNodehead;//链表长度publicintlength;//创......
  • Java 运算符简介
    Java运算符计算机的最基本用途之一就是执行数学运算,作为一门计算机语言,Java也提供了一套丰富的运算符来操纵变量。我们可以把运算符分成以下几组:算术运算符关系运算符位运算符逻辑运算符赋值运算符其他运算符数据运算数值类型的运算符一般有加号(+),减号(-),乘号(*),除号(/)和求余......
  • JAVA JDK 17--安装及环境配置
      第一步:下载并安装JAVAJDK官网:https://www.oracle.com/java/technologies/downloads/#jdk17-windows我在这里选择的是 windows系统的安装包  JDK17:将JDK放到C盘外无中文与空格下的目录:  (我放在了E盘里) 如下:第一步算是完成了。......
  • Day20 Java流程控制02:scanner进阶使用
    Java流程控制02:scanner进阶使用1.判断是否是整数/小数:packagecom.baixiaofan.scanner;importjava.util.Scanner;publicclassDemo04{publicstaticvoidmain(String[]args){Scannerscanner=newScanner(System.in);inti=0;fl......
  • java_JDBC连接池C3P0的使用
    1、数据库连接池基本介绍1.预先再缓冲池中放入一定数量的连接,当需要建立连接时,只需要从“缓冲池”中取出一个,使用完毕后放回。2.数据库连接池负责分配、管理和释放数据库连接,它允许多个程序重复的使用现有的数据库连接,而不是重新建立一个。3.当应用程序向连接池请求的数量超过最大......
  • java智慧校园源码,SaaS云平台,私有云部署
    什么是电子班牌?电子班牌用来显示班级信息,班级活动信息以及学校的通知信息。信息内容为文字、图片、视频、FLASH等,为学生和老师提供新颖的师生交流及校园服务平台。融合了多媒体信息发布、家校互通、物联控制、教务管理、日常办公等一系列应用,是校园管理的现代手段。学生刷卡考勤数......
  • javascript之如何禁用chrome开发者工具自动网络录制
    在chrome开发人员工具中,每次加载页面时,我都单击“网络”选项卡并看到“记录”按钮处于事件状态/红色。即使我禁用了网络流量记录,当我刷新同一页面或打开另一个网站时,我也会看到Chrome正在“网络”选项卡中记录流量。在开发具有大量流量的大型Web应用程序时——第3方API......
  • 超详细Linux搭建Java开发环境
    硬件JDK1.8.0_121(截止2017-1-26最新)CentOS7(截止目前最新版)下载jdk8http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html选择对应jdk版本下载。获取root权限密码默认是不显示的,只管输入就行了,然后回车获取root权限[seeway@lo......