获取 window任务栏已经打开应用程序窗口(也就是任务管理器中前台进程)的图标

获取 window任务栏已经打开应用程序窗口(也就是任务管理器中前台进程)的图标

1.功能描述

获取到window任务栏已经打开的应用程序的窗口图标。如下:(要获取到QQ,浏览器,文件夹的图标,但是任务栏中隐藏的图标不显示)

2.使用技术及工具

JAVA,JNA,eclipse。

需要去下载JNA的包(一个是jna.jar,一个时jna-platform.jar);包的下载在文章结尾提供地址。

3.实现思路

(1).一个window任务栏打开的应用程序也就是一个前台进程,所以先通过JNA获取所有任务栏进程(.exe文件名称,文件路径,PID)(从.EXE文件中可以获得图片),这时获得进程还包括一些非窗口(非前台应用)进程,需要使用第二步骤过滤掉。
(2).从JNA中枚举出所有的窗口句柄,并且通过窗口句柄获得PID。
(3).遍历第一步骤获得的进程获得元素的PID,当元素的PID在第二步骤获得的集合中时,则从此元素的.exe文件中获得图片。

4.实现代码

(1)获取窗口的句柄进程PID

 1 public class EnumWindow {
 2     public static Set<Integer> getTaskPID() {
 3         User32 user32 = User32.INSTANCE;
 4         Set<Integer> set=new HashSet<Integer>();
 5         IntByReference i=new IntByReference();//放PID
 6         user32.EnumWindows(new User32.WNDENUMPROC() {
 7             public boolean callback(HWND h, Pointer p) {
 8                 user32.GetWindowThreadProcessId(h, i);获取窗口的PID
 9                 if(user32.IsWindow(h)&&user32.IsWindowEnabled(h)&&user32.IsWindowVisible(h)){
10                     set.add(i.getValue());
11                 }
12                 return true;
13             }
14         }, null);
15         return set;//获得到的窗口PID集合
16     }
17 }

(2)获取进程图片

 1 public class Maintest {
 2
 3     public interface ProcessPathKernel32 extends Kernel32 {
 4         class MODULEENTRY32 extends Structure {
 5             public static class ByReference extends MODULEENTRY32 implements Structure.ByReference {
 6                 public ByReference() {}
 7                 public ByReference(Pointer memory) {
 8                     super(memory);
 9                 }
10             }
11             public MODULEENTRY32() {
12                 dwSize = new WinDef.DWORD(size());
13             }
14
15             public MODULEENTRY32(Pointer memory) {
16                 super(memory);
17                 read();
18             }
19
20             public DWORD dwSize;
21             public DWORD th32ModuleID;
22             public DWORD th32ProcessID;
23             public DWORD GlblcntUsage;
24             public DWORD ProccntUsage;
25             public Pointer modBaseAddr;
26             public DWORD modBaseSize;
27             public HMODULE hModule;
28             public char[] szModule = new char[255+1]; // MAX_MODULE_NAME32
29             public char[] szExePath = new char[MAX_PATH];
30             public String szModule() { return Native.toString(this.szModule); }
31             public String szExePath() { return Native.toString(this.szExePath); }
32             @Override
33             protected List<String> getFieldOrder() {
34                 return Arrays.asList(new String[] {
35                         "dwSize", "th32ModuleID", "th32ProcessID", "GlblcntUsage", "ProccntUsage", "modBaseAddr", "modBaseSize", "hModule", "szModule", "szExePath"
36                 });
37             }
38         }
39
40         ProcessPathKernel32 INSTANCE = (ProcessPathKernel32)Native.loadLibrary(ProcessPathKernel32.class, W32APIOptions.UNICODE_OPTIONS);
41         boolean Module32First(HANDLE hSnapshot, MODULEENTRY32.ByReference lpme);
42         boolean Module32Next(HANDLE hSnapshot, MODULEENTRY32.ByReference lpme);
43     }
44
45     public static void main(String[] args) throws IOException {
46
47         HICON[] a=new WinDef.HICON[12];
48         HICON[] b=new WinDef.HICON[11];
49         Set<Integer> Pids=EnumWindow.getTaskPID();//获取窗口进程的PID
50         int c=1;
51         Kernel32 kernel32 = (Kernel32) Native.loadLibrary(Kernel32.class, W32APIOptions.DEFAULT_OPTIONS);
52         Tlhelp32.PROCESSENTRY32.ByReference processEntry = new Tlhelp32.PROCESSENTRY32.ByReference();
53         WinNT.HANDLE processSnapshot =
54                 kernel32.CreateToolhelp32Snapshot(Tlhelp32.TH32CS_SNAPPROCESS, new WinDef.DWORD(0));
55         try {
56             while (kernel32.Process32Next(processSnapshot, processEntry)) {
57                 //processEntry.th32ProcessID  程序的PID
58                 //Native.toString(processEntry.szExeFile) 程序的名字(xx.exe)
59                 WinNT.HANDLE moduleSnapshot =kernel32.CreateToolhelp32Snapshot(Tlhelp32.TH32CS_SNAPMODULE, processEntry.th32ProcessID);
60                 if(Pids.contains(processEntry.th32ProcessID.intValue())){
61                     String exeName=Native.toString(processEntry.szExeFile).substring(0,Native.toString(processEntry.szExeFile).indexOf(".exe"));
62                     if(exeName.toLowerCase().equals("shellexperiencehost")||exeName.toLowerCase().equals("syntpenh")){//ShellExperienceHost为开始菜单外壳,syntpenh为触摸板相关程序
63                         continue;
64                     }
65                     try {
66                         ProcessPathKernel32.MODULEENTRY32.ByReference me = new ProcessPathKernel32.MODULEENTRY32.ByReference();
67                         ProcessPathKernel32.INSTANCE.Module32First(moduleSnapshot, me);
68                         //me.szExePath() //程序(xx.exe)所在路径
69                         Shell32.INSTANCE.ExtractIconEx(me.szExePath(), 0, a, b, c);
70                         if(a.length>0&&Native.toString(processEntry.szExeFile)!=null&&Native.toString(processEntry.szExeFile).length()>0&&Native.toString(processEntry.szExeFile).indexOf(".exe")>=0){//判断是否有图标
71                             String fileName=Native.toString(processEntry.szExeFile).substring(0,Native.toString(processEntry.szExeFile).indexOf(".exe"))+".jpg";
72                             if (me.szExePath()!=null&&me.szExePath()!="") {
73                                 File file=new File(me.szExePath());//.exe文件
74                                 File imgFile=new File("C:\\windowTaskBarIcon\\"+fileName);
75                                 if (!imgFile.exists()) {
76                                     imgFile.mkdirs();
77                                 }
78                                 Image image=((ImageIcon) FileSystemView.getFileSystemView().getSystemIcon(file)).getImage();
79                                 ImageIO.write((RenderedImage) image,"jpg", imgFile);
80                             }
81                         }
82                     }
83                     finally {
84                         kernel32.CloseHandle(moduleSnapshot);
85                     }
86                 }
87             }
88         }
89         finally {
90             kernel32.CloseHandle(processSnapshot);
91         }
92     }
93
94 }

5.效果图

会把获得的图片保存到指定的文件夹下面。

6.工程完整代码放在github上

地址:https://github.com/xujinghuan/getWindowTaskIcon

 

时间: 2024-10-10 15:14:58

获取 window任务栏已经打开应用程序窗口(也就是任务管理器中前台进程)的图标的相关文章

python 通过js控制滚动条拉取全文 通过psutil获取pid窗口句柄,通过win32gui使程序窗口前置 通过pyauto实现右键菜单和另存为操作

1.参考 利用 Python + Selenium 自动化快速截图 利用 Python + Selenium 实现对页面的指定元素截图(可截长图元素) 使用python获取系统所有进程PID以及进程名称 python锁定焦点到指定进程窗口的参考方法 2.改进js代码,下拉和上拉,精确判断加载是否结束 #!/usr/bin/env python# -*- coding: UTF-8 -*import time from selenium import webdriverfrom selenium.

Android应用程序窗口设计框架介绍

在Android系统中,一个Activity对应一个应用程序窗口,任何一个Activity的启动都是由AMS服务和应用程序进程相互配合来完成的.AMS服务统一调度系统中所有进程的Activity启动,而每个Activity的启动过程则由其所属进程来完成.AMS服务通过realStartActivityLocked函数来通知应用程序进程启动某个Activity: frameworks\base\services\java\com\android\server\am\ ActivityStack.j

Android应用程序窗口(Activity)的绘图表面(Surface)的创建过程分析

文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/8303098 在前文中,我们分析了应用程序窗口连接到WindowManagerService服务的过程.在这个过程中,WindowManagerService服务会为应用程序窗口创建过一个到SurfaceFlinger服务的连接.有了这个连接之后,WindowManagerService服务就可以为应用程序窗口创建绘图表面了,以便可以用来渲染窗口

JS 点击元素发ajax请求 打开一个新窗口

JS 点击元素发ajax请求 打开一个新窗口 经常在项目中会碰到这样的需求,点击某个元素后,需要发ajax请求,请求成功以后,开发需要把链接传给前端(或者说请求成功后打开新窗口),前端需要通过新窗口打开这个链接,其实这样的原理大家可能觉得非常简单,想起来非常简单,用JS中的window.open就可以实现打开新的窗口,或者点击div元素,发ajax请求成功后,动态把链接传给a标签,然后再触发a标签事件,也可以实现,对吧?曾几何时,我也曾经把这样的问题发到JS群里面去,很多JS社区朋友说 龙恩 这

jsWindow 对象 Window 对象 Window 对象表示浏览器中打开的窗口。 如果文档包含框架(frame 或 iframe 标签),浏览器会为 HTML 文档创建一个 window 对象,并为每个框架创建一个额外的 window 对象。 注释:没有应用于 window 对象的公开标准,不过所有浏览器都支持该对象。 Window 对象集合 集合 描述 frames[] 返回窗口中所有命

一.JSX简介 JSX就是Javascript和XML结合的一种格式.React发明了JSX,利用HTML语法来创建虚拟DOM.当遇到<,JSX就当HTML解析,遇到{就当JavaScript解析. 如下(JS写法) var child1 = React.createElement('li', null, 'First Text Content'); var child2 = React.createElement('li', null, 'Second Text Content'); var

JavaScript---网络编程(6)-Dom和Bom模型概念讲解(节点获取,window对象)

本节讲Dom和Bom模型概念讲解(节点获取,window对象). out.js: 写了2个输出到页面的函数. function println(param){ document.write(param+"<br/>"); } function print(param){ document.write(param); } window对象中的方式: 方法: confirm : bConfirmed = window.confirm( [sMessage]) 显示一个确认对话框

android/iPhone:如何从browser直接打开应用程序或者没有应用程序打开应用商店

当用户在用mobile browser浏览该网站的时候会点击一个按钮/超链接,通过这个按钮的点击事情需要打开安装在本机的应用程序,或者如果本机没有安装该应用程序则打开应用商店并打开该程序在商店中的搜索结果页面.下面是实施跳转的HTML + javascript源代码. <html>   <head>          <meta name="viewport" content="width=device-width" />   &

C#注册URL协议,使用浏览器打开本地程序,类似网页上点了QQ交谈打开本地QQ客户端程序

本教程适用于Windows系统 从浏览器上打开本地程序,主要用到了本地URL协议,其实主要就是改注册表 先建立一个项目,我建的是控制台项目 在Program.cs写2个静态方法用来添加注册表.移除注册表(用浏览器打开程序主要就是靠这两个方法) /// <summary> /// 注册启动项到注册表 /// </summary> public static void Reg() { //注册的协议头,即在地址栏中的路径 如QQ的:tencent://xxxxx/xxx 我注册的是ju

js 通过浏览器直接打开应用程序(IOS,Android)并判断浏览器内核

本功能主要用于手机端,如果手机未安装该APP,则跳转至下载页面:否则,直接打开手机中的APP. <div style="position:absolute; top:84%; left:24%; z-index:8;"> <a id="J-call-app" href="javascript:;"><img src="image/but01.jpg"></a> <input