m.r.m.40 Ответов: 1

Получите имя кнопки, на которую вы нажмете!


Привет,

Я планирую создать программу, которая отслеживает события мыши, каждый раз, когда происходит событие mousedown, она должна возвращать имя кнопки, на которой произошло событие click(кнопка, которая нажата).

Я понятия не имею, как это сделать.
Любые идеи о том, как это сделать, были бы абсолютно полезны.

заранее спасибо.

Что я уже пробовал:

Правильно знаю, что читаю о событиях мыши на msdn.

Sujith Karivelil

Вы можете использовать событие MouseDown элементов управления для их идентификации

m.r.m.40

Допустим, это модуль, который добавляется в программу, которая уже имеет около 1000 кнопок.

Ralf Meier

Каждое событие дает вам отправителя (как объект). Отправитель - это элемент управления, который вызвал событие.

m.r.m.40

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

Ralf Meier

Так... каждая из этих кнопок должна ссылаться на тот же метод, что и событие, которое вы хотите иметь.
Это можно сделать с помощью петли.
Чтобы дать вам решение, вы должны дать мне больше информации ...

Какой язык программирования вы используете ? C# или VB ?

m.r.m.40

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

Michael_Davies

Вы можете ловить все сообщения windows в вашем приложении с помощью Imessagefilter, это не скажет вам, что было нажато, просто щелчок произошел где-то в вашей форме, тогда вы можете использовать меня.ActiveControl, чтобы определить, что было нажато, но вам нужно знать имена элементов управления, чтобы определить, было ли это событие вам нужно.

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

Кнопка логически требует обработчика событий click вы можете делать то, что вам нравится в этом событии, если вы добавите модуль к существующему проекту 1000 кнопок (пожалейте пользователя), напишите sub, чтобы сделать то, что вы хотите, и добавьте вызов к этому sub в каждом обработчике событий для 1000 кнопок.

m.r.m.40

Что ж, это отличная идея,
Мне помогла следующая строка кода,

Ящик для сообщений.Показать(Me.Name.Метод toString() + "&ГТ;&ГТ;&ГТ; " + меня.Свойство activecontrol.Имя.Метод toString())

Теперь у меня есть еще одна проблема, как динамично добавить эту строку кода ко всем событиям щелчка всех контроллеров.

Philippe Mori

Если вы недостаточно хорошо разбираетесь в обработке событий, вам не следует пытаться делать такие вещи в масштабах всего приложения. Нет особого смысла показывать название каждой кнопки в окне сообщения, так как это повлияет на удобство использования приложения.

Добавление этого ко всем формам или пользовательским элементам управления может иметь некоторый побочный эффект для вашего приложения и может быть немного сложнее, чем вы могли бы ожидать, так как вам может потребоваться убедиться, что вы также удалите обработчик в соответствующее время, а также могут быть некоторые кнопки, которые вы можете игнорировать, или некоторые другие элементы управления должны рассматриваться как кнопки (кнопки панели инструментов, возможно, гиперссылки...)

Anisuzzaman Sumon

https://support.microsoft.com/en-us/kb/318804

посмотрите, как отслеживать событие мыши

m.r.m.40

Спасибо.

Prateek Dalbehera

http://stackoverflow.com/questions/7497024/how-to-detect-mouse-clicks

m.r.m.40

Спасибо.

BillWoodruff

Если вы создаете приложение WinForm и хотите, чтобы какой-то поток обновлялся действиями пользователя в пользовательском интерфейсе, это не сработает.

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

m.r.m.40

Я прошу здесь идей,
Картина выглядит следующим образом,
Допустим, у меня уже есть разработанная программная система, включающая 20 подсистем, полностью включающая 1000 различных функциональных возможностей(1000 кнопок). теперь я буду следить за пользователем во время работы с этой программной системой.

Ralf Meier

Извиняюсь... Я не понимаю вашу "общую картину".
Не могли бы вы попытаться объяснить это с помощью скриншота ...?

m.r.m.40

Посмотрите, можете ли вы открыть или прочитать следующую ссылку на вопрос:
http://www.codeproject.com/Questions/1111581/Mouse-click-event-monitoring-How-to-save-the-mouse

Большое вам спасибо за помощь.

BillWoodruff

Начните путем делать некоторые исследования в GlobalHook; есть несколько статей на КП о том, как создать. Вы можете иметь приложение-объем глобального крюк, или Windows-ОС-объем глобального Хука.

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

Является ли ваше приложение приложением WinForm ?

m.r.m.40

Да, это приложение WinForm. извините, что я ответил Вам очень поздно.

1 Ответов

Рейтинг:
9

Ralf Meier

Если бы я хорошо понял, что вы имели в виду, вы могли бы (например) сделать это так :

Сначала вы создаете модуль, который имеет код для обработчика нажатия кнопки :

Module TestModul

    Public Sub ClickHandler(sender As Object, e As System.EventArgs)

        Dim mySender As Control = sender
        MessageBox.Show(mySender.Name + vbCrLf + mySender.Parent.Name)

    End Sub

End Module


Теперь на каждой из ваших форм вам нужно иметь следующий скрипт :
Protected Overrides Sub OnVisibleChanged(e As System.EventArgs)
    MyBase.OnVisibleChanged(e)

    If Me.Visible Then ' create Handler to each Button when Form is shown (becomes visible)
          For Each myControl As Control In Me.Controls
            If myControl.GetType Is GetType(Button) Then
                AddHandler myControl.Click, AddressOf TestModul.ClickHandler
            End If
        Next
    Else ' remove Handler from each Button when Form is left (becomes unvisible)
            For Each myControl As Control In Me.Controls
            If myControl.GetType Is GetType(Button) Then
                RemoveHandler myControl.Click, AddressOf TestModul.ClickHandler
            End If
        Next
    End If

End Sub


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

Обработчик-метод в TestModul будет делать то, что вы хотите...


m.r.m.40

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

Ralf Meier

В данный момент я не понимаю вашей проблемы. Пожалуйста, объясните подробнее ...
Кроме того, я не могу понять связь с этого момента с вашим другим вопросом (контроль в usercontrol) ...

m.r.m.40

Мне очень жаль, что это сработало должным образом,
Я протестировал его и внедрил в свои формы.
Что касается другого вопроса, то я дам больше объяснений по этому поводу.

Спасибо,

m.r.m.40

Этот код хорошо работает на формах, но для использования его в usercontrols он не работает. из-за разницы между формами и UserControls. Так что это считается хорошим ответом.
Спасибо,