[英]Sending Keystrokes to Hidden Window via JNA
背景:
我將擊鍵發送到隱藏的程序(“文本編輯器”),然后發送F7鍵,然后發送四個文本鍵(一種密碼)。 我正在使用JNA庫和Win32API的SendMessage函數發送消息,不能使用sendInput(),因為我需要發送到特定的窗口句柄。
碼:
private static void sendInputToWindow(WinDef.HWND editorWindowHandle, char[] password) throws InterruptedException {
User32.INSTANCE.ShowWindow(editorWindowHandle, WinUser.SW_HIDE);
User32.INSTANCE.SetForegroundWindow(editorWindowHandle);
User32.INSTANCE.SetFocus(editorWindowHandle);
//F7 KEY SENT
WinDef.WPARAM wparam = new WinDef.WPARAM(F7_VIRTUAL_KEY);
WinDef.LPARAM lparam = new WinDef.LPARAM(0);
log.debug("SENDING F7");
User32.INSTANCE.SendMessage(editorWindowHandle, WinUser.WM_KEYDOWN, wparam, lparam);
Thread.sleep(1000);
log.debug("SENDING PASSWORD");
// PASSWORD SENT
User32.INSTANCE.SendMessage(editorWindowHandle, WinUser.WM_CHAR, new WinDef.WPARAM(password[0]), lparam);
User32.INSTANCE.SendMessage(editorWindowHandle, WinUser.WM_CHAR, new WinDef.WPARAM(password[1]), lparam);
User32.INSTANCE.SendMessage(editorWindowHandle, WinUser.WM_CHAR, new WinDef.WPARAM(password[2]), lparam);
User32.INSTANCE.SendMessage(editorWindowHandle, WinUser.WM_CHAR, new WinDef.WPARAM(password[3]), lparam);
Thread.sleep(500);
log.debug("SENDING ENTER");
// ENTER KEY SENT
User32.INSTANCE.SendMessage(editorWindowHandle, WinUser.WM_KEYDOWN, new WinDef.WPARAM(ENTER_KEY), lparam);
}
問題:
當我通過SendMessage發送擊鍵時,過了一段時間或隨機發送(我不知道是什么引起了這里的問題),但是有時它根本不發送擊鍵!
因此,這是一個命中注定的情況,大多數情況下,它發送擊鍵,而其他時候則不。 我想知道是否有更好的方法將擊鍵發送到隱藏的窗口? 或者如果我在這里做錯了。
謝謝。
如評論所述, SendInput
是最受支持的。
我嘗試在Win32
控制台中使用它,並發現它工作得很好。 代碼如下。
#include <iostream>
#include <Windows.h>
int main()
{
INPUT input[5];
memset(input, 0, sizeof(input));
input[0].type = input[1].type = input[2].type = input[3].type = input[4].type = INPUT_KEYBOARD;
SetForegroundWindow((HWND)0x000A09D8);//EDIT EDITOR HANDLE
while (1)
{
input[0].ki.wVk = '1';
input[1].ki.wVk = '2';
input[2].ki.wVk = '3';
input[3].ki.wVk = '4';
input[4].ki.wVk = VK_RETURN;
SendInput(5, input, sizeof(INPUT));
std::cout << GetLastError() << std::endl;
Sleep(1000);
input[0].ki.dwFlags = input[1].ki.dwFlags = input[2].ki.dwFlags = input[3].ki.dwFlags = input[4].ki.dwFlags = KEYEVENTF_KEYUP;
SendInput(5, input, sizeof(INPUT));
input[0].ki.dwFlags = input[1].ki.dwFlags = input[2].ki.dwFlags = input[3].ki.dwFlags = input[4].ki.dwFlags = 0;
std::cout << GetLastError() << std::endl;
Sleep(1000);
}
return 0;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.