Моделируйте нажатие кнопки

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

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

Button_Press(MyButton, new KeyPressEventArgs());

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

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

SendKeys.Send("{ENTER}")

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

10
задан Michael Currie 1 September 2015 в 17:54
поделиться

4 ответа

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

например.

this.radioButton1.Appearance = Appearance.Button;

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

this.radioButton1.Checked = true;

или

this.radioButton1.Checked = false;

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

1
ответ дан 4 December 2019 в 00:23
поделиться

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

button1.Focus();
SendKeys.Send(" ");
1
ответ дан 4 December 2019 в 00:23
поделиться

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

2
ответ дан 4 December 2019 в 00:23
поделиться

Нет чистого способа сделать это. Единственный способ, о котором я знаю, - это использовать функцию 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
ответ дан 4 December 2019 в 00:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: