Java 在windows 8上的JNA中列出windows标题

Java 在windows 8上的JNA中列出windows标题,java,windows-8,windows-7,jna,Java,Windows 8,Windows 7,Jna,我有以下界面: public interface User32 extends W32APIOptions { User32 instance = (User32) Native.loadLibrary("user32", User32.class, DEFAULT_OPTIONS); boolean EnumWindows(WNDENUMPROC lpEnumFunc, Pointer arg); void GetWindowText(int h,

我有以下界面:

public interface User32 extends W32APIOptions {

    User32 instance = (User32) Native.loadLibrary("user32", User32.class,
        DEFAULT_OPTIONS);

    boolean EnumWindows(WNDENUMPROC lpEnumFunc, Pointer arg);
    void GetWindowText(int h, StringBuilder s, int nMaxCount);

}
我正在尝试列出当前可见窗口的所有标题:

final User32 user32 = User32.instance;

user32.EnumWindows(new WNDENUMPROC() {
    @Override
    public boolean callback(HWND hWnd, Pointer data) {
        LOG.debug("callback {}", hWnd);
        byte[] windowText = new byte[512];
        user32.GetWindowTextA(hWnd, windowText, 512);
        String wText = Native.toString(windowText);
        LOG.debug("FOUND! {} {}", hWnd, wText);
        return true;
    }
}, null);
这段代码在Windows7ApacheV6.0、jre6上运行良好,我列出了所有的窗口

但同样的战争在Windows8ApacheV6.0和jre6上不起作用。我得到了一些奇怪的标题:WTtoolkit窗口、internel窗口、Wmi提供程序主机,。。。但从来没有我真正要找的窗户

知道为什么吗?怎么解决

-==编辑==-

可在此处找到:

所以我想我需要去低层的窗户。。但是怎么做呢

-==编辑==-

我试着更深入:

user32.EnumWindows(new MyWNDENUMPROC(0, 3), null);

public class MyWNDENUMPROC implements WNDENUMPROC {

    public int level = 0;

    public int maxLevel;

    public MyWNDENUMPROC(int level, int maxLevel) {
        this.level = level;
        this.maxLevel = maxLevel;
    }

    @Override
    public boolean callback(HWND hWnd, Pointer data) {

        if (maxLevel < level) { //Max level reached..
            return false;
        }
        // Enu les child windows:
        user32.EnumChildWindows(hWnd, new MyWNDENUMPROC(level + 1, maxLevel), null);

        byte[] windowText = new byte[512];
        user32.GetWindowTextA(hWnd, windowText, 512);
        String wText = Native.toString(windowText);
        if (wText != null && wText.length() > 0) {
            LOG.debug("level {} wText {}", level, wText);
        }
        return true;
    }

}

在Windows7中,它确实达到了deepesr级别,但在Windows8中,它保持为0级

您是否在与生成windows的应用程序相同的用户下运行服务器?是的,两者都是相同的用户,并且具有windows管理员角色。您看到了吗?还没有,谢谢。我正在尝试调用EnumChildWindows以查找所有级别的窗口。我会把我能做到的答案贴出来。@MajidL请贴一个答案
user32.EnumWindows(new MyWNDENUMPROC(0, 3), null);

public class MyWNDENUMPROC implements WNDENUMPROC {

    public int level = 0;

    public int maxLevel;

    public MyWNDENUMPROC(int level, int maxLevel) {
        this.level = level;
        this.maxLevel = maxLevel;
    }

    @Override
    public boolean callback(HWND hWnd, Pointer data) {

        if (maxLevel < level) { //Max level reached..
            return false;
        }
        // Enu les child windows:
        user32.EnumChildWindows(hWnd, new MyWNDENUMPROC(level + 1, maxLevel), null);

        byte[] windowText = new byte[512];
        user32.GetWindowTextA(hWnd, windowText, 512);
        String wText = Native.toString(windowText);
        if (wText != null && wText.length() > 0) {
            LOG.debug("level {} wText {}", level, wText);
        }
        return true;
    }

}