使用Java JNA和SendInput()发送键盘输入

3

我对使用Java与操作系统(在这种情况下是Windows 7)进行交互并想要在低级别上模拟一些按键操作(例如CTRL + V)感兴趣。

首先,我知道Java不是最好的选择,但它是我最熟悉的编程语言,而且我知道这是可能的。此外,我知道awt.robot存在,但对我来说它太高级了(我真的需要驱动程序级别)。

我提出这个问题是因为我真的想了解jna,在看了20个代码示例后仍然存在问题。

一个使用sendInput()实现按键操作的代码示例会对我有很大帮助。

非常感谢。

问候 Ext1nct1on


请提供您已经尝试过的代码示例。此外,当您说您仍然遇到问题时,是指哪些具体问题? - undefined
1个回答

8

如果有人仍然在使用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 );
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接