Java JNA focus a specific Window

后端 未结 4 707
Happy的楠姐
Happy的楠姐 2021-01-07 03:59

I am trying to give my application the power to focus another Window (Notepad in this case)

My Class is looking like this

 public static class Win32W         


        
4条回答
  •  情话喂你
    2021-01-07 04:12

    The below code snippet iterates through all the windows open in the machine , stops when a Notepad++ window with a specific title is found and then brings it into focus.On bringing it to focus it presses the enter key three times.

    import java.awt.AWTException;
    import java.awt.Robot;
    import java.awt.event.KeyEvent;
    
    import com.sun.jna.Native;
    import com.sun.jna.Pointer;
    import com.sun.jna.platform.win32.WinDef;
    import com.sun.jna.platform.win32.WinDef.HWND;
    import com.sun.jna.platform.win32.WinUser;
    import com.sun.jna.platform.win32.WinUser.WNDENUMPROC;
    import com.sun.jna.win32.StdCallLibrary;
    
    public class TryWithHWND {
    public interface User32 extends StdCallLibrary {
        User32 INSTANCE = (User32) Native.loadLibrary("user32", User32.class);
    
        boolean EnumWindows(WinUser.WNDENUMPROC lpEnumFunc, Pointer arg);
    
        WinDef.HWND SetFocus(WinDef.HWND hWnd);
    
        int GetWindowTextA(HWND hWnd, byte[] lpString, int nMaxCount);
    
        boolean SetForegroundWindow(WinDef.HWND hWnd);
    }
    
    public static void main(String[] args) {
        final User32 user32 = User32.INSTANCE;
        user32.EnumWindows(new WNDENUMPROC() {
            int count = 0;
    
            public boolean callback(HWND hWnd, Pointer arg1) {
                byte[] windowText = new byte[512];
                user32.GetWindowTextA(hWnd, windowText, 512);
                String wText = Native.toString(windowText);
    
                // get rid of this if block if you want all windows regardless
                // of whether
                // or not they have text
                if (wText.isEmpty()) {
                    return true;
                }
    
                System.out.println("Found window with text " + hWnd
                        + ", total " + ++count + " Text: " + wText);
                if (wText
                        .equals("C:\\Users\\Avi.J\\Desktop\\Datasource and Mq setup commands.txt - Notepad++")) {
                    user32.SetForegroundWindow(hWnd);
                    return false;
                }
                return true;
            }
        }, null);
        // user32.SetFocus(hWnd);
        try {
            Robot r = new Robot();
            r.keyPress(KeyEvent.VK_ENTER);
            r.keyRelease(KeyEvent.VK_ENTER);
            r.keyPress(KeyEvent.VK_ENTER);
            r.keyRelease(KeyEvent.VK_ENTER);
            r.keyPress(KeyEvent.VK_ENTER);
            r.keyRelease(KeyEvent.VK_ENTER);
            r.keyPress(KeyEvent.VK_ENTER);
            r.keyRelease(KeyEvent.VK_ENTER);
        } catch (AWTException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    }
    

    Hope this helps , I believe the part of sending keystrokes can be done by User32 library as well.

提交回复
热议问题