# Frequently asked question

## How do I suppress specific events only?

Passing the `suppress=True` flag to listeners will suppress all events system-wide. If this is not what you want, you will have to employ different solutions for different backends.

If your backend of choice is not listed below, it does not support suppression of specific events.

### macOS

For macOS, pass the named argument `darwin_intercept` to the listener constructor. This argument should be a callable taking the arguments `(event_type, event)`, where `event_type` is any mouse related event type constant, and `event` is a CGEventRef. The `event` argument can be manipulated by the functions found on the Apple documentation.

If the interceptor function determines that the event should be suppressed, return `None`, otherwise return the `event`, which you may modify.

Here is a keyboard example:

    def darwin_intercept(event_type, event):
        import Quartz
        length, chars = Quartz.CGEventKeyboardGetUnicodeString(
            event, 100, None, None)
        if length > 0 and chars == 'x':
            # Suppress x
            return None
        elif length > 0 and chars == 'a':
            # Transform a to b
            Quartz.CGEventKeyboardSetUnicodeString(event, 1, 'b')
        else:
            return event

### Windows

For Windows, pass the argument named `win32_event_filter` to the listener constructor. This argument should be a callable taking the arguments `(msg, data)`, where `msg` is the current message, and `data` associated data as a MSLLHOOKSTRUCT or a KBDLLHOOKSTRUCT, depending on whether you are creating a mouse or keyboard listener.

If the filter function determines that the event should be suppressed, call `suppress_event` on the listener. If you return `False`, the event will be hidden from other listener callbacks.

Here is a keyboard example:

    # Values for MSLLHOOKSTRUCT.vkCode can be found here:
    # https://docs.microsoft.com/en-us/windows/win32/inputdev/virtual-key-codes
    def win32_event_filter(msg, data):
        if data.vkCode == 0x58:
            # Suppress x
            listener.suppress_event()

## When using a packager I get an `ImportError` on startup

This happens when using a packager, such as PyInstaller, to package your application.

The reason for the error is that the packager attempts to build a dependency tree of the modules used by inspecting `import` statements, and pynput finds the platform dependent backend modules at runtime using `importlib`.

To solve this problem, please consult the documentation of your tool to find how to explicitly add modules.

Which modules to add depends on your distribution platform. The backend modules are those starting with an underscore (`'_'`) in the `pynput.keyboard` and `pynput.mouse` packages. Additionally, you will need modules with corresponding names from the `pynput._util` package.