Как переместить фокус на следующее развернутое окно?JAVA

Программисты JAVA общаются здесь
Anonymous
Как переместить фокус на следующее развернутое окно?

Сообщение Anonymous »

Я создаю скрипт, который при нажатии комбинации клавиш сворачивает текущее активное окно и переходит к следующему. Затем при нажатии комбинации клавиш разворачивается последнее свернутое окно.
Возникла проблема с передачей фокуса следующему окну, если оно есть, после сворачивания активного.< /p>
В документации ShowWindow написано «SW_MINIMIZE
6 Сворачивает указанное окно и активирует следующее окно верхнего уровня в порядке Z.», но у меня это не работает по какой-то причине.
User32.java

Код: Выделить всё

import jnr.ffi.LibraryLoader;
import jnr.ffi.Pointer;
import jnr.ffi.annotations.Delegate;
import jnr.ffi.types.u_int32_t;

public interface User32 {
User32 INSTANCE = LibraryLoader.create(User32.class).load("user32");

@u_int32_t
long GetForegroundWindow();

boolean SetForegroundWindow(@u_int32_t long hWnd);

boolean ShowWindow(@u_int32_t long hWnd, @u_int32_t long nCmdShow);

boolean IsIconic(@u_int32_t long hWnd);

boolean IsWindowVisible(@u_int32_t long hwnd);

void keybd_event(byte bVk, byte bScan, @u_int32_t int dwFlags,
int dwExtraInfo);

interface WinEnumProc {
@Delegate
boolean apply(@u_int32_t long hwnd, Pointer data);
}

boolean EnumWindows(WinEnumProc lpEnumFunc, Pointer lParam);
}

WindowManager.java

Код: Выделить всё

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

import java.util.ArrayList;
import java.util.List;

public class WindowManager {
private static final Logger log = LogManager.getLogger(WindowManager.class.getName());
private static final int SW_MINIMIZE = 6;
private static final int SW_RESTORE = 9;
private static long lastWindow = 0;

public static void winMinimize() {
long activeWin = User32.INSTANCE.GetForegroundWindow();
log.info("Active window: {}", activeWin);

if (activeWin != 0) {
List windows = new ArrayList();

User32.INSTANCE.EnumWindows((hwnd, data) -> {
if (User32.INSTANCE.IsWindowVisible(hwnd)) {
windows.add(hwnd);
}
return true;
}, null);

lastWindow = activeWin;
User32.INSTANCE.ShowWindow(activeWin, SW_MINIMIZE);

int activeWinIndex = windows.indexOf(activeWin);

if (activeWinIndex != -1 && activeWinIndex + 1 < windows.size()) {
long nextWin = windows.get(activeWinIndex + 1);
log.info("Next win: {}", windows.get(activeWinIndex + 1));
//              User32.INSTANCE.keybd_event((byte) 0xA4, (byte) 0x45, 0x2, 0);
User32.INSTANCE.SetForegroundWindow(nextWin);
}

log.info("Focus: {}", User32.INSTANCE.GetForegroundWindow());
}
}

public static void winRestore() {
if (lastWindow != 0 && User32.INSTANCE.IsIconic(lastWindow)) {
User32.INSTANCE.ShowWindow(lastWindow, SW_RESTORE);
User32.INSTANCE.SetForegroundWindow(lastWindow);
lastWindow = 0;
}
}
}
Я создаю список развернутых окон, из которого получаю следующее развернутое окно, и пытаюсь вызвать для него SetForegroundWindow. Это окно начинает мигать, но фокус по-прежнему не переносится.
Я также нашел решение для имитации нажатия клавиши Alt, User32.INSTANCE.keybd_event((byte) 0xA4, ( byte) 0x45, 0x2, 0), но мне это кажется странным. Я хотел бы получить то же поведение, что и при нажатии кнопки свертывания окна мышью.
Я прочитал документацию по [SetForegroundWindow][https://learn.microsoft.com/ en-us/windows/win32/api/winuser/nf-winuser-setforegroundwindow], и, возможно, проблема кроется в потоках, но я не понимаю, что мне нужно сделать, чтобы ее решить.

Подробнее здесь: https://stackoverflow.com/questions/788 ... ded-window

Вернуться в «JAVA»