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;
}
}