2011-06-17 19 views
28

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

+0

JNA ([जावा मूल निवासी पहुंच] (http://jna.java.net/)) JNI से उपयोग करने के लिए आसान है, लेकिन दोनों में से किसी के लिए उन्हें, जेएनआई या जेएनए, आपको अध्ययन करना होगा कि उन्हें अपने ट्यूटोरियल और संदर्भों के माध्यम से कैसे उपयोग किया जाए और फिर आपको उचित फ़ंक्शन कॉल के लिए विंडो एपीआई देखना होगा। यहां कोई छोटा कटौती नहीं है। –

उत्तर

51

अपने आप को कुछ दर्द बचाएं और JNA का उपयोग करें। Win32 API के लिए आपको downloadjna.jar और jna-platform.jar की आवश्यकता होगी। 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); 
    } 
} 
+0

अच्छी तरह से प्रदर्शित - 1+ :) –

+0

महान काम करता है! बहुत बहुत धन्यवाद :) – James

+0

किसी अन्य प्रश्न से यहां पहुंचे, अच्छा नमूना, बहुत समय बचाता है। +1 – BigMike

5

इस कोड JNA 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); 
    } 
} 
+0

केवल खिड़कियों के लिए – Martin

संबंधित मुद्दे