# Beliebiges Windows-Programm / Prozess in den Vordergrund bringen



## Tom299 (19. Jan 2015)

Hallo,

beim googlen finde ich immer nur Beispiele, wie man ein Java-Programm in den Vordergrund bringen kann. Bei mir ist es aber so, daß ich ein Java-Programm habe, mit dem ich ein anderes Windowsprogramm bzw. Prozess in den Vordergrund bringen kann.

Weiß jemand, ob und wie dies möglich ist?

Ein Beispiel wäre z.B. daß ein Tradingprogramm läuft und ich in meinem Java-Programm Berechnungen durchführe und wenn ich einen Trade öffnen oder schließen will, muß sichergestellt sein, daß das Trading-Programm im Vordergrund ist, um etwas anklicken zu können.
Gerade wenn man nur 1 Monitor hat, ist sowas auf jeden Fall notwendig, bei 2 Monitoren könnte man das evtl. umgehen.

Jemand eine Idee, Stichwort, Beispielcode?


Gruß,
Tom


----------



## Java20134 (19. Jan 2015)

Wenn ein Trade erstellt wird, so muss das ja bestimmt ein JFrame oder so sein. Und das kann man doch in den Hintergrund setzen oder dein Tradingprogramm in den Vordergrund. 
Ich verstehe nicht so richtig dein Problem damit!

```
JFrame frame; 
frame.alwaysOnTop(true); //Dadurch ist ein JFrame immer in dem Vordergrund
```
Dafür dass das JFrame in den Hintergrund geriet habe ich noch keine Methode gefunden, aber vielleicht hilft dir der FocusListener: Referenz: java.awt.event.FocusListener
Ich denke mal dass du dann noch ein paar weitere Methoden brauchst, wie requestFocus() oder so.


----------



## Gucky (19. Jan 2015)

Er meint, er hat ein beliebiges Programm. Ob in Java, C++ oder F# geschrieben ist egal. Und diesen Prozess will er nun in den Vordergrund bringen.

Das geht, wenn überhaupt, nur über die WindowsAPI und Java ist dazu eher ungeeignet. Soll es aber doch Java sein, guck dir mal JNA und JNI an.
In der WindowsAPI gibt es Funktionen, mit denen du dir bestimmte Fenster geben lassen kannst aber ich weiß nicht, ob Microsoft da nicht einen Riegel vorgeschoben hat, um Malware zu verhindern.


----------



## Tom299 (20. Jan 2015)

Also ich hatte mir schon angeschaut, wie ich die Windows-Prozesse bzw. IDs mit Java auslesen kann, was aber auch nur über Windows-Umwege geht. Hatte gehofft, es gäbe eine Möglichkeit, den Prozess dann anhand der ID in den Vordergrund zu bringen.
Aber ok, das mit der Windows-API ist eine Idee, die ich mir mal anschaue. Vielleicht gibts ja auch mit .NET eine Möglichkeit, aber da bin ich nicht so vertraut mit.

Danke für die Infos


----------



## Tom299 (20. Jan 2015)

Ok, ich habs nach einigem rumprobieren hinbekommen, der Tip mit der WindowsAPI hats gebracht 

Falls es jemand interessiert, hier Beispiel-Code (das ursprüngliche Beispiel minimiert alle Fenster und nach 3s Pause wird alles wieder hergestellt).


```
package de.test;
import com.sun.jna.Native;
import com.sun.jna.platform.win32.WinDef.HWND;
import com.sun.jna.win32.W32APIOptions;


public class TestWindow {

	public interface User32 extends W32APIOptions {
		public static final String SHELL_TRAY_WND = "Shell_TrayWnd";
	    public static final int WM_COMMAND = 0x111;
	    public static final int MIN_ALL = 0x1a3;
	    public static final int MIN_ALL_UNDO = 0x1a0;

	    User32 instance = (User32) Native.loadLibrary("user32", User32.class, DEFAULT_OPTIONS);

	    HWND FindWindow(String winClass, String title);

	    long SendMessageA(HWND hWnd, int msg, int num1, int num2);
	    
	    int BringWindowToTop(HWND hWnd);
	    int SetForegroundWindow(HWND hWnd);
	    int SetActiveWindow(HWND hWnd);
	}
	
	public static void main(String[] args) {
		//HWND shellTrayHwnd = User32.instance.FindWindow(User32.SHELL_TRAY_WND, null);
		//HWND shellTrayHwnd = User32.instance.FindWindow("calc.exe", null);
		HWND shellTrayHwnd = User32.instance.FindWindow(null, "Rechner");
		
	    // use it to minimize all windows
	    //User32.instance.SendMessageA(shellTrayHwnd, User32.WM_COMMAND, User32.MIN_ALL, 0);
		//User32.instance.BringWindowToTop(shellTrayHwnd);
		User32.instance.SetForegroundWindow(shellTrayHwnd);	    
		User32.instance.SetActiveWindow(shellTrayHwnd);
		
	    // sleep for 3 seconds
//	    try {
//	    	Thread.sleep(3000);
//	    } 
//	    catch (InterruptedException e) {
//	    
//	    }

	    // then restore previously minimized windows
	    //User32.instance.SendMessageA(shellTrayHwnd, User32.WM_COMMAND, User32.MIN_ALL_UNDO, 0);
	}

}
```

Vielleicht hier noch der Link zu den beiden JARs: https://github.com/twall/jna/#download


----------

