как следует из заголовка: есть ли способ отправить смоделированные нажатия клавиш в неактивное окно с помощью JNA (потому что Java - мой самый сильный язык)? Конечно, когда есть альтернативный язык, который может достичь этой цели, я бы пошел на это.
Я много читаю в Интернете, кроме JNA, но безуспешно для этой цели.
Прямо сейчас я могу имитировать нажатия клавиш с помощью sendInput () с JNA, но это не то, что нужно, потому что это влияет на активное окно.
Вы можете прочитать об этом здесь: https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-sendinput
Насколько я понимаю, вы можете использовать sendMessage () для этой темы, но я не могу заставить его работать.
https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-sendmessage
LRESULT SendMessage (
HWND hWnd,
UINT Msg,
WPARAM wParam,
LPARAM lParam
);
Есть также SendMessageA и SendMessageW. Некоторые говорят, что SendMessage слишком стар для некоторых ОС, но я не могу это проверить.
Давайте возьмем Блокнот в качестве примера.
Название окна «новый 2 - Блокнот ++»
Keydown: https://docs.microsoft.com/en-us/windows/desktop/inputdev/wm-keydown
Keyup: https://docs.microsoft.com/en-us/windows/desktop/inputdev/wm-keyup
import com.sun.jna.Native;
import com.sun.jna.platform.win32.WinDef;
import com.sun.jna.platform.win32.WinDef.HWND;
import com.sun.jna.platform.win32.WinDef.LPARAM;
import com.sun.jna.platform.win32.WinDef.WPARAM;
import com.sun.jna.win32.StdCallLibrary;
import com.sun.jna.win32.W32APIOptions;
public interface User32 extends StdCallLibrary {
User32 INSTANCE = (User32) Native.loadLibrary("user32", User32.class, W32APIOptions.DEFAULT_OPTIONS);
LRESULT SendMessage(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam);
}
public void winAPI() throws InterruptedException {
HWND handler = User32.INSTANCE.FindWindow(null, "new 2 - Notepad++");
// 0x0100 WM_KEYDOWN
User32.INSTANCE.SendMessage(handler, 0x0100, new WinDef.WPARAM(0x31), new WinDef.LPARAM(0)}
// recommended for dedection
Thread.sleep(200);
// 0x0101 WM_KEYUP
User32.INSTANCE.SendMessage(handler, 0x0101, new WinDef.WPARAM(0x31), new WinDef.LPARAM(0)}
}
Я борюсь с правильной реализацией SendMessage (A?) (W?) (), Поскольку она не реализована в JNA.
Кроме того, как вы создаете WPARAM и LPARAM?
MSDN говорит, что есть конкретные сообщения.
Поэтому, когда передаете WM_KEYDOWN или WM_KEYUP в качестве параметра сообщения:
WPARAM - это виртуальный ключевой код: просто int?
LPARAM - это байтовый массив (?).
Полагаю, это не работает из-за неправильных типов данных параметров WPARAM и LPARAM.