java - 使用 JNA 和 EnumWindows 的问题

标签 java jna

我正在试验 JNA,这是我尝试运行的第一个程序。我从引用资料中复制了它,但是,当我运行它时,他发现了 412 个窗口……而且我很确定我现在没有打开那么多窗口 :) 请有人向我解释程序的行为吗?

import com.sun.jna.Pointer;
import com.sun.jna.win32.StdCallLibrary.StdCallCallback;
import com.sun.jna.Native;
import com.sun.jna.win32.StdCallLibrary;

public class Main {
// Equivalent JNA mappings
    public interface User32 extends StdCallLibrary {
        User32 INSTANCE = (User32) Native.loadLibrary("user32", User32.class);

        interface WNDENUMPROC extends StdCallCallback {
            boolean callback(Pointer hWnd, Pointer arg);
        }

        boolean EnumWindows(WNDENUMPROC lpEnumFunc, Pointer arg);
    }

    public static void main(String[] args) {
        User32 user32 = User32.INSTANCE;

        user32.EnumWindows(new User32.WNDENUMPROC() {
            int count;
            public boolean callback(Pointer hWnd, Pointer userData) {
                System.out.println("Found window " + hWnd + ", total " + ++count);
                return true;
            }
        }, null);
    }
}

最佳答案

在 Windows 中,几乎一切都是窗口。以下是您的代码的一些更改,将显示一些窗口标题/文本:

import com.sun.jna.Pointer;
import com.sun.jna.Native;
import com.sun.jna.win32.StdCallLibrary;

public class JNA_Main {
    // Equivalent JNA mappings
    public interface User32 extends StdCallLibrary {
        User32 INSTANCE = (User32) Native.loadLibrary("user32", User32.class);

        interface WNDENUMPROC extends StdCallCallback {
            boolean callback(Pointer hWnd, Pointer arg);
        }

        boolean EnumWindows(WNDENUMPROC lpEnumFunc, Pointer arg);

        int GetWindowTextA(Pointer hWnd, byte[] lpString, int nMaxCount);
    }

    public static void main(String[] args) {
        final User32 user32 = User32.INSTANCE;

        user32.EnumWindows(new User32.WNDENUMPROC() {

            int count;

            public boolean callback(Pointer hWnd, Pointer userData) {
                byte[] windowText = new byte[512];
                user32.GetWindowTextA(hWnd, windowText, 512);
                String wText = Native.toString(windowText);
                wText = (wText.isEmpty()) ? "" : "; text: " + wText;
                System.out.println("Found window " + hWnd + ", total " + ++count + wText);
                return true;
            }
        }, null);
    }
}

有什么不明白的请追问。

关于java - 使用 JNA 和 EnumWindows 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4478624/

相关文章:

java - [++]*+ 在正则表达式中代表什么

java - 在 Java 应用程序中混合运行 32 位和 64 位 native 库

java - Servlet文件上传

java - 如何在 itext PdfPTable 中动态添加一行?

java - Android是否可以创建HWND

java - GCC/LD 链接 JNA 无法识别的损坏符号

java - JNA 调用 C 函数

java - 使用 JNA 和 Ada 的 Interface.C 包将 Ada 动态库与 Java 接口(interface)

java - 我可以在主方法或任何方法中添加 ActionListener() 吗?

java - 如何在 Android 内部存储 Hashmap 等数据结构?