Невозможно прочитать содержимое из открытой командной строки с использованием Java Native Access - PullRequest
0 голосов
/ 20 сентября 2019

Я хочу прочитать текст, содержащий командную строку. Допустим, я открыл командную строку, затем выполнил команду dir, а затем команду pwd.Таким образом, проблема заключается в том, что, что бы ни присутствовало в командной строке, я должен иметь возможность прочитать их.Я пытаюсь использовать библиотеку Java Native Access для достижения этой цели, но мне не повезло.Я пробовал следующий код.Но я не получаю никакого вывода.

import com.sun.jna.Native;
import com.sun.jna.platform.win32.User32;
import com.sun.jna.platform.win32.WinDef.HWND;
import com.sun.jna.platform.win32.WinDef.RECT;
import com.sun.jna.platform.win32.WinUser.WNDENUMPROC;
import com.sun.jna.Native;
import com.sun.jna.Pointer;
import com.sun.jna.platform.win32.WinDef.HWND;
import com.sun.jna.platform.win32.WinDef.LRESULT;
import com.sun.jna.platform.win32.WinUser;
import com.sun.jna.win32.StdCallLibrary;
import com.sun.jna.platform.win32.WinDef.LPARAM;
import com.sun.jna.platform.win32.WinDef.WPARAM;


public class NativeExtractor {

    public static void main(String ar[]) throws InterruptedException {
        System.out.println(System.getProperty("sun.arch.data.model"));
        executeNativeCommands();
    }

    public static void executeNativeCommands(){
        User32 user32 = User32.INSTANCE;
        //HWND notePadHwnd = user32.FindWindowA("Notepad",null  );
        HWND consoleHwnd = user32.FindWindowA("ConsoleWindowClass",null  );
        HWND editHwnd = user32.FindWindowExA(consoleHwnd, null, null, null);
        byte[] lParamStr = new byte[512];
        LRESULT resultBool = user32.SendMessageA(editHwnd, User32.WM_GETTEXT, 512, lParamStr);

        System.out.println("The content of the file is : " + Native.toString(lParamStr));
    }
    interface User32 extends StdCallLibrary {
        User32 INSTANCE = (User32) Native.loadLibrary("user32", User32.class);
        int WM_SETTEXT = 0x000c;
        int WM_GETTEXT = 0x000D;
        int GetWindowTextA(HWND hWnd, byte[] lpString, int nMaxCount);
        boolean EnumWindows(WinUser.WNDENUMPROC lpEnumFunc, Pointer arg);
        HWND FindWindowA(String lpClassName, String lpWindowName);
        HWND FindWindowExA(HWND hwndParent, HWND hwndChildAfter, String lpClassName, String lpWindowName);
        LRESULT SendMessageA(HWND paramHWND, int paramInt, WPARAM paramWPARAM, LPARAM paramLPARAM);
        LRESULT SendMessageA(HWND editHwnd, int wmGettext, long l, byte[] lParamStr);
        int GetClassNameA(HWND hWnd, byte[] lpString, int maxCount);

        void EnumChildWindows(HWND hwnd, WNDENUMPROC microsoft_word_document, Object o);
    }
}

Тем не менее, я могу прочитать текст блокнота, используя ниже.Но все не работает для командной строки.Пожалуйста, помогите мне в решении этой проблемы.

public static void executeNativeCommands(){
        User32 user32 = User32.INSTANCE;
        HWND notePadHwnd = user32.FindWindowA("Notepad",null  );
        HWND editHwnd = user32.FindWindowExA(notePadHwnd, null, null, null);
        byte[] lParamStr = new byte[512];
        LRESULT resultBool = user32.SendMessageA(editHwnd, User32.WM_GETTEXT, 512, lParamStr);

        System.out.println("The content of the file is : " + Native.toString(lParamStr));
    }
...