A package that provides a friendly Dart API for accessing gamepads connected to a Windows machine.

This package builds on top of the Dart win32 package, offering a high-level Dart wrapper that avoids the need for users to understand FFI or write directly to the Win32 API.

Part of the Dart | Windows suite of Windows packages.

Package: win32_gamepad Publisher: win32.pub Language: Dart License: BSD-3-Clause


Having imported the package, you can get a Gamepad object as follows:

final gamepad = Gamepad(0); // primary controller

Windows allows up to four gamepads to be connected at once. You can poll the gamepad for status by calling updateState() and then inspecting the state object during a game loop; this contains values for the various buttons, triggers and thumbsticks.

You can also trigger vibrations with the vibrate method, which activates one of the two rumble motors on a typical gamepad.


A simple example of using the gamepad:

import 'dart:io';

import 'package:win32_gamepad/win32_gamepad.dart';

void main() {
  for (var idx = 0; idx < 4; idx++) {
    final gamepad = Gamepad(idx);
    final connectionStatus =
        gamepad.state.isConnected ? 'connected' : 'disconnected';
    print('Gamepad $idx is $connectionStatus.');

  print('Testing first gamepad.');
  final gamepad = Gamepad(0);
  if (gamepad.isConnected) {
    final GamepadBatteryInfo(:batteryLevel, :batteryType) =
    print('Battery type is ${batteryType.name}.');
    print('Battery level is ${batteryLevel.name}.');

    print('Vibrating left motor (half intensity).');
    gamepad.vibrate(leftMotorSpeed: 32767);
    sleep(const Duration(milliseconds: 1000));

    print('Vibrating right motor (half intensity).');
    gamepad.vibrate(rightMotorSpeed: 32767);
    sleep(const Duration(milliseconds: 1000));

    print('Vibrating both motors (full intensity).');
    gamepad.vibrate(leftMotorSpeed: 65535, rightMotorSpeed: 65535);
    sleep(const Duration(milliseconds: 1000));

    print('Turning off vibration.');
    gamepad.vibrate(leftMotorSpeed: 0, rightMotorSpeed: 0);

Alternatively, a more sophisticated example is available in the example\inspector\ directory in the form of a Flutter app that shows how you can use this to monitor the status of buttons in a simple game loop:


Feature requests and bugs

Please file feature requests and bugs at the issue tracker.


A Dart library that provides a friendly Dart API for accessing gamepads connected to a Windows machine.