MouseListener und KeyListener

Binabic

Mitglied
Hallo ich Programmiere nur für den privaten bereich mein zeil ist es ein eigenes Online Spiel zu programieren aberauf dem weg dahin muß ich problematiken so lösen können.

Angefangen habe ich vor etwar 20 Jahren mit dem guten Alten C64 Basic und habe vor einigen Monaten dann einen C++ und einen Java Anfängerkurs besucht.

Ich habe mich dafür entschieden mich auf eine Spache zu konzentrieren und da mir Java leicher von der Hand geht als C++ war es für mich dann klar welche das ist.

Nun zu meinem Problem.

Die listener bindet man ja normalerweise an ein Objekt (Fenster, Button).

Ich möchte eine Klasse die im Hintergrund auf bestimmte Maus und Key evends wartet dabei soll es egal sein welcher Prozess nun Aktiv ist.

Ich habe mehrere tage gegooglt und bin immer nur auf antworten gestossen das dies nur mit C++ geht und mit Java nicht wirklich machbar ist.

Das ist leider etwas das ich nicht wirklich glauben kann den irgendwo muß es eine klasse geben die schon auf die Maus zugreift oder die keyboard und sobald dort aktionen pasieren das bemerken.

Vorerst geht es mir nur darum zb bei drücken von Alt und rechte maustause eine aktion durchzuführen und bei shift und linke maustase eine andere aktion durchzuführen.

Kann mir da jemand weiter helfen welche klasse ich mir mal anschauen sollte.
Oder hat jemand eine Idee wie man das umsetzen könnte ich sitze da nun schon mehrer wochen daran aber scheitere daran das ich bei einem Tastendruck Maus oder Keyboard den listener nicht aktiv bekomme sobald ich die anwendung selber nicht aktiv habe.

MfG
Binabic
 

U2nt

Bekanntes Mitglied
Erlich gesagt hab ich das noch nicht wirklich gebraucht, aber ich weiß auch nicht so genau wofür du das brauchst, warum willst du Tastenkombis außerhalb des Games abfangen?

Ich mein wenne ein Game machst das fullscreen is gehts ja eh überall...

Meine Lösung, wahrscheinlich ein wenig dirty wäre ein invisibles Frame auf die Screen size zu setzen und dort die jeweiligen Dinge abfangen :)
 

Binabic

Mitglied
Das war ja nicht meine Frage ob es jemand gebrauchen kann ....
aber genauer erklären kann ich dir das wenn du das magst.

Ich will die Möglichkeit geben im Fenster Modus zu Spielen daher soll es möglich sein nebenher das spiel zu spielen so das zb ein Item craften kann oder einen Zaubertrank brauen kann ohne seine Eigendliche arbeit Groß zu unterbrechen einfach die Kombination drückemn und eine besti8mte fähigkeit wird ausgeführt dann gibt es einen colddown der fertigkeit es soll den leutet gestattet sein sich ihre emails abzurufen im browser etwas nachzuschauen oder sich im editor etwas zu notieren, oder sogar neben der Arbeit ein bissel was zu machen. Das soll ein spiel werden das man sozusagen wirklich nebenher spielen kann aber dazu muß die speil selber auch wissen wann es angesprochen wird unddas geht nunmal nur mit Tastatur und Maus abfrage ob bestimmte kombinationen betätigt wurden wenn ja wird die im Spiel festgelegte Aktion dafür durchgeführt.

Ich könnte den leuten erklauben einen Macrotool zu nutzen aber eigendlich sollte das nicht sinn der sache sein sondern ich will die möglichkeiten im spiel selber realisieren so das sie wirklich jeder speiler nutzen kann und somit die bedingungen für alle gleich sind.

MfG
Binabic
 
Zuletzt bearbeitet:

U2nt

Bekanntes Mitglied
Ich weiß nicht ob es funktioniert, aber ich würde einfach ein Frame unsichtbar immer im Vordergrund auf die Größe des Bildschirms setzen und damit den Key bzw. Mouselistener verbinden.

Naja wie gesagt, ich weiß nicht ob das funktioniert, wäre nur eine Theorie.
 

Binabic

Mitglied
Ich weiß nicht ob es funktioniert, aber ich würde einfach ein Frame unsichtbar immer im Vordergrund auf die Größe des Bildschirms setzen und damit den Key bzw. Mouselistener verbinden.

Naja wie gesagt, ich weiß nicht ob das funktioniert, wäre nur eine Theorie.

währe unlogisch da sonst die anwendungen die hinter dem Frame liegen nicht mehr angesprochen werden.

Es soll ja möglich sein sein Andere Anwednungen zu starten und zu bedienen in der zeit.

Es muß meines erachtens eine Klasse geben die mit der Java sozusagen verbindung zur Maus und zum Keyboard hat die unabhängig von der anwenung siegnaliesiert es pasiert was.

MfG
Binabic
 

kay73

Bekanntes Mitglied
Ich bin nicht sicher, ob ich dich richtig verstehe. Willst etwas in der folgenden Art machen: Das Spiel ist in einem Fenster auf dem Desktop und hat keinen Fokus. User hat die notepad.exe offen und die hat den Fokus. User tippt darin einen Text und mitten im Tippen drückt er Alt + rechte Maustaste und es soll etwas im Spielfenster passieren?
 

Binabic

Mitglied
Ich bin nicht sicher, ob ich dich richtig verstehe. Willst etwas in der folgenden Art machen: Das Spiel ist in einem Fenster auf dem Desktop und hat keinen Fokus. User hat die notepad.exe offen und die hat den Fokus. User tippt darin einen Text und mitten im Tippen drückt er Alt + rechte Maustaste und es soll etwas im Spielfenster passieren?

Genau die Alt + rechte Maustaste soll jetzt für das Spiel das Siegnal sein ich muß jetzt etwas zuvor festgelegtes tun. Der User muß nicht jedesmal dem spiel den Fokus geben er kann weiter im Editor tippen oder andere Arbeiten verrichten.
 

U2nt

Bekanntes Mitglied
Hab einen interesannten Thread dazu gefunden, mit dem das über dem JNI läuft...

Perhaps a bit late, but I found myself wanting of something similar to this. I made a JNI dll for C++ for Win95 or better that could capture global keystrokes by using a keyboard hook. It may not be the best way, but it's the best way I could think of, and create. If you have any improvements on my code, questions, or critques (anyone) please post it here or email it to me as I could really use the feedback.

As I don't have a website of my own, I'll post code here. Good luck :)


C++:
Code:
// syshook.cpp
/*
 *	SysHook - 7/17/05
 *	Jacob Gohlke
 *	
 *	JNI Interface for setting a Keyboard Hook and monitoring
 *	it Java-side
 *
 *	(c) Copyright 2005 Jacob Gohlke
 *	
 *	Feel free to use and learn from this code, royalty-free!
 *	I only ask you acknkowlege what library you are using
 *	and who made it. Thanks, and happy hooking!
 */
 
#include <windows.h>
#include <winuser.h>
#include "jni.h"
#include "syshook.h"
 
#pragma data_seg(".HOOKDATA") //Shared data among all instances.
static HHOOK hkb = NULL;
static HANDLE g_hModule = NULL;
static WPARAM g_wParam = NULL;
static LPARAM g_lParam = NULL;
 
JNIEXPORT void NotifyJava(JNIEnv *env, jobject obj, WPARAM wParam, LPARAM lParam)
{		
	jclass cls = env->GetObjectClass(obj);
	jmethodID mid;
 
	mid = env->GetMethodID(cls, "Callback", "(ZIZZ)V");
	if (mid == NULL) 
			return;
 
	if( (HIWORD( lParam ) & KF_UP) )
		env->CallVoidMethod(obj, mid, (jboolean)FALSE, (jint)(wParam), (jboolean)(HIWORD( lParam ) & KF_ALTDOWN), (jboolean)(HIWORD( lParam ) & KF_EXTENDED));
	else
		env->CallVoidMethod(obj, mid, (jboolean)TRUE, (jint)(wParam), (jboolean)(HIWORD( lParam ) & KF_ALTDOWN), (jboolean)(HIWORD( lParam ) & KF_EXTENDED));
}
 
#pragma data_seg() 
 
#pragma comment(linker, "/SECTION:.HOOKDATA,RWS")
 
JNIEXPORT LRESULT CALLBACK HookKeyboardProc(INT nCode, WPARAM wParam, LPARAM lParam) 
{
    if (nCode < 0)  // do not process message 
		return CallNextHookEx(hkb, nCode, wParam, lParam); 
 
	g_wParam = wParam;
	g_lParam = lParam;
	return CallNextHookEx(hkb, nCode, wParam, lParam);
} 
 
JNIEXPORT void JNICALL Java_PollThread_checkKeyboardChanges(JNIEnv *env, jobject obj)
{
	if(g_wParam != NULL && g_lParam != NULL)
	{
		NotifyJava(env, obj, g_wParam, g_lParam);
		g_wParam = NULL;
		g_lParam = NULL;
	}
}
 
static void Init()
{
	hkb = SetWindowsHookEx( WH_KEYBOARD, (HOOKPROC)HookKeyboardProc, (HINSTANCE)g_hModule, 0 );
}
 
static void Cleanup()
{
	if( hkb != NULL )
		UnhookWindowsHookEx( hkb );
 
	hkb = NULL;
}
 
BOOL APIENTRY DllMain( HANDLE hModule, DWORD  ul_reason_for_call, LPVOID lpReserved )
{
	switch(ul_reason_for_call)
	{
		case DLL_PROCESS_ATTACH:
			g_hModule = hModule;
			Init();
			return TRUE;
 
		case DLL_PROCESS_DETACH:
			Cleanup();
			return TRUE;
	}
 
    return TRUE;
}


// syshook.h
/* DO NOT EDIT THIS FILE - it is machine generated */
#include "jni.h"
/* Header for class PollThread */
 
#ifndef _Included_PollThread
#define _Included_PollThread
#ifdef __cplusplus
extern "C" {
#endif
#undef PollThread_MIN_PRIORITY
#define PollThread_MIN_PRIORITY 1L
#undef PollThread_NORM_PRIORITY
#define PollThread_NORM_PRIORITY 5L
#undef PollThread_MAX_PRIORITY
#define PollThread_MAX_PRIORITY 10L
/*
 * Class:     PollThread
 * Method:    checkKeyboardChanges
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_PollThread_checkKeyboardChanges
  (JNIEnv *, jobject);
 
#ifdef __cplusplus
}
#endif
#endif

Java:
//KeyboardEvent.java
import java.util.*;
 
public class KeyboardEvent extends EventObject
{
	boolean ts, ap, ek;
	int vk;
 
	public KeyboardEvent( Object source, boolean ts, int vk, boolean ap, boolean ek )
	{
		super(source);
		this.ts = ts;
		this.vk = vk;
		this.ap = ap;
		this.ek = ek;
	}
 
	public boolean getTransitionState()
	{
		return ts;
	}
 
	public long getVirtualKeyCode()
	{
		return vk;
	}
 
	public boolean isAltPressed()
	{
		return ap;
	}
 
	public boolean isExtendedKey()
	{
		return ek;
	}
 
	public boolean equals( KeyboardEvent event )
	{
		if( event.getVirtualKeyCode() == vk )
		{
			if( event.isExtendedKey() == ek )
			{
				if( event.isAltPressed() == ap )
				{
					return true;
				}
			}
		}
		return false;
	}
}

Java:
// KeyboardEventListener.java
import java.util.*;
 
public interface KeyboardEventListener extends EventListener
{
	public void GlobalKeyPressed( KeyboardEvent event );
	public void GlobalKeyReleased( KeyboardEvent event );
}

Java:
// KeyboardHook.java
import java.io.*;
 
public class KeyboardHook
{
	public KeyboardHook()
	{
		( new PollThread(this) ).start();
	}
 
	protected javax.swing.event.EventListenerList listenerList = new javax.swing.event.EventListenerList();
 
	public void addEventListener(KeyboardEventListener listener)
	{
		listenerList.add( KeyboardEventListener.class, listener );
	}
 
	public void removeEventListener(KeyboardEventListener listener)
	{
		listenerList.remove( KeyboardEventListener.class, listener );
	}
 
	void keyPressed(KeyboardEvent event)
	{
		Object[] listeners = listenerList.getListenerList();
		for ( int i = 0; i < listeners.length; i += 2 )
		{
			if ( listeners[ i ] == KeyboardEventListener.class )
			{
				( (KeyboardEventListener)listeners[i + 1] ).GlobalKeyPressed( event );
			}
		}
	}
 
	void keyReleased(KeyboardEvent event)
	{
		Object[] listeners = listenerList.getListenerList();
		for ( int i = 0; i < listeners.length; i += 2 )
		{
			if ( listeners[ i ] == KeyboardEventListener.class )
			{
				( (KeyboardEventListener)listeners[i + 1] ).GlobalKeyReleased( event );
			}
		}
	}
}
 
class PollThread extends Thread
{
	public native void checkKeyboardChanges();
	private KeyboardHook kbh;
 
	public PollThread( KeyboardHook kh )
	{
		kbh = kh;
		System.loadLibrary("syshook");
	}
 
	public void run()
	{
		for(;;)
		{
			checkKeyboardChanges();
			yield();
		}
	}
 
	void Callback( boolean ts, int vk, boolean ap, boolean ek )
	{
		KeyboardEvent event = new KeyboardEvent( this, ts, vk, ap, ek );
		if( ts )
		{
			kbh.keyPressed( event );
		}
		else
		{
			kbh.keyReleased( event );
		}
	}
}

Example

Java:
// Test.java
import java.io.*;
 
public class Test implements KeyboardEventListener
{
	public static void main( String args[] )
	{
		KeyboardHook kh = new KeyboardHook();
		kh.addEventListener( new Test() );
		BufferedReader br = new BufferedReader( new InputStreamReader( System.in ) );
		try{
			br.readLine();
		} catch( IOException ex ) {}
	}
 
	public void GlobalKeyPressed( KeyboardEvent event )
	{
		System.out.println( "Key Pressed: " + event.getVirtualKeyCode() );
	}
 
	public void GlobalKeyReleased( KeyboardEvent event )
	{
		System.out.println( "Key Released: " + event.getVirtualKeyCode() );
	}
}

Quelle:sun forums
 
Zuletzt bearbeitet:

Onkel Hatti

Bekanntes Mitglied
Genau die Alt + rechte Maustaste soll jetzt für das Spiel das Siegnal sein ich muß jetzt etwas zuvor festgelegtes tun. Der User muß nicht jedesmal dem spiel den Fokus geben er kann weiter im Editor tippen oder andere Arbeiten verrichten.

Java kann nur auf Ereignisse reagieren, wenn die Applikation den Focus hat. Alles andere spielt sich auf Betriebssystemebene ab, dass kann Java nicht. Man muss sich also über C/C++ in die Ereignisbehandlung des Betriebssystems einklinken. Das ist aber dann nicht mehr plattformunabhängig.
 

Binabic

Mitglied
Danke U2nt aber genau das will ich ja nicht wenn ich etwas für die windows welt programmieren möchte kann ich dann gleich von A bis Z C++ nutzen.

Großer vorteil von Java ist ja die plattform unabhänigkeit ich möchte mir keine gedanken darum machen welches Betriebssystem der Anwender nutzt und um dann die gängigen zu bedienen jeweils eine extra version dazu schreiben.

Onkel Hatti du wilst mir also damit sagen das alle Aktionen die gemacht werden sobald Die anwendung nicht mehr den fokus hat nicht an Java weiter geleitet werden sondern sozusagen im Betriebssystem abgearbeitet werden erst wenn eine Java anwendung den Fukus erhält reicht windows die ereignisse an Java weiter und erst dann können sie bearbeitet werden.
 

U2nt

Bekanntes Mitglied
Danke U2nt aber genau das will ich ja nicht wenn ich etwas für die windows welt programmieren möchte kann ich dann gleich von A bis Z C++ nutzen.

Großer vorteil von Java ist ja die plattform unabhänigkeit ich möchte mir keine gedanken darum machen welches Betriebssystem der Anwender nutzt und um dann die gängigen zu bedienen jeweils eine extra version dazu schreiben.

Dann geht es nicht mit Java.
 

Binabic

Mitglied
Dann geht es nicht mit Java.

Eindeutiger Minuspunkt für Java muß ich dann sagen es dürfte ja nicht so schwer sein sobald ein Javaprogramm läuft ein Globales Key- oder Mausevend auszulösen weil das ist es genau was ich nicht ganz begreife.

Es muß ja schon jetzt eine Klasse geben die von der Hardware (Maus oder Tastatur) ein signal bekommt sobald sich da was tut Java ist ja da sogar schon weiter es kann zuordnen um weches Objekt es sich handelt und Führt dann den jeweiligen code aus.

Daher verstehe ich das nicht so ganz da ich ja eigendlich nichts will was nicht schon pasiert nur das ich das sozusagen auf globaler ebene möchte.

Na ja vileicht fidnet sich ja noch jemand der sich da Wesendlich besser auskennt als ich und mir sagen kann wie man das vielicht doch umsetzen kann.
 

U2nt

Bekanntes Mitglied
Ich meine so stands in den Posts auf der Seite von oben... Globale Keys sind "anscheinend" Systemabhängig. Aber wie du schon gesagt hast, vlt. findet sich jemand der sich damit besser auskennt.
 

Onkel Hatti

Bekanntes Mitglied
Danke U2nt aber genau das will ich ja nicht wenn ich etwas für die windows welt programmieren möchte kann ich dann gleich von A bis Z C++ nutzen.

Großer vorteil von Java ist ja die plattform unabhänigkeit ich möchte mir keine gedanken darum machen welches Betriebssystem der Anwender nutzt und um dann die gängigen zu bedienen jeweils eine extra version dazu schreiben.

Onkel Hatti du wilst mir also damit sagen das alle Aktionen die gemacht werden sobald Die anwendung nicht mehr den fokus hat nicht an Java weiter geleitet werden sondern sozusagen im Betriebssystem abgearbeitet werden erst wenn eine Java anwendung den Fukus erhält reicht windows die ereignisse an Java weiter und erst dann können sie bearbeitet werden.

Jepp. Das ist aber mit jedem Programm so. Mach mal Word auf, schreib nen Text, dann gib den Focus auf den Explorer und drück Ctrl-S (unter Word: speichern), Isch schwör, in Word tut sich gar nix. Wär auch die Härte...
Darum geht die Sache anders herum: Nicht Windows gibt das weiter, sondern ein Programm holt es sich, indem es sich in die Ereignisbehandlung einklinkt, und damit jede Nachricht, die im System rumschwirrt bekommt und auswerten kann. Es ist, als würde sich das Programm in die Ereignisbehandlung "einhaken", daher wird ein solches Programm auch "hook" genannt.
1. Diese Ereignisbehandlung ist sehr plattformabhängig, es könnte sogar sein, dass es unter den div. Windowsversionen Unterschiede gibt, so dass ein Hook hier funktioniert, dort nicht.
2. Eine als plattformunabhängig konzipierte Sprache wie Java kann so was nicht.
3. Ob das ein Minuspunkt von Java ist, musst du selbst entscheiden. Es gibt sooo viele Sprachen in der Computerwelt, such' dir die aus, die das macht, was du willst.

Onkel Hatti
 

Binabic

Mitglied
@ Onkel Hatti

Sobald ein Java programm aktiv ist holt es sich ja schon die notwendigen informationen vom System.

Das die Tastenkombinationen Strg + S in Word nicht funktioniert wenn du es nicht aktiv hast ist ja klar den der nebenefeckt das du Plötzlich bei 3 verscheidnene anwendungen mit Strg + S deine dateien speicherst ist ja mit absicht nicht gewollt.

Aber zum Problem Java fängt ja Maus und Tastatur eingaben auf jedoch wird das ja nur gemacht wenn ein JavaProzess Aktiv ist. Also ist eigendlich schon einiges vorhanden ich glaube garnicht das man da so einen großen akt machen muß ich denke das es durchaus möglich ist mit ein paar erweiterungen das hinzubekommen und ich werde ja nicht der einzige sein der troz aller Aussagen weiter versucht und mit ein bischen Glück wird es irgendwann jemand schaffen.

Und wenn man etwas mit einer Sprache nicht Programieren kann ist es immer ein Minuspunkt.
Es heist nicht das die Sprache schlecht ist sondern das ist vergleichbar mit den Menschen.
Es gibt keinen Menshcen der etwas Perfeckt kann jeder hat vor und nachteile und man muß mit ihnen leben oder daran Arbeiten ;)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
R Global KeyListener/MouseListener Allgemeine Java-Themen 4
I AWT MouseListener Extra Knopf auf der Maus Allgemeine Java-Themen 9
L MouseListener für viele Objekte erstellen Allgemeine Java-Themen 16
L Koordinaten des Mouselistener nicht überall gleich Allgemeine Java-Themen 13
B LEERE JTable MouseListener + popupmenu Allgemeine Java-Themen 2
C MouseListener und Repaint() Allgemeine Java-Themen 6
P MouseListener reagiert 2 Mal Allgemeine Java-Themen 11
T Edit: JLabel+MouseListener oeffnet mehrere Instanzen Allgemeine Java-Themen 5
T MouseListener und MouseMotionListener Allgemeine Java-Themen 3
V MouseListener Allgemeine Java-Themen 2
F Wo MouseListener Positionieren Allgemeine Java-Themen 4
E MouseListener Priorität Allgemeine Java-Themen 4
ElViZ MouseListener auf Linie die per drawLine() gezeichnet wurde? Allgemeine Java-Themen 2
S Anonymen MouseListener entfernen? Allgemeine Java-Themen 2
P Bug mouseListener Allgemeine Java-Themen 2
B Programm soll auf die Eingabe vom Mouselistener warten. Allgemeine Java-Themen 19
M 1. Probleme mit MouseListener, 2. Anwendung in Infobar Allgemeine Java-Themen 8
V MouseListener Allgemeine Java-Themen 9
S MouseListener Allgemeine Java-Themen 18
S Problem Mouselistener Allgemeine Java-Themen 6
G Mouselistener geht aber danach Fehler bei JOptionPane Allgemeine Java-Themen 4
G KeyListener für JTextField Allgemeine Java-Themen 5
VfL_Freak KeyEvent.VK_TAB im KeyListener abfragen Allgemeine Java-Themen 13
N Keylistener ohne Dazugehörige Gui Allgemeine Java-Themen 6
R Java KeyListener buggt? Allgemeine Java-Themen 1
C KeyListener Frage Allgemeine Java-Themen 3
T KeyListener Allgemeine Java-Themen 1
S KeyListener ohne Focus - Wie? Allgemeine Java-Themen 2
E KeyListener ohne GUI Allgemeine Java-Themen 6
C KeyListener auslagern - Wie? Allgemeine Java-Themen 3
P Tastatur abfrage ohne KeyListener Allgemeine Java-Themen 3
B Keylistener geht nicht Allgemeine Java-Themen 9
A keylistener funktionirt nicht Allgemeine Java-Themen 4
G JTable mit Keylistener geht nicht Allgemeine Java-Themen 3
M KeyListener Allgemeine Java-Themen 8
S C++/C KeyListener zusammen mit Java Programm Allgemeine Java-Themen 4
T KeyListener lässt sich nur einmal drücken Allgemeine Java-Themen 2
C Sudoku und KeyListener Allgemeine Java-Themen 2
O Frage zum KEyListener Allgemeine Java-Themen 3
J keylistener auf jtable Allgemeine Java-Themen 19
ARadauer mit keylistener hören auch wenn frame nicht den focus hat Allgemeine Java-Themen 2
U Frage zum KeyListener Allgemeine Java-Themen 7
B KeyListener auf mehrere TextFields anwenden Allgemeine Java-Themen 5
G KeyListener: Wiederholtes Aufrufen von KeyPressed verhindern Allgemeine Java-Themen 3
M Tab und KeyListener in einer JTextArea Allgemeine Java-Themen 7
D Allgemeiner KeyListener Allgemeine Java-Themen 4
G KeyListener auf ALT + S Allgemeine Java-Themen 5
S KeyListener! Image Problem! Allgemeine Java-Themen 2
7 Keylistener Allgemeine Java-Themen 3
TheJavaKid Focus für KeyListener setzen Allgemeine Java-Themen 5
M Keylistener für sondertasten an Tastaturen? Allgemeine Java-Themen 6
S Keylistener funktioniert nicht(setFocusable) Allgemeine Java-Themen 4
K KeyListener-Alternative ohne anfängliches Delay ? Allgemeine Java-Themen 5
T Unterschiede beim KeyListener zwischen NT und XP Allgemeine Java-Themen 6
R KeyListener ohne Frame und Applet Allgemeine Java-Themen 7
F KeyListener für JTextField Allgemeine Java-Themen 4
S KeyListener ohne awt Allgemeine Java-Themen 2

Ähnliche Java Themen

Neue Themen


Oben