Obtain the icon that has opened the application window (that is, the foreground process in the Task Manager) in the window taskbar. The window
Obtain the icon of the window taskbar that has opened the application window (that is, the foreground process in the task manager ).
1. Function Description
Obtain the window icon of the application that has been opened in the window taskbar. The following figure shows the icons of QQ, browser, and folder, but hidden icons in the taskbar are not displayed)
2. Use technologies and tools
JAVA, JNA, Eclipse.
You need to download the JNA package (one is jna. jar, one is the jna-platform.jar); the download of the package provides the address at the end of the article.
3. Implementation ideas
(1).the application program opened in a Windows Task column also has a previous step, so that all tasks obtained through jnaare obtained first (.exe file name, file path, PID) (from. the image can be obtained in the EXE file. In this case, the process also contains some non-window (non-foreground application) processes, which need to be filtered out by the second step.
(2). enumerate all the window handles from JNA and obtain the PID through the window handle.
Obtain the image from the images file.
4. Implementation Code
(1) obtain the PID of the window handle Process
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 (); // put PID 6 user32.EnumWindows (new User32.WNDENUMPROC () {7 public boolean callback (HWND h, Pointer p) {8 user32.GetWindowThreadProcessId (h, i); get the window PID 9 if (user32.IsWindow (h) & user32.is1_wenabled (h) & user32.IsWindowVisible (h) {10 set. add (I. getValue (); 11} 12 return true; 13} 14}, null); 15 return set; // The obtained window PID set 16} 17}
(2) Obtain process images
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 MODULEENTRY3 2 (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_NAME3229 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 @ Override33 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 ProcessPathKe Rnel32 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 (); // obtain the PID50 int c = 1 of the window process; 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.creatw.lhelp32snapshot (Tlhelp32.TH32CS _ SNAPPROCESS, new WinDef. DWORD (0); 55 try {56 While (kernel32.Process32Next (processSnapshot, processEntry) {57 // processEntry. PID58 of the th32ProcessID program // Native. toString (processEntry. szExeFile) program name (xx.exe) 59 WinNT. HANDLE moduleSnapshot = kernel32.creatw.lhelp32snapshot (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 is the Start Menu shell, and syntpenh is the touchpad-related program 63 continue; 64} 65 try {66 ProcessPathKernel32.MODULEENTRY32. byReference me = new ProcessPathKernel32.MODULEENTRY32. byReference (); 67 ProcessPathKernel32.INSTANCE. module32First (moduleSna Pshot, me); 68 // me. szExePath () // the path of the program (xx.exe) is 69 Shell32.INSTANCE. extractIconEx (me. szExePath (), 0, a, B, c); 70 if (. length> 0 & Native. toString (processEntry. szExeFile )! = Null & Native. toString (processEntry. szExeFile ). length ()> 0 & Native. toString (processEntry. szExeFile ). indexOf (". exe ")> = 0) {// determine whether there is an icon 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 File 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.
Save the obtained image to the specified folder.
6. Put the complete project code on github.
Address: https://github.com/xujinghuan/getWindowTaskIcon