我有兴趣在这种情况下使用java与Windows进行交互操作,并希望在较低级别上模拟一些击键(例如CTRL + V)。
首先,我知道java是一个糟糕的选择,但它是我最好的编程语言,我知道它可能。 另外我知道awt.robot存在,但它对我来说太高了(我真的需要驱动程序级别)。
我问这个问题是因为我真的想了解jna,看了20个代码示例之后我还有问题。
sendInput()完成击键的代码示例对我有用。
非常感谢。
问候Ext1nct1on
答案 0 :(得分:4)
如果有人仍然有JNA SendInput问题,请看这个例子:
import com.sun.jna.Native;
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.WinUser;
/**
* Created by Vellotis on 2.02.2016.
*/
public class User32Test
{
public static void main( String[] args )
{
// Loop all windows
User32.INSTANCE.EnumWindows(( hWnd, data ) -> {
char[] name = new char[512];
User32.INSTANCE.GetWindowText( hWnd, name, name.length );
// Find window with title starting with downcase "keyb" string
if ( Native.toString( name ).toLowerCase().startsWith( "keyb" ) )
{
// Bring the window to the front
User32.INSTANCE.SetForegroundWindow( hWnd );
// Prepare input reference
WinUser.INPUT input = new WinUser.INPUT( );
input.type = new WinDef.DWORD( WinUser.INPUT.INPUT_KEYBOARD );
input.input.setType("ki"); // Because setting INPUT_INPUT_KEYBOARD is not enough: https://groups.google.com/d/msg/jna-users/NDBGwC1VZbU/cjYCQ1CjBwAJ
input.input.ki.wScan = new WinDef.WORD( 0 );
input.input.ki.time = new WinDef.DWORD( 0 );
input.input.ki.dwExtraInfo = new BaseTSD.ULONG_PTR( 0 );
// Press "a"
input.input.ki.wVk = new WinDef.WORD( 'A' ); // 0x41
input.input.ki.dwFlags = new WinDef.DWORD( 0 ); // keydown
User32.INSTANCE.SendInput( new WinDef.DWORD( 1 ), ( WinUser.INPUT[] ) input.toArray( 1 ), input.size() );
// Release "a"
input.input.ki.wVk = new WinDef.WORD( 'A' ); // 0x41
input.input.ki.dwFlags = new WinDef.DWORD( 2 ); // keyup
User32.INSTANCE.SendInput( new WinDef.DWORD( 1 ), ( WinUser.INPUT[] ) input.toArray( 1 ), input.size() );
return false; // Found
}
return true; // Keep searching
}, null );
}
}