如何用Java监听Windows应用运行状态并触发动作(含控制Groove Music)
Hey Sean, great question—let’s break down exactly how to build this Java program for your Windows setup, since you’re already comfortable with the language. We’ll cover detecting app launches, triggering audio, controlling Groove Music, and whether Java is the right fit for this job.
Java doesn’t have native tools to monitor Windows processes in real-time, but we can use JNA (Java Native Access) to call Windows’ native APIs directly—no C/C++ code required. This is the most reliable way to track running apps and detect new launches.
Enumerating Current Processes
To get a list of active processes, use JNA’s Kernel32 bindings to call the Windows CreateToolhelp32Snapshot API. Here’s a quick example:
import com.sun.jna.platform.win32.Kernel32; import com.sun.jna.platform.win32.Tlhelp32; import com.sun.jna.platform.win32.WinNT; public class ProcessTracker { public static void scanActiveProcesses() { // Take a snapshot of all running processes WinNT.HANDLE snapshot = Kernel32.INSTANCE.CreateToolhelp32Snapshot(Tlhelp32.TH32CS_SNAPPROCESS, new WinNT.DWORD(0)); Tlhelp32.PROCESSENTRY32 processEntry = new Tlhelp32.PROCESSENTRY32(); if (Kernel32.INSTANCE.Process32First(snapshot, processEntry)) { do { // Print the executable name (e.g., "chrome.exe", "notepad.exe") System.out.println("Running: " + processEntry.szExeFile); } while (Kernel32.INSTANCE.Process32Next(snapshot, processEntry)); } // Clean up the snapshot handle Kernel32.INSTANCE.CloseHandle(snapshot); } }
To use JNA, add these dependencies to your Maven/Gradle project:
<!-- Maven example --> <dependency> <groupId>net.java.dev.jna</groupId> <artifactId>jna</artifactId> <version>5.13.0</version> </dependency> <dependency> <groupId>net.java.dev.jna</groupId> <artifactId>jna-platform</artifactId> <version>5.13.0</version> </dependency>
Detecting New App Launches
For real-time detection, you have two options:
- Polling: Scan the process list every 1-2 seconds, compare it to the previous scan, and flag new processes. This is simple but slightly resource-heavy.
- WMI Events: Use JNA to query Windows Management Instrumentation (WMI) for process creation events. This is more efficient—here’s a high-level idea:
You’ll query the WMI eventSELECT * FROM __InstanceCreationEvent WITHIN 1 WHERE TargetInstance ISA 'Win32_Process', which triggers whenever a new process starts. JNA has bindings for WMI to handle this.
Once you detect a target app (e.g., spotify.exe), you can play a corresponding MP3. You have two paths here:
Option 1: Play MP3 Directly in Java
Java’s built-in audio APIs don’t support MP3, so use the JLayer library to handle playback. Example:
import javazoom.jl.player.Player; import java.io.FileInputStream; public class Mp3Player { public static void playMp3(String filePath) { try (FileInputStream fis = new FileInputStream(filePath)) { Player player = new Player(fis); player.play(); } catch (Exception e) { e.printStackTrace(); } } }
Add the JLayer dependency:
<dependency> <groupId>javazoom</groupId> <artifactId>jlayer</artifactId> <version>1.0.1</version> </dependency>
Option 2: Control Groove Music (Your Requested Approach)
To use Groove Music instead of a Java player, leverage Windows shell commands to trigger playback. This is simple and uses the app you already have:
public class GrooveController { public static void playWithGroove(String mp3FilePath) { try { // Escape spaces in the file path for the URL String escapedPath = mp3FilePath.replace(" ", "%20"); // Launch Groove Music and play the file String command = "cmd /c start groovemusic://play?file=" + escapedPath; Runtime.getRuntime().exec(command); } catch (Exception e) { e.printStackTrace(); } } }
This will open Groove Music (or switch to it if it’s already running) and start playing your MP3.
Absolutely—since you’re already proficient in Java, there’s no need to switch languages. The only caveat is that we’re using Windows-specific APIs via JNA, so your program will only run on Windows (which is exactly what you need).
Alternatives like C#/.NET have more native Windows integration, but JNA bridges the gap perfectly for Java. You’ll get the job done without learning a new language.
- JNA Basics: Start with the JNA documentation and examples for
jna-platform—it has pre-built bindings for most Windows APIs you’ll need (like process snapshotting and WMI). - Windows API Fundamentals: You don’t need to be a Windows C expert, but reading Microsoft’s docs for
CreateToolhelp32Snapshotand WMI process events will help you understand what JNA is doing under the hood. - Java Audio Libraries: Check the official JLayer docs for more playback options (like pausing/resuming tracks).
- Process Monitoring Tutorials: Look for Java-specific tutorials on process tracking with JNA—many blogs break down the exact steps to compare process lists and detect new launches.
内容的提问来源于stack exchange,提问作者Sean O

