2011-04-23 4 views
10

मैंने पिछले धागे पर एक समान प्रश्न पूछा (https://stackoverflow.com/questions/5206633/java-find-out-what-application-window-is-in-focus) लेकिन मुझे जेएनआई का उपयोग करने के लिए निर्देशित किया गया था, और मुझे इसके साथ बहुत सफलता नहीं मिली है ... मैंने कुछ ट्यूटोरियल पढ़े हैं और कुछ ठीक काम करते हैं, अन्य लोग नहीं करते हैं मुझे अभी भी जानकारी की आवश्यकता नहीं है, जो अग्रभूमि पर खिड़की का शीर्षक है।GetForegroundWindow() प्राप्त करने के लिए जेएनए का उपयोग करना;

अब मैं जेएनए में देख रहा हूं लेकिन मुझे यह पता नहीं लगा सकता कि GetForegroundWindow() ... I लगता है एक बार मैं इस कोड का उपयोग करने के लिए खिड़की संभाल पाने मैं पाठ मुद्रित कर सकते हैं (एक और धागा पर पाया):?!

import com.sun.jna.*; 
import com.sun.jna.win32.*; 

public class jnatest { 
    public interface User32 extends StdCallLibrary { 
     User32 INSTANCE = (User32) Native.loadLibrary("user32", User32.class); 

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

    public static void main(){ 
     byte[] windowText = new byte[512]; 

     PointerType hwnd = //GetForegroundWindow() (?)... 
     User32.INSTANCE.GetWindowTextA(hwnd, windowText, 512); 
     System.out.println(Native.toString(windowText)); 

    } 
} 

कोई सुझाव धन्यवाद

उत्तर

10

बस एक विधि कॉल अपने इंटरफेस के मूल निवासी GetForegroundWindow मिलान करने के लिए है, इसलिए की तरह कुछ जोड़ने के बारे में कैसे:

import com.sun.jna.*; 
import com.sun.jna.platform.win32.WinDef.HWND; 
import com.sun.jna.win32.*; 

public class JnaTest { 
    public interface User32 extends StdCallLibrary { 
     User32 INSTANCE = (User32) Native.loadLibrary("user32", User32.class); 
     HWND GetForegroundWindow(); // add this 
     int GetWindowTextA(PointerType hWnd, byte[] lpString, int nMaxCount); 
    } 

    public static void main(String[] args) throws InterruptedException { 
     byte[] windowText = new byte[512]; 

     PointerType hwnd = User32.INSTANCE.GetForegroundWindow(); // then you can call it! 
     User32.INSTANCE.GetWindowTextA(hwnd, windowText, 512); 
     System.out.println(Native.toString(windowText)); 
    } 
} 
+0

त्वरित उत्तर के लिए धन्यवाद! मैं उस कोड को संकलित नहीं कर सकता, किसी कारण से, मैं com.sun.jna.platform.win32.WinDef.HWND आयात नहीं कर सकता; और एचडब्ल्यूएनडी GetForegroundWindow(); अमान्य लगता है। स्वाभाविक रूप से, मुझे इसे कॉल करने का प्रयास करने में त्रुटि भी मिलती है। क्या मुझे कुछ याद आ रहा है? –

+0

@ डैनियल: आपका स्वागत है। काम किया? –

+0

@ होवरक्राफ्ट फुल ऑफ़ ईल्स नहीं, मैंने दुर्घटना से जवाब बहुत जल्दी जमा कर दिया। अब यह पूरा जवाब है: पी –

6

तो विंडो शीर्षक हो रही सब आप क्या करना चाहते है, तो आप स्पष्ट रूप से लोड करने के लिए की जरूरत नहीं है user32 पुस्तकालय। जेएनए platform.jar फ़ाइल में कम से कम v3.4 में इसके साथ आता है)।

import com.sun.jna.Native; 
import com.sun.jna.platform.win32.WinDef.HWND; 
import com.sun.jna.platform.win32.User32; 

public class JnaApp { 

    public static void main(String[] args) { 
     System.out.println("title is " + getActiveWindowTitle()); 
    } 

    private static String getActiveWindowTitle() { 
     HWND fgWindow = User32.INSTANCE.GetForegroundWindow(); 
     int titleLength = User32.INSTANCE.GetWindowTextLength(fgWindow) + 1; 
     char[] title = new char[titleLength]; 
     User32.INSTANCE.GetWindowText(fgWindow, title, titleLength); 
     return Native.toString(title); 
    } 

} 

User32's Javadoc पर अधिक देखें:

मैं इस यहाँ काम मिल गया। इसे उपयोगकर्ता 32 लाइब्रेरी में लगभग सभी फ़ंक्शन मिल गए हैं।