2012-02-15 3 views
4

Я пытаюсь имитировать щелчок мыши в окне с помощью JNA.Щелчок мышью с JNA

public class App { 

public static final int WM_LBUTTONUP = 514; 
public static final int WM_LBUTTONDOWN = 513; 
public static final int WM_LBUTTONDBLCLK = 0x203; 
static int WM_CLOSE = 0x10; 
final static String winTitle = "Untitled - Notepad"; 

public static void main(String[] args) throws InterruptedException { 
    User32Extra user32 = (User32Extra) Native.loadLibrary("user32", User32Extra.class, W32APIOptions.DEFAULT_OPTIONS); 

    WinDef.HWND hwnd = user32.FindWindow(null, winTitle); 
    user32.SetForegroundWindow(hwnd); 
    Thread.sleep(1000); 

    long y = 77 + (22 << 16);//x + (y << 16) 
    WinDef.LPARAM l = new WinDef.LPARAM(y); 
    WinDef.WPARAM w = new WinDef.WPARAM(0); 
    user32.PostMessage(hwnd, WM_LBUTTONDOWN, w, l); 
    Thread.sleep(1000); 
    user32.PostMessage(hwnd, WM_LBUTTONUP, w, l); 
} 
} 

Он находит окно и выводит его на передний план. но щелчок мышью не работает. Также выполняется отправка WM_CLOSE. Что не так с помощью мыши? Протестировано на калькулятор и блокнот. Координаты относительно окна.

+0

+1 ... Поиск позиции окна и вывод его на передний план не может быть выполнен в чистой Java (по крайней мере, если это окно принадлежит другому приложению), поэтому JNA здесь замечательная, но ... Щелчок мышью может с помощью Java Robot. Будет ли это вариантом для вас, чтобы вы использовали свою JNA, чтобы найти окно, а затем перенести его на передний план и затем использовать простой Java-робот для имитации щелчка? – TacticalCoder

+0

Робот перемещает реальный курсор, и это действительно раздражает. Также он требует, чтобы целевое окно не перекрывалось чем-то другим. Но с PostMessage это будет работать без перемещения курсора и даже если окно находится где-то в фоновом режиме. – NullPointer

+0

a) * «Робот перемещает реальный курсор, и это очень раздражает» * [sic] С помощью Robot вы можете: сохранить положение мыши, переместить мышь, щелкнуть, переместить мышь в прежнее место. Это так быстро, что пользователи даже не видят его (были там, сделали это;) b) * «он требует, чтобы целевое окно не перекрывалось чем-то другим» * [sic] Вы сказали, что приносите свое окно вперед? (в большинстве случаев, когда окно находится впереди, оно впереди ... Хотя я согласен, что в некоторых случаях все еще может быть что-то еще «впереди», но это должно быть более чем редко, нет !? – TacticalCoder

ответ

1

Просто дикое предположение: события кликов не должны доставляться в главное окно, а сами объекты кнопки назначения. На заданных координатах кнопка лежит над основным окном, «скрывая» его, когда происходит реальный щелчок.

+0

Да, вы абсолютно правы, я тестировал его на приложении, которое не основано на компонентах Windows: netbeans, firefox и работает нормально. Чтобы щелкнуть по кнопке в калькуляторе, нужно найти компонент кнопки и отправить сообщение прямо на него. – NullPointer

Смежные вопросы