Как я могу моделировать визуальный щелчок по кнопке в моей форме (WinForms)?
Я не имею в виду:
Button_Press(MyButton, new KeyPressEventArgs());
Я хочу, чтобы пользователь видел (визуально) нажатую кнопку.
Конечно, я не хочу использовать
SendKeys.Send("{ENTER}")
или другие функции этого вида.
Если вы используете RadioButton вместо обычной Button, вы можете установить для его свойства .Appearance значение «Button», а затем изменить его свойство .Checked где-нибудь еще.
например.
this.radioButton1.Appearance = Appearance.Button;
, а затем позвоните:
this.radioButton1.Checked = true;
или
this.radioButton1.Checked = false;
. Она будет выглядеть как обычная кнопка.
Вот смехотворно простое решение:
button1.Focus();
SendKeys.Send(" ");
Вы всегда можете попробовать White. Я наблюдал, как он перемещает указатель мыши и заметно нажимает на элементы пользовательского интерфейса Silverlight в моих автоматизированных тестах пользовательского интерфейса; я предполагаю, что то же самое произойдет и с WinForms, но не могу сказать наверняка.
Нет чистого способа сделать это. Единственный способ, о котором я знаю, - это использовать функцию mouse_event
из user32.dll
. Для этого также необходимо временно переместить курсор в желаемое место, выполнить щелчок, а затем переместить его обратно.
[DllImport("user32.dll", CharSet = CharSet.Auto,
CallingConvention = CallingConvention.StdCall)]
public static extern void mouse_event(long dwFlags, long dx, long dy,
long cButtons, long dwExtraInfo);
private const int MOUSEEVENTF_LEFTDOWN = 0x02;
private const int MOUSEEVENTF_LEFTUP = 0x04;
private const int MOUSEEVENTF_RIGHTDOWN = 0x08;
private const int MOUSEEVENTF_RIGHTUP = 0x10;
public void ClickMouseLeftButton(Point globalLocation)
{
Point currLocation = Cursor.Position;
Cursor.Position = globalLocation;
mouse_event(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP,
globalLocation.X, globalLocation.Y, 0, 0);
Cursor.Position = currLocation;
}
public void ClickControl(Control target, Point localLocation)
{
ClickMouseLeftButton(target.PointToScreen(localLocation));
}
public void ClickControl(Control target)
{
ClickControl(target, new Point(target.Width / 2, target.Height / 2));
}
В качестве альтернативы вы можете превратить это в метод расширения:
public static class ControlExtensions
{
[DllImport("user32.dll", CharSet = CharSet.Auto,
CallingConvention = CallingConvention.StdCall)]
private static extern void mouse_event(long dwFlags, long dx, long dy,
long cButtons, long dwExtraInfo);
private const int MOUSEEVENTF_LEFTDOWN = 0x02;
private const int MOUSEEVENTF_LEFTUP = 0x04;
private const int MOUSEEVENTF_RIGHTDOWN = 0x08;
private const int MOUSEEVENTF_RIGHTUP = 0x10;
private static void ClickMouseLeftButton(Point globalLocation)
{
Point currLocation = Cursor.Position;
Cursor.Position = globalLocation;
mouse_event(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP,
globalLocation.X, globalLocation.Y, 0, 0);
Cursor.Position = currLocation;
}
public static void ClickMouse(this Control target, Point localLocation)
{
ClickMouseLeftButton(target.PointToScreen(localLocation));
}
public static void ClickMouse(this Control target)
{
ClickMouse(target, new Point(target.Width / 2, target.Height / 2));
}
}
Это позволит вам вызвать controlName.ClickMouse ();