Skip to content

Instantly share code, notes, and snippets.

@gormih
Created March 21, 2025 06:41
Show Gist options
  • Save gormih/21716f1eda19a73521119647f783d187 to your computer and use it in GitHub Desktop.
Save gormih/21716f1eda19a73521119647f783d187 to your computer and use it in GitHub Desktop.

Ниже представлен пример экспериментального плагина для IntelliJ Platform (PyCharm базируется на ней), который пытается блокировать обработку событий мыши путём регистрации AWTEventListener. Следует отметить, что такой подход является довольно хрупким: блокировка событий мыши может привести к нестабильной работе некоторых компонентов IDE, и полное отключение мыши не гарантируется. Данный плагин следует использовать исключительно в тестовых или экспериментальных целях.


Структура плагина

Плагин состоит из:

  1. Файла манифеста plugin.xml.
  2. Класса-слушателя MouseBlocker, реализующего AWTEventListener для перехвата и потребления событий мыши.
  3. Класса MouseBlockerStartupActivity, который регистрирует слушатель на этапе старта IDE.

Файл plugin.xml

<idea-plugin>
    <id>com.example.mouseblocker</id>
    <name>MouseBlocker</name>
    <version>1.0</version>
    <vendor email="[email protected]" url="https://example.com">Example Inc.</vendor>
    <description>Плагин для блокировки взаимодействия с мышью в PyCharm.</description>

    <extensions defaultExtensionNs="com.intellij">
        <!-- Регистрация активности, выполняемой при запуске проекта -->
        <startupActivity implementation="com.example.mouseblocker.MouseBlockerStartupActivity"/>
    </extensions>
</idea-plugin>

Класс MouseBlocker.java

package com.example.mouseblocker;

import java.awt.AWTEvent;
import java.awt.event.AWTEventListener;
import java.awt.event.MouseEvent;
import com.intellij.openapi.diagnostic.Logger;

/**
 * Класс MouseBlocker реализует AWTEventListener для перехвата и блокировки событий мыши.
 */
public class MouseBlocker implements AWTEventListener {
    private static final Logger LOG = Logger.getInstance(MouseBlocker.class);

    @Override
    public void eventDispatched(AWTEvent event) {
        // Проверяем, является ли событие мыши
        if (event instanceof MouseEvent) {
            MouseEvent mouseEvent = (MouseEvent) event;
            // Логируем заблокированное событие для отладки
            LOG.info("Блокировка события мыши: " + mouseEvent.toString());
            // Пытаемся потребить событие, чтобы предотвратить дальнейшую обработку
            mouseEvent.consume();
        }
    }
}

Класс MouseBlockerStartupActivity.java

package com.example.mouseblocker;

import com.intellij.openapi.project.Project;
import com.intellij.openapi.startup.StartupActivity;
import com.intellij.openapi.diagnostic.Logger;
import java.awt.Toolkit;
import java.awt.AWTEvent;

/**
 * Класс MouseBlockerStartupActivity регистрирует MouseBlocker при запуске проекта.
 */
public class MouseBlockerStartupActivity implements StartupActivity {
    private static final Logger LOG = Logger.getInstance(MouseBlockerStartupActivity.class);

    @Override
    public void runActivity(Project project) {
        // Регистрируем AWTEventListener для обработки событий мыши и движения мыши
        Toolkit.getDefaultToolkit().addAWTEventListener(
                new MouseBlocker(),
                AWTEvent.MOUSE_EVENT_MASK | AWTEvent.MOUSE_MOTION_EVENT_MASK
        );
        LOG.info("Слушатель событий мыши (MouseBlocker) зарегистрирован.");
    }
}

Важные замечания

  • Ограниченность метода:
    Перехват событий мыши через AWTEventListener может не охватить все случаи — некоторые компоненты IDE могут обрабатывать события на более низком уровне или работать вне механизма AWT.

  • Побочные эффекты:
    Блокировка мыши может привести к неожиданному поведению, например, отсутствие возможности взаимодействия с меню, диалоговыми окнами и другими элементами интерфейса. Рекомендуется тестировать плагин в изолированной среде.

  • Логирование:
    Логирование событий поможет в диагностике работы плагина. При разработке рекомендуется внимательно отслеживать вывод логов для обнаружения конфликтов или сбоев.

  • Экспериментальный характер:
    Данный плагин создан в ознакомительных целях. Если требуется более тонкая настройка, можно доработать логику для селективного блокирования определённых событий или предусмотреть возможность динамического включения/выключения функционала.


Этот пример демонстрирует базовый подход к созданию плагина, который пытается блокировать взаимодействие с мышью в PyCharm. Однако из-за сложности интегрированной среды разработки и множества компонентов, зависящих от событий мыши, данный метод не является полностью надёжным для полного отключения мыши в IDE.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment