Ziel: Die Maus - genauer: der Cursor - soll dort angezeigt werden, wo gearbeitet wird.
Problem: Seit den Anfängen von Windows stört es mich, dass die Maus sich "irgendwo" befindet, aber nicht in der Nähe des aktivierten Controls (z.B. beim OK-Button der MessageBox).
Lösung: Für eigene Programme setze ich die Maus immer dorthin, wo der Benutzer arbeiten soll, vorzugsweise dann, wenn ActiveControl geändert wird. Dazu biete ich die folgende Routine an, die von
Kharabakh überarbeitet und verändert wurde.
Variante 1: in einer DLL für mehrfache Verwendung
Erzeuge in einer Assembly für einen Standard-Namespace eine beliebige Klasse (z.B. Tools) und definiere dort die folgende Methode (ob die Klasse selbst static ist, hängt von ihrer sonstigen Funktionalität ab):
Code:
public static class Tools {
/// Standardwert vorbelegen
static readonly Size focusOffset = new Size(16, 8);
/// <summary>
/// Setzt den Mauszeiger auf das angegebene Control.
/// </summary>;
/// <param name="ctl">Zu fokussierendes Control-Objekt</param>
/// <param name="bActive">Festlegung, ob das Control auch ActiveControl werden soll</param>;
public static void ControlActivate(Control ctl, bool bActive) {
Point p = ctl.PointToScreen(new Point());
if (ctl is ButtonBase)
p += new Size(ctl.Width / 2, ctl.Height / 2);
else p += focusOffset;
Cursor.Position = p;
// bei Bedarf das Control zum aktiven machen
if (bActive) {
// das kann z.B. bei unsichtbaren Controls auch schief gehen
try { ctl.FindForm().ActiveControl = ctl; }
catch { ; }
}
}
Bei dieser Variante steht diese Methode "immer" zur Verfügung, z.B.:
Code:
(Namespace).Tools.ControlActivate( Form2.textBox3, true );
Variante 2: direkt in einem Formular
Wenn diese Funktionalität nur einmal (oder ganz selten) benötigt wird, kann die Methode (plus focusOffset) auch direkt in die entsprechende Klasse kopiert werden; sie muss dann natürlich nicht static sein und kann auch private/protected deklariert werden.
Viel Erfolg bei der Nutzung! Jürgen
[edit=MrSpock]C - Tags eingefügt. Mfg, MrSpock[/edit]
[edit=Chakotay1308]C#-Tag eingefügt. Mfg, Chakotay1308[/edit]
[edit=Chakotay1308]Code von Kharabakh einfließen lassen. Mfg, Chakotay1308[/edit]