java - जावा में सक्रिय विंडो जानकारी प्राप्त करना




jni jna (2)

यह कोड जेएनए 4.0 के साथ काम करता है

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;

// see http://java-native-access.github.io/jna/4.0/javadoc/

public class EnumerateWindows {
    private static final int MAX_TITLE_LENGTH = 1024;

    public static void main(String[] args) throws Exception {
        char[] buffer = new char[MAX_TITLE_LENGTH * 2];
        HWND hwnd = User32.INSTANCE.GetForegroundWindow();
        User32.INSTANCE.GetWindowText(hwnd, buffer, MAX_TITLE_LENGTH);
        System.out.println("Active window title: " + Native.toString(buffer));
        RECT rect = new RECT();
        User32.INSTANCE.GetWindowRect(hwnd, rect);
        System.out.println("rect = " + rect);
    }
 }

मैं जावा में अपने एप्लिकेशन को केवल तभी काम करने की कोशिश कर रहा हूं जब कुछ नाम के साथ प्रक्रिया की खिड़की सक्रिय हो। मुझे पता चला है कि जेएनआई का उपयोग करके यह संभव है, लेकिन मुझे नहीं पता कि यह वास्तव में कैसे करना है। मुझे बस कोई विवरण या उदाहरण नहीं मिला जो इसे समझाएगा। मेरा सवाल है - विंडोज़ में वर्तमान में सक्रिय विंडो का प्रक्रिया नाम कैसे प्राप्त करें (जेएनआई के माध्यम से, या कुछ और - मैं किसी अन्य समाधान को स्वीकार करता हूं)?


खुद को कुछ दर्द बचाओ और JNA प्रयोग करें। Win32 API के लिए आपको jna.jar और jna-platform.jar download करने की आवश्यकता होगी। pinvoke विकी और MSDN सही सिस्टम कॉल खोजने के लिए उपयोगी हैं।

वैसे भी, वर्तमान में सक्रिय विंडो के शीर्षक और प्रक्रिया को मुद्रित करने के लिए कोड है।

import static enumeration.EnumerateWindows.Kernel32.*;
import static enumeration.EnumerateWindows.Psapi.*;
import static enumeration.EnumerateWindows.User32DLL.*;
import com.sun.jna.Native;
import com.sun.jna.Pointer;
import com.sun.jna.platform.win32.WinDef.HWND;
import com.sun.jna.ptr.PointerByReference;

public class EnumerateWindows {
    private static final int MAX_TITLE_LENGTH = 1024;

    public static void main(String[] args) throws Exception {
        char[] buffer = new char[MAX_TITLE_LENGTH * 2];
        GetWindowTextW(GetForegroundWindow(), buffer, MAX_TITLE_LENGTH);
        System.out.println("Active window title: " + Native.toString(buffer));

        PointerByReference pointer = new PointerByReference();
        GetWindowThreadProcessId(GetForegroundWindow(), pointer);
        Pointer process = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, false, pointer.getValue());
        GetModuleBaseNameW(process, null, buffer, MAX_TITLE_LENGTH);
        System.out.println("Active window process: " + Native.toString(buffer));
    }

    static class Psapi {
        static { Native.register("psapi"); }
        public static native int GetModuleBaseNameW(Pointer hProcess, Pointer hmodule, char[] lpBaseName, int size);
    }

    static class Kernel32 {
        static { Native.register("kernel32"); }
        public static int PROCESS_QUERY_INFORMATION = 0x0400;
        public static int PROCESS_VM_READ = 0x0010;
        public static native int GetLastError();
        public static native Pointer OpenProcess(int dwDesiredAccess, boolean bInheritHandle, Pointer pointer);
    }

    static class User32DLL {
        static { Native.register("user32"); }
        public static native int GetWindowThreadProcessId(HWND hWnd, PointerByReference pref);
        public static native HWND GetForegroundWindow();
        public static native int GetWindowTextW(HWND hWnd, char[] lpString, int nMaxCount);
    }
}




jna