Java JNA фокусирует определенное окно

Я пытаюсь дать моему приложению возможность сосредоточиться на другом окне (в этом случае «Блокнот»)

Мой class выглядит так

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

К сожалению, ничего не происходит, и я не знаю, почему

Ниже fragment кода выполняет итерацию через все windows, открытые в машине, останавливается при обнаружении windows Notepad ++ с определенным заголовком, а затем приводит его в фокус. При его фокусировке он три раза нажимает клавишу ввода.

 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.

Вероятно, он должен читать

 public String windowTitle = "Unbenannt - Editor"; 

Ответа на этот вопрос Avinash Jha. Просто добавьте следующие две строки после user32.SetForegroundWindow (hWnd); вам не нужно будет добавлять ключи VK_ENTER для активации windows, так как нажатие кнопки ввода вызывает щелчок по умолчанию по умолчанию windows (например, кнопка «ОК», «Выполнить»)

 ... user32.SetForegroundWindow(hWnd); user32.SetFocus( winOne.winHandle); Thread.sleep(500); user32.ShowWindow(winOne.winHandle, WinUser.SW_SHOWNOACTIVATE); return false; ...