Как фиксировать клики внутри и снаружи прозрачного JFrame с включенным переходом по клику в Java?JAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Как фиксировать клики внутри и снаружи прозрачного JFrame с включенным переходом по клику в Java?

Сообщение Anonymous »

Я работаю над проектом Java, в котором мне нужно создать окно с прозрачным фоном, которое позволит пользователям взаимодействовать с другими окнами, одновременно фиксируя щелчки мыши. Я использую JNA (Java Native Access), чтобы установить стиль окна, позволяющий использовать функцию перехода по щелчку в Windows.
Вот проблема: когда я включаю переход по щелчку, мой JFrame становится невидимым для события мыши. Я не могу фиксировать щелчки мыши непосредственно на кадре, так как окно игнорирует все события мыши, поскольку оно прозрачно.
Чего я пытаюсь достичь:< /p>
  • Мне нужно включить переход по щелчку в окне, чтобы можно было щелкнуть по расположенным ниже окнам через мой фрейм.
  • В то же время я хочу обнаруживать щелчки мыши внутри и снаружи
    фрейм.
  • После обнаружения щелчка мне нужно временно отключить функцию перехода по клику, чтобы фрейм мог зафиксировать щелчок, а затем снова включить ее.
Вот мой текущий код, но он не работает должным образом. Щелчки не фиксируются, и я по-прежнему не могу взаимодействовать с окном должным образом. Окно всегда невидимо для событий мыши, когда включен переход по клику:

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

import com.sun.jna.platform.win32.User32;
import com.sun.jna.platform.win32.WinDef.HWND;
import com.sun.jna.Native;
import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

public class ClickThroughExample {

private JFrame frame;

public ClickThroughExample() {
frame = new JFrame("ClickThrough Example");
frame.setSize(400, 300);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

JPanel panel = new JPanel();
panel.setBackground(Color.BLUE);
frame.add(panel);

frame.setVisible(true);

SwingUtilities.invokeLater(() -> {
try {
enableClickThrough();
bringWindowToFront(); // Bring window to the front
} catch (Exception e) {
e.printStackTrace();
}
});

panel.addMouseListener(new MouseAdapter() {
@Override
public void mousePressed(MouseEvent e) {
if (SwingUtilities.isLeftMouseButton(e)) {
Point p = e.getPoint();
if (frame.getBounds().contains(p)) {
System.out.println("Click detected inside the JFrame: " + p);
} else {
System.out.println("Click detected outside the JFrame: " + p);
}
disableClickThrough(); // Temporarily disable click-through
SwingUtilities.invokeLater(() -> {
try {
enableClickThrough(); // Re-enable click-through
} catch (Exception ex) {
ex.printStackTrace();
}
});
}
}
});
}

public HWND getHwnd() {
if (!frame.isDisplayable()) {
throw new IllegalStateException("Component must be displayable");
}
return new HWND(Native.getComponentPointer(frame));
}

public void enableClickThrough() {
HWND hwnd = getHwnd();
int exStyle = User32.INSTANCE.GetWindowLong(hwnd, User32.GWL_EXSTYLE);
exStyle |= User32.WS_EX_LAYERED | User32.WS_EX_TRANSPARENT;
User32.INSTANCE.SetWindowLong(hwnd, User32.GWL_EXSTYLE, exStyle);
User32.INSTANCE.SetLayeredWindowAttributes(hwnd, 0, (byte) 255, User32.LWA_ALPHA);
}

public void disableClickThrough() {
HWND hwnd = getHwnd();
int exStyle = User32.INSTANCE.GetWindowLong(hwnd, User32.GWL_EXSTYLE);
exStyle &= ~(User32.WS_EX_LAYERED | User32.WS_EX_TRANSPARENT);
User32.INSTANCE.SetWindowLong(hwnd, User32.GWL_EXSTYLE, exStyle);
}

public void bringWindowToFront() {
HWND hwnd = getHwnd();
User32.INSTANCE.SetForegroundWindow(hwnd);
}

public static void main(String[] args) {
SwingUtilities.invokeLater(ClickThroughExample::new);
}
}
Проблема: код должен обеспечивать возможность перехода по клику, но при этом фиксировать щелчки мыши внутри и за пределами фрейма. . Однако окно остается невидимым для событий мыши, когда включен режим перехода по щелчку, и клики не фиксируются.
Любые предложения по устранению этой проблемы и правильной обработке событий мыши на прозрачное окно с включенным переходом по клику?

Подробнее здесь: https://stackoverflow.com/questions/792 ... click-thro
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

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