Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/402.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么可以';t我的代码发送的字符如“t”@&引用;及~&引用;使用Java JNA连接到另一个窗口?_Java_Windows_Jna_Sendinput - Fatal编程技术网

为什么可以';t我的代码发送的字符如“t”@&引用;及~&引用;使用Java JNA连接到另一个窗口?

为什么可以';t我的代码发送的字符如“t”@&引用;及~&引用;使用Java JNA连接到另一个窗口?,java,windows,jna,sendinput,Java,Windows,Jna,Sendinput,我正在创建一个软件来存储密码,以便将其发送到令牌的登录窗口。问题是有些字符,如“@”和“~”无法发送 为了向您展示这个问题,我将目标窗口从令牌的登录窗口更改为记事本编辑器窗口。如果有人想运行下面的代码,将看到“x”字符被发送到记事本,而“@”则没有 import java.util.HashMap; 导入java.util.Map; 导入com.sun.jna.platform.win32.WinUser.WNDENUMPROC; 导入com.sun.jna.Pointer; 导入com.sun

我正在创建一个软件来存储密码,以便将其发送到令牌的登录窗口。问题是有些字符,如“@”和“~”无法发送

为了向您展示这个问题,我将目标窗口从令牌的登录窗口更改为记事本编辑器窗口。如果有人想运行下面的代码,将看到“x”字符被发送到记事本,而“@”则没有

import java.util.HashMap;
导入java.util.Map;
导入com.sun.jna.platform.win32.WinUser.WNDENUMPROC;
导入com.sun.jna.Pointer;
导入com.sun.jna.Native;
导入com.sun.jna.platform.win32.BaseTSD;
导入com.sun.jna.platform.win32.User32;
导入com.sun.jna.platform.win32.WinDef;
导入com.sun.jna.platform.win32.WinDef.HWND;
导入com.sun.jna.platform.win32.WinUser;
公共班机{
公共静态最终整数最大标题长度=1024;
公共静态void main(字符串[]args){
映射窗口=getWindows();
对于(Map.Entry窗口:windows.entrySet()){
if(window.getValue()包含(“记事本”)){
User32.INSTANCE.SetForegroundWindow(window.getKey());
试一试{
睡眠(500);
}捕捉(中断异常e){
e、 printStackTrace();
}
//准备输入参考
WinUser.INPUT=new WinUser.INPUT();
input.type=新的WinDef.DWORD(WinUser.input.input\u键盘);
input.input.setType(“ki”);//因为设置input_input_键盘是不够的:https://groups.google.com/d/msg/jna-users/NDBGwC1VZbU/cjYCQ1CjBwAJ
input.input.ki.wScan=新的WinDef.WORD(0);
input.input.ki.time=新WinDef.DWORD(0);
input.input.ki.dwExtraInfo=new BaseTSD.ULONG_PTR(0);
//按“@”(向下键)
input.input.ki.wVk=新的WinDef.WORD('@');//0x41
input.input.ki.dwFlags=new WinDef.DWORD(0);//keydown
User32.INSTANCE.SendInput(
新温德福(1),
(WinUser.INPUT[])INPUT.toArray(1),
input.size()
);
//释放“@”
input.input.ki.wVk=新的WinDef.WORD('@');//0x41
input.input.ki.dwFlags=new WinDef.DWORD(2);//keyup
User32.INSTANCE.SendInput(
新温德福(1),
(WinUser.INPUT[])INPUT.toArray(1),
input.size()
);
//按“x”
input.input.ki.wVk=新的WinDef.WORD('X');//0x41
input.input.ki.dwFlags=new WinDef.DWORD(0);//keydown
User32.INSTANCE.SendInput(
新温德福(1),
(WinUser.INPUT[])INPUT.toArray(1),
input.size()
);
//释放“x”
input.input.ki.wVk=新的WinDef.WORD('X');//0x41
input.input.ki.dwFlags=new WinDef.DWORD(2);//keyup
User32.INSTANCE.SendInput(
新温德福(1),
(WinUser.INPUT[])INPUT.toArray(1),
input.size()
);
}
} 
}               
公共静态映射getWindows(){
final Map=new HashMap();
User32.INSTANCE.EnumWindows(
新WNDENUMPROC(){
@凌驾
公共布尔回调(HWND HWND,指针arg1){
字符串wText=getWindowTitle(hWnd);
地图放置(hWnd,wText);
返回true;
}
},
无效的
);
返回图;
}
/**
*@param-hWnd
*@返回给定进程HWND的标题。
*/
公共静态字符串getWindowTitle(HWND HWND){
char[]buffer=新字符[MAX_TITLE_LENGTH*2];
GetWindowText(hWnd,缓冲区,最大标题长度);
返回Native.toString(缓冲区);
}
}
程序只是不将“@”字符发送到记事本,而是将“x”字符发送到记事本。
我应该怎么做才能发送“@”字符?

您似乎不是在发送字符,而是在发送按键。对于我的键盘,
@
字符是通过按
shift-2
获得的,谢谢,气垫船!你知道我怎样才能把字符发送到某个窗口而不是按键?
import java.util.HashMap;
import java.util.Map;

import com.sun.jna.platform.win32.WinUser.WNDENUMPROC;
import com.sun.jna.Pointer;
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.WinDef.HWND;
import com.sun.jna.platform.win32.WinUser;

public class Main {

    public static final int MAX_TITLE_LENGTH = 1024;

    public static void main(String[] args) {
        Map<HWND, String> windows = getWindows();
        for (Map.Entry<HWND,String> window : windows.entrySet()) {
            if (window.getValue().contains("Notepad")) {
                User32.INSTANCE.SetForegroundWindow( window.getKey() );
                try {
                    Thread.sleep(500);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

                // 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 "@" (keydown)
                input.input.ki.wVk = new WinDef.WORD( '@' ); // 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 "@"
                input.input.ki.wVk = new WinDef.WORD( '@' ); // 0x41
                input.input.ki.dwFlags = new WinDef.DWORD( 2 );  // keyup

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

                // Press "x"
                input.input.ki.wVk = new WinDef.WORD( 'X' ); // 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 "x"
                input.input.ki.wVk = new WinDef.WORD( 'X' ); // 0x41
                input.input.ki.dwFlags = new WinDef.DWORD( 2 );  // keyup

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

           }
        } 
    }               

    public static Map<HWND, String> getWindows() {
        final Map<HWND, String> map = new HashMap<HWND, String>();
        User32.INSTANCE.EnumWindows(
            new WNDENUMPROC() {
                @Override
                public boolean callback(HWND hWnd, Pointer arg1) {
                    String wText = getWindowTitle(hWnd);
                    map.put(hWnd, wText);
                    return true;
                }
            },
            null
        );
        return map;
    }

    /**
     * @param hWnd
     * @return Title of a given process HWND.
     */
    public static String getWindowTitle(HWND hWnd) {
        char[] buffer = new char[MAX_TITLE_LENGTH * 2];
        User32.INSTANCE.GetWindowText(hWnd, buffer, MAX_TITLE_LENGTH);
        return Native.toString(buffer);
    }
}