Con questo articolo mostrerò come gestire nativamente il mouse con Java utilizzando dei metodi nativi in C++ usando le api win32.
La prima cosa da fare è creare una classe Mouse che permetta di incapsulare le principali azioni da far fare ad un mouse:

----------------------------------
public abstract class Mouse {
static {
System.loadLibrary("Mouse");// carica la dll di nome Mouse
}
public final static int BUTTON_1 = 0;//bottone sinistro
public final static int BUTTON_2 = 1;//bottone al centro
public final static int BUTTON_3 = 2;//bottone destro

public static native void SetCursorPos(int x, int y);//metodo nativo per spostare il cursore
public static native void ClickPoint(int x, int y, int button);// metodo nativo per cliccare

}
------------------------------------

Fatto questo compiliamo la classe con

javac Mouse.java

e creiamo il file header per creare la dll

javah Mouse

Quindi otterremo un file chiamato Mouse.h che conterrà le direttive e le dichiarazioni di altri headers per far "insegnare" Java a C++ e permettere ai due di comunicare.

Ecco cosa contiene Mouse.h
------------------
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class Mouse */
#ifndef _Included_Mouse
#define _Included_Mouse
#ifdef __cplusplus
extern "C" {
#endif
#undef Mouse_BUTTON_1
#define Mouse_BUTTON_1 0L
#undef Mouse_BUTTON_2
#define Mouse_BUTTON_2 1L
#undef Mouse_BUTTON_3
#define Mouse_BUTTON_3 2L
/*
* Class:     Mouse
* Method:    SetCursorPos
* Signature: (II)V
*/
JNIEXPORT void JNICALL Java_Mouse_SetCursorPos
  (JNIEnv *, jclass, jint, jint);
/*
* Class:     Mouse
* Method:    ClickPoint
* Signature: (III)V
*/
JNIEXPORT void JNICALL Java_Mouse_ClickPoint
  (JNIEnv *, jclass, jint, jint, jint);
#ifdef __cplusplus
}
#endif
#endif
------------------

Il file jni.h viene fornito assieme alla jdk, questo file e il suo subordinato(jni_md.h)

Una volta generato Mouse.h creiamo Mouse.cpp e inseriamo l'implementazione dei due metodi, questa volta toccherà a noi scrivere il sorgente e non viene ovviamente generato prima:

--------------------
#include <windows.h>//per usare le APIwin32
#include "Mouse.h"//l'header prima generato

JNIEXPORT void JNICALL Java_Mouse_SetCursorPos(JNIEnv *env, jclass jc, jint x, jint y)
{
SetCursorPos(x, y);//api per spostare il mouse
}

//Funaione che clicca col mouse
JNIEXPORT void JNICALL Java_Mouse_ClickPoint(JNIEnv *env, jclass jc, jint x, jint y, jint button) {
    switch(button) {
       case Mouse_BUTTON_1:
                     mouse_event(MOUSEEVENTF_LEFTDOWN, x, y, 0, 0);
       mouse_event(MOUSEEVENTF_LEFTUP, x, y, 0, 0);
       break;
       case Mouse_BUTTON_2:
       mouse_event(MOUSEEVENTF_MIDDLEDOWN, x, y, 0, 0);
       mouse_event(MOUSEEVENTF_MIDDLEUP, x, y, 0, 0);
       break;
       case Mouse_BUTTON_3:
       mouse_event(MOUSEEVENTF_RIGHTDOWN, x, y, 0, 0);
       mouse_event(MOUSEEVENTF_RIGHTUP, x, y, 0, 0);
       break;
       }
}
--------------------

La funzione del cliccaggio è semplice: lo switch controlla se il bottone è il sinistro, centrale o destro e quindi scatena in successione l'evento di abbassare e alzare il bottone.

Per provare la classe Mouse e la sua dll nativa vi mostro una banale classe di utilizzo:

public class TestMouse {
public static void main(String args[]) {
Mouse.SetCursorPos(0, 0);
Mouse.ClickPoint(25, 25, Mouse.BUTTON_1);
}
}

Provate a modificare in modo da vedere cosa si può fare, questo esempio sposta su 00 il puntatore e su 25,25 fa un click e aprirà.
Visto che la compilazione dipende da OS, versione, jdk ecc... nella sezione programmi metterò il programma già funzionante pronto per essere provato.