在不活动的窗口中模拟击键

时间:2019-01-22 17:16:34

标签: winapi jna sendmessage directinput

我想在一个不活动的窗口中模拟“真实”按键。经过一番研究,我找到了Windows API。自从Im习惯Java之后,我迅速找到了实现winapi的JNA。 我编写了一些代码,可以使用sendInput()方法在活动窗口中模拟击键。该窗口未检测到虚拟键码。经过一些搜索后,具有直接输入的窗口显然需要扫描代码。它可以使用以下代码:

import com.sun.jna.platform.win32.BaseTSD;
import com.sun.jna.platform.win32.User32;
import com.sun.jna.platform.win32.WinDef;
import com.sun.jna.platform.win32.WinDef.HWND;
import com.sun.jna.platform.win32.WinUser;

int KEYEVENT_SCANCODE = 0x0008;
int KEYEVENT_UP = 0x0002;
WinUser.INPUT input = new WinUser.INPUT();

input.type = new WinDef.DWORD(WinUser.INPUT.INPUT_KEYBOARD);
input.input.setType("ki");
input.input.ki.wVk = new WinDef.WORD(0);// 0 cause scancodes are used
input.input.ki.time = new WinDef.DWORD(0);
input.input.ki.dwExtraInfo = new BaseTSD.ULONG_PTR(0);

input.input.ki.wScan = new WinDef.WORD(0x2C); // scancode for 'y'
input.input.ki.dwFlags = new WinDef.DWORD(KEYEVENT_SCANCODE); // keydown

User32.INSTANCE.SendInput(new WinDef.DWORD(1), (WinUser.INPUT[]) input.toArray(1), input.size());

input.input.ki.wScan = new WinDef.WORD(0x2C);
input.input.ki.dwFlags = new WinDef.DWORD(KEYEVENT_SCANCODE | KEYEVENT_UP); // keyup

User32.INSTANCE.SendInput(new WinDef.DWORD(1), (WinUser.INPUT[]) input.toArray(1), input.size());

现在,我希望它是“平滑的”,以便窗口可以在后台或最小化。我找到了SendMessage()PostMessage()方法,并以为我了解其概念。 您传递了一个窗口处理程序,消息(wm_keydownwm_keyup似乎对任务很有用)及其特定的参数。

我尝试了这个,但是没有用。 (与postMessage相同)。

User32.INSTANCE.SendMessage(handler, WinUser.WM_KEYDOWN, new   WinDef.WPARAM(0x5A), new WinDef.LPARAM(0x002C0001));
Thread.sleep(100); //tried with and without
User32.INSTANCE.SendMessage(handler, WinUser.WM_KEYUP, new WinDef.WPARAM(0x5A), new WinDef.LPARAM(0xC02C0001)); 

然后我尝试了WM_CHAR,但它部分起作用。它在窗口的聊天中有效,但没有触发热键。 人们说,经过一番研究后,您必须使用DirectInput Hook(?),因为某些窗口无法识别来自Winapi的消息,但是我的显然是通过sendInput和sendMessage使用WM_CHAR来完成的。

我传递了错误的参数吗?重新注册了wm_char是什么意思,但不是wm_keydown和wm_keyup是什么意思?

我已经找到了很多示例,有关放码流和网络的内容,但并没有真正的帮助。 感谢您的阅读和回答。

@update我使用了一种用于检测消息的工具。实际击键创建的消息与通过代码创建的消息相等:

在两种情况下,都有一个WM_keydown,然后是WM_char和WM_keyup。 每个消息的每个参数都是相等的。除此之外,就像我说的那样,如果打开聊天,则在关闭聊天时会写一些字符,但是不会执行任何操作。 我检查了,使用sendInput()方法发送了什么消息:它们与以上两种情况相同,但是会执行操作。 我无法解释这种行为。

0 个答案:

没有答案