Java: используйте робота во время работы полноэкранного приложения

У меня проблема с классом Robot в Java: иногда он не работает, когда я запускаю полноэкранную игру. Вот мой код:

Toolkit tlkt = Toolkit.getDefaultToolkit();
Robot bot = new Robot();
while(true) {
    Thread.sleep(3000);
    tlkt.beep(); //make sure that program still runs
    bot.mousePress(MouseEvent.BUTTON1_DOWN_MASK);
    bot.mouseRelease(MouseEvent.BUTTON1_DOWN_MASK);
}

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

Я уже пытался переместить объявление робота в цикл, поэтому каждый раз создается новый робот, но безуспешно.

Пробовал в 5 разных играх, в 3 из них нормально работало даже в полноэкранном режиме, а в 2 не работало, а только пищало. Любая помощь?


person kajacx    schedule 23.05.2012    source источник


Ответы (1)


Предполагая, что вы находитесь на компьютере с Windows, вызовы java.awt.Robot перенаправляются на sun.awt.windows.WRobotPeer, который, в свою очередь, вызывает собственный код в awt_Robot.cpp. Вы можете проверить исходный код awt_Robot.cpp здесь: http://www.koders.com/cpp/fidFFE004659A9CAB3DA2B3302C457E624AF6F3EEDF.aspx?s=GetDIBits#L232

Здесь вы можете видеть, что события мыши реализованы с вызовом win32 mouse_event(...) (определено в winuser.h)

Таким образом, ваши вызовы щелчка мышью робота ограничены ограничениями mouse_event(...).

Затем небольшое гугление показывает, что в некоторых играх есть какой-то механизм защиты от макросов. Они игнорируют mouse_event(...) маршрутизируемые методы и общаются напрямую с драйвером. Hackshield, например, предоставляет такие механизмы защиты для ряда игр. Так что это причина, почему некоторые игры не получают щелчки мышью вашего робота.

person Hakan Serce    schedule 23.05.2012
comment
Хорошо, я думаю, было бы очень сложно установить драйвер мыши, который мог бы общаться с моей программой Java? - person kajacx; 24.05.2012
comment
Насколько я понимаю, Hackshield, например, устанавливает и использует свои собственные драйверы. - person Hakan Serce; 24.05.2012
comment
Хорошо, давайте попробуем это: скажем, я хочу, чтобы воображаемая мышь управлялась java-программой, но она вела бы себя как абсолютно обычная мышь, такая как сенсорная панель или реальная мышь. Если бы я нажал Панель управления -> устройства -> мыши, я бы увидел его здесь среди других устройств мыши. Это возможно? - person kajacx; 24.05.2012
comment
Я не уверен, вам нужно проверить это. А пока не могли бы вы проверить папки установки игры на наличие папки с именем HShield. Если вы можете найти это, то мы на правильном пути. - person Hakan Serce; 24.05.2012