我试图让我的应用程序能够聚焦另一个窗口(在这种情况下是记事本)
我的班级看起来像这样
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;
}
}
我通过使用:
来调用它User32.INSTANCE.SetFocus(Win32WindowUtils.GetWindowHandle(windowTitle, null));
注意:
public String windowTitle = "Unbennant - Editor";
可悲的是没有发生任何事情,我不知道为什么
答案 0 :(得分:4)
下面的代码片段遍历机器中打开的所有窗口,当找到具有特定标题的Notepad ++窗口时停止,然后将其置于焦点。如果将其聚焦,则按三次Enter键。
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();
}
}
}
希望这会有所帮助,我相信发送按键的部分也可以由User32库完成。
答案 1 :(得分:0)
应该阅读
public String windowTitle = "Unbenannt - Editor";
答案 2 :(得分:0)
Avinash Jha的回答很好。只需在user32.SetForegroundWindow(hWnd);之后添加以下两行,您无需添加机器人键VK_ENTER即可激活窗口,因为单击Enter会导致单击窗口的默认键(例如,按钮OK,运行)
...
user32.SetForegroundWindow(hWnd);
user32.SetFocus( winOne.winHandle);
Thread.sleep(500);
user32.ShowWindow(winOne.winHandle, WinUser.SW_SHOWNOACTIVATE);
return false;
...
答案 3 :(得分:0)
我知道我晚了3年,但是由于Windows api在尝试对与您的起源不同的其他程序进行修改时的局限性,当前的答案至少在JNA上无效。我已经进行了数小时的研究,尝试了许多不同的功能,但均未成功。终于,我找到了一种非常干净的方法。这样做是使用Avinash Jha代码库的方法:
public class JnaInstances {
public interface User32 extends StdCallLibrary {
User32 INSTANCE = Native.loadLibrary("user32", User32.class);
boolean EnumWindows(WinUser.WNDENUMPROC lpEnumFunc,
Pointer data);
int GetWindowTextW(WinDef.HWND hWnd, char[] lpString, int nMaxCount);
boolean ShowWindow(WinDef.HWND hWnd, int nCmdShow);
}
}
public static void main(String[] args) {
JnaInstances.User32 user32 = JnaInstances.User32.INSTANCE;
user32.EnumWindows(new WinUser.WNDENUMPROC() {
@Override
public boolean callback(WinDef.HWND hwnd, Pointer pointer) {
char[] windowText = new char[512];
user32.GetWindowTextW(hwnd, windowText, 512);
String windowName = Native.toString(windowText);
System.out.println("The window is called: "+ windowName);
if(windowName.contains("Window name")) { //Here you can use the .equals if you want more accurancy
user32.ShowWindow(hwnd, User32.SW_RESTORE);
return false;
}
return true;
}
}, null);
}