Имитация нажатия кнопки - PullRequest
10 голосов
/ 01 июля 2010

Как мне имитировать визуальный щелчок по кнопке в моей форме (WinForms)?

Я не имею в виду:

Button_Press(MyButton, new KeyPressEventArgs());

Я хочу, чтобы пользователь видел (визуально) нажатую кнопку.

Конечно, я не хочу использовать

SendKeys.Send("{ENTER}")

или другие функции такого рода.

Ответы [ 5 ]

7 голосов
/ 11 апреля 2011
Button1.PerformClick

Очень легкий лайнер. Вот, пожалуйста.

2 голосов
/ 02 июля 2010

Вы всегда можете попробовать Белый . Я наблюдал, как он перемещал указатель мыши и явно нажимал на элементы пользовательского интерфейса Silverlight в моих автоматических тестах пользовательского интерфейса; Я думаю, что то же самое произошло бы с WinForms, но я не могу сказать наверняка.

1 голос
/ 01 июля 2010

Нет чистого способа сделать это.Единственный способ, которым я знаю, - это использовать функцию 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();

1 голос
/ 02 июля 2010

Вот смехотворно простое решение:

button1.Focus();
SendKeys.Send(" ");
1 голос
/ 01 июля 2010

Если вы используете RadioButton вместо обычной кнопки, вы можете установить его свойство .Appearance на «Button», а затем изменить его свойство .Checked из другого места.

например.

this.radioButton1.Appearance = Appearance.Button;

и затем позвоните:

this.radioButton1.Checked = true;

или

this.radioButton1.Checked = false;

Это будет выглядеть как обычная кнопка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...