Общий обработчик для всех правых кликов - PullRequest
3 голосов
/ 15 июля 2010

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

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

1 Ответ

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

Вы можете попробовать реализовать интерфейс IMessageFilter в своей форме.Есть несколько других обсуждений и документации по этому вопросу.Одно из возможных решений для вас может выглядеть следующим образом (создайте форму, поместите на нее кнопку, добавьте необходимый код снизу, запустите ее и попробуйте щелкнуть правой кнопкой мыши форму и кнопку):

using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;

namespace WindowsApplication1
{
   public partial class Form1 : Form, IMessageFilter
   {
      private const int WM_RBUTTONUP = 0x0205;

      [DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]
      public static extern IntPtr GetCapture();

      public Form1()
      {
         InitializeComponent();
         Application.AddMessageFilter(this);
      }

      public bool PreFilterMessage(ref Message m)
      {
         if (m.Msg == WM_RBUTTONUP)
         {
            System.Diagnostics.Debug.WriteLine("pre wm_rbuttonup");

            // Get a handle to the control that has "captured the mouse".  This works
            // in my simple test.  You can read the documentation and do more research
            // on it if you'd like:
            // http://msdn.microsoft.com/en-us/library/ms646257(v=VS.85).aspx
            IntPtr ptr = GetCapture();
            System.Diagnostics.Debug.WriteLine(ptr.ToString());

            Control control = System.Windows.Forms.Control.FromChildHandle(ptr);
            System.Diagnostics.Debug.WriteLine(control.Name);

            // Return true if you want to stop the message from going any further.
            //return true;
         }

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