Захват событий мыши от каждого компонента

Я нашел отзыв о подсказке полезным, чтобы устранить эту проблему в Tomcat -

, обязательно загрузите драйвер, сначала выполнив Class.forName («org.postgresql.Driver»); в вашем коде.

Это из сообщения - https://www.postgresql.org/message-id/e13c14ec050510103846db6b0e@mail.gmail.com

Код jdbc работал нормально как автономная программа, но в TOMCAT он дал ошибку «Не найден подходящий драйвер»

30
задан Uwe Keim 10 December 2018 в 14:17
поделиться

3 ответа

Один простой способ сделать это - добавить фильтр цикла сообщений, вызвав Application.AddMessageFilter и написав класс, который реализует интерфейс IMessageFilter .

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

Одна сложность, которую представляет этот подход, заключается в том, чтобы иметь дело с сообщениями Windows через Сообщение Структура передана в ваш метод PreFilterMessage . Это означает обращение к документации Win32 на WM \ _LBUTTONDOWN, WM \ _MOUSEMOVE , WM \ _LBUTTONUP и т. Д.,

15
ответ дан 28 November 2019 в 00:23
поделиться

Прочтите статью . Он рекурсивно перехватывает все управляющие события и транслирует их. Вы также можете переопределить WndProc в своей форме.

3
ответ дан 28 November 2019 в 00:23
поделиться

Если вы не хотите обрабатывать сообщения путем переопределения Form.PreProcessMessage или Form.WndProc, тогда вы можете создать подкласс Form для привязки обработчика событий ко всем событиям MouseClick из различных элементов управления на форма.
РЕДАКТИРОВАТЬ: забыл выполнить рекурсию через дочерние элементы управления элементов управления в форме.

    public class MousePreviewForm : Form
    {
      protected override void OnClosed(EventArgs e)
      {
         UnhookControl(this as Control);
         base.OnClosed(e);
      }

      protected override void OnLoad(EventArgs e)
      {
         base.OnLoad(e);

         HookControl(this as Control);
      }

      private void HookControl(Control controlToHook)
      {
         controlToHook.MouseClick += AllControlsMouseClick;
         foreach (Control ctl in controlToHook.Controls)
         {
            HookControl(ctl);
         }      
      }

      private void UnhookControl(Control controlToUnhook)
      {
         controlToUnhook.MouseClick -= AllControlsMouseClick;
         foreach (Control ctl in controlToUnhook.Controls)
         {
            UnhookControl(ctl);
         }
      }

      void AllControlsMouseClick(object sender, MouseEventArgs e)
      {
         //do clever stuff here...
         throw new NotImplementedException();
      }
   }

В этом случае ваши формы должны быть производными от MousePreviewForm, а не от System.Windows.Forms.Form.

3
ответ дан 28 November 2019 в 00:23
поделиться
Другие вопросы по тегам:

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