Java JNA关注一个特定的Window [英] Java JNA focus a specific Window

查看:205
本文介绍了Java JNA关注一个特定的Window的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述



我的类看起来像这样

  public static class Win32WindowUtils {
$ b $ public interface User32 extends StdCallLibrary {
User32 INSTANCE =(User32)Native.loadLibrary user32,User32.class,W32APIOptions.DEFAULT_OPTIONS);
HWND GetParent(HWND hWnd);
HWND FindWindow(String lpClassName,String lpWindowName);
HWND SetFocus(HWND hWnd);
HWND FindWindowEx(HWND hwndParent,HWND hwndChildAfter,String lpszClass,String lpszWindow);
int GetWindowText(HWND hWnd,char [] lpString,int nMaxCount);
}

private static final int WIN_TITLE_MAX_SIZE = 512;

public static HWND GetWindowHandle(String strSearch,String strClass){$ b $ char [] lpString = new char [WIN_TITLE_MAX_SIZE];
字符串strTitle;
int iFind = -1;
HWND hWnd = User32.INSTANCE.FindWindow(strClass,null);
while(hWnd!= null){
User32.INSTANCE.GetWindowText(hWnd,lpString,WIN_TITLE_MAX_SIZE);
strTitle = new String(lpString);
strTitle = strTitle.toUpperCase();
iFind = strTitle.indexOf(strSearch);
if(iFind!= -1){
return hWnd;
}
hWnd =(User32.INSTANCE).FindWindowEx(null,hWnd,strClass,null);
}
return hWnd;


$ / code $ / pre
$ b $ p

我用

  User32.INSTANCE.SetFocus(Win32WindowUtils.GetWindowHandle(windowTitle,null)); 

注意:

  public String windowTitle =Unbennant  -  Editor; 

可悲的是没有发生,我不知道为什么



  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);

布尔SetForegroundWindow(WinDef.HWND hWnd);


public static void main(String [] args){
final User32 user32 = User32.INSTANCE;
user32.EnumWindows(new WNDENUMPROC(){
int count = 0;
$ b $ public boolean callback(HWND hWnd,指针arg1){
byte [] windowText = new byte [512];
user32.GetWindowTextA(hWnd,windowText,512);
String wText = Native.toString(windowText);

//去掉if如果你想要所有的窗口块,不管
//是否为
//或不是他们有文本
if(wText.isEmpty()){
return true;
}

System.out.println(Find 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);
返回false;
}
返回true;
}
},null);
// user32.SetFocus(hWnd);
尝试{
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自动生成的catch块
e.printStackTrace();



$ / code $ / pre

希望这有助于我相信发送键击的部分也可以通过User32库来完成。


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 Win32WindowUtils {

  public interface User32 extends StdCallLibrary {
        User32 INSTANCE = (User32) Native.loadLibrary("user32", User32.class, W32APIOptions.DEFAULT_OPTIONS);
        HWND GetParent(HWND hWnd);
        HWND FindWindow(String lpClassName, String lpWindowName);
        HWND SetFocus(HWND hWnd);
        HWND FindWindowEx(HWND hwndParent, HWND hwndChildAfter, String lpszClass, String lpszWindow);
        int GetWindowText(HWND hWnd, char[] lpString, int nMaxCount);
    }

    private static final int WIN_TITLE_MAX_SIZE = 512;

    public static HWND GetWindowHandle(String strSearch, String strClass) {
        char[] lpString = new char[WIN_TITLE_MAX_SIZE];
        String strTitle;
        int iFind = -1;
        HWND hWnd = User32.INSTANCE.FindWindow(strClass, null);
        while(hWnd != null) {
            User32.INSTANCE.GetWindowText(hWnd, lpString, WIN_TITLE_MAX_SIZE);
            strTitle = new String(lpString);
            strTitle = strTitle.toUpperCase();
            iFind = strTitle.indexOf(strSearch);
            if(iFind != -1) {
                return hWnd;
            }
            hWnd = (User32.INSTANCE).FindWindowEx(null, hWnd, strClass, null);
        }
        return hWnd;
    }
}

And I am calling it by using:

User32.INSTANCE.SetFocus(Win32WindowUtils.GetWindowHandle(windowTitle, null));

Note:

public String windowTitle = "Unbennant - Editor";

Sadly nothing is happening and I dont know why

解决方案

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.

这篇关于Java JNA关注一个特定的Window的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆