Monitoring running applications is a common task in desktop utilities, monitoring tools, or system dashboards. In this tutorial, we’ll walk through how to:
- Get a list of running applications (visible windows only)
- Use C# with Windows Forms and Java with Swing
- Display the app list in a ListView (or similar UI control)
Prerequisites
- Basic understanding of either C# (.NET) or Java (Swing/AWT)
- Windows OS (this guide uses Windows API features)
Part 1: C# – Using System.Diagnostics and Win32 API
Create a WinForms App
Open Visual Studio → Create new Windows Forms App (.NET)
Add a ListView to your Form
In Form1.cs:
C#
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
GetRunningApps();
}
private void GetRunningApps()
{
listView1.View = View.Details;
listView1.Columns.Add("App Name", 300);
foreach (Process p in Process.GetProcesses())
{
if (!string.IsNullOrEmpty(p.MainWindowTitle))
{
listView1.Items.Add(new ListViewItem(p.MainWindowTitle));
}
}
}
}
Notes:
Process.GetProcesses()gets all system processes.MainWindowTitlefilters only apps with UI (not background processes).- You can also display
p.ProcessNamefor technical names.
Part 2: Java – Using com.sun.jna to Access Win32 API
Java by default does not access Windows processes easily, but with JNA (Java Native Access), you can call native APIs.
Add JNA to your project (Maven example)
XML
<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>
Create the Java UI (Swing List)
Java
import com.sun.jna.*;
import com.sun.jna.platform.win32.*;
import com.sun.jna.win32.*;
import javax.swing.*;
import java.awt.*;
public class RunningApps {
public static void main(String[] args) {
JFrame frame = new JFrame("Running Apps");
DefaultListModel<String> listModel = new DefaultListModel<>();
JList<String> appList = new JList<>(listModel);
JScrollPane scrollPane = new JScrollPane(appList);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(400, 300);
frame.add(scrollPane, BorderLayout.CENTER);
// Get window titles using EnumWindows
User32.INSTANCE.EnumWindows((hWnd, data) -> {
char[] buffer = new char[512];
User32.INSTANCE.GetWindowText(hWnd, buffer, 512);
String windowTitle = Native.toString(buffer);
if (!windowTitle.isBlank()) {
listModel.addElement(windowTitle);
}
return true;
}, null);
frame.setVisible(true);
}
public interface User32 extends StdCallLibrary {
User32 INSTANCE = Native.load("user32", User32.class);
boolean EnumWindows(WNDENUMPROC lpEnumFunc, Pointer arg);
int GetWindowText(WinDef.HWND hWnd, char[] lpString, int nMaxCount);
interface WNDENUMPROC extends Callback {
boolean callback(WinDef.HWND hWnd, Pointer arg);
}
}
}
Notes:
- This uses
EnumWindowsto loop through top-level windows. GetWindowTextfetches window titles.- You can filter with
IsWindowVisibleif needed.
Output: What You’ll See
Both implementations give you a scrollable list view showing:
- Active window titles (e.g., “Visual Studio Code”, “Google Chrome”, etc.)
- Only visible applications, not background processes
Security Note
- For full access to all processes (in C#), run as admin.
- In Java, JNA is powerful but requires trust; avoid using native access for untrusted operations.
Please follow and like us:
