WedX - журнал о программировании и компьютерных науках

Имитация клика на клавиатуре в Windows Forms

Я хочу сделать кнопку, которая работает с клавиатурой как с мышью. Я реализую это так:

class FunctionButton : System.Windows.Forms.Button
{
    public FunctionButton() : base() { }

    protected override void OnGotFocus(EventArgs e)
    {
        OnMouseEnter(null);
        base.OnGotFocus(e);
    }

    protected override void OnLostFocus(EventArgs e)
    {
        OnMouseLeave(null);
        base.OnLostFocus(e);
    }

    protected override void OnMouseLeave(EventArgs e)
    {
        if (!Focused)
        {
            base.OnMouseLeave(e);
        }
    }

    public void FunctionKeyPressed()
    {
        OnMouseDown(new MouseEventArgs(MouseButtons.Left,1,0,0,0));
        PerformClick();
    }

    public void FunctionKeyReleased()
    {
        if (Focused)
        {
            OnMouseEnter(null);
        }
        else
        {
            base.OnMouseLeave(null);
        }
    }
}

Я не знаю, как получить действительную позицию щелчка для этой кнопки, чтобы сгенерировать событие.

OnMouseDown(new MouseEventArgs(MouseButtons.Left,1,X,Y,0));

Как я могу это сделать? Лучший способ реализовать такую ​​​​кнопку?



Ответы:


1

Если я правильно понимаю ваш вопрос, вы создаете элемент управления, который будет отображать кнопку, которую может нажать пользователь, и которая также будет привязана к функциональной клавише, которая должна вызывать ту же команду.

Я считаю, что самый простой (хотя, возможно, немного «хакерский») способ сделать это — создать UserControl, добавить MenuStrip в свой пользовательский элемент управления, добавьте ToolStripMenuItem для элемента управления MenuStrip и настроить обработчик событий Click, а для свойства Visible элемента MenuStrip установить значение false. Также добавьте кнопку в пользовательский элемент управления и настройте для нее обработчик событий Click. Пусть оба обработчика событий вызывают какой-либо метод для выполнения действия и, наконец, создают свойство ShortcutKeys, отражающее ShortcutKeys элемента меню:

public partial class FunctionButton : UserControl
{
    public FunctionButton()
    {
        InitializeComponent();
    }

    private void MenuItem_Click(object sender, EventArgs e)
    {
        PerformCommand();            
    }

    private void Button_Click(object sender, EventArgs e)
    {
        PerformCommand();
    }

    private void PerformCommand()
    {
        OnClick(EventArgs.Empty);
    }

    public Keys ShortcutKeys
    {
        get
        {
            return _menuItem.ShortcutKeys;
        }
        set
        {
            _menuItem.ShortcutKeys = value;
        }
    }
}

В моем примере обработчики событий щелчка просто вызовут событие Click пользовательского элемента управления, чтобы потребитель мог присоединить обработчик события к этому событию и воздействовать на него.

20.08.2009

2

Наконец я реализовал кнопку смены фона:

class FunctionButton : Button
{
    private Color m_colorOver;
    private bool m_isPressed;

    public FunctionButton() : base()
    {
        m_isPressed = false;
    }

    protected override void OnGotFocus(EventArgs e)
    {
        OnMouseEnter(null);
        base.OnGotFocus(e);
    }

    protected override void OnLostFocus(EventArgs e)
    {
        if (!m_isPressed)
        {
            OnMouseLeave(null);
        }

        base.OnLostFocus(e);
    }

    protected override void OnMouseLeave(EventArgs e)
    {
        if (!Focused && !m_isPressed)
        {
            base.OnMouseLeave(e);
        }
    }

    public void FunctionKeyPressed()
    {
        // Handle just the first event
        if (!m_isPressed)
        {
            m_isPressed = true;
            m_colorOver = FlatAppearance.MouseOverBackColor;
            FlatAppearance.MouseOverBackColor = FlatAppearance.MouseDownBackColor;

            OnMouseEnter(null);
            PerformClick();    
        }
    }

    public void FunctionKeyReleased()
    {
        m_isPressed = false;
        FlatAppearance.MouseOverBackColor = m_colorOver;

        if (Focused)
        {
            OnMouseEnter(null);
        }
        else
        {
            base.OnMouseLeave(null);
        }
    }
}

Это не самый чистый способ, но он работает нормально. Я хотел бы больше примеров, делающих это с более чистым и элегантным стилем.

20.08.2009
Новые материалы

Объяснение документов 02: BERT
BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

Как проанализировать работу вашего классификатора?
Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

Работа с цепями Маркова, часть 4 (Машинное обучение)
Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

Учебные заметки: создание моего первого пакета Node.js
Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..


Для любых предложений по сайту: [email protected]