为了账号安全,请及时绑定邮箱和手机立即绑定

使用 Alt+Enter 最大化 JavaFX Stage 时删除提示音

使用 Alt+Enter 最大化 JavaFX Stage 时删除提示音

RISEBY 2021-06-01 13:43:50
我希望我的 JavaFX 应用程序可以通过 Alt+Enter 最大化,所以我添加了:scene.addEventFilter(KeyEvent.KEY_PRESSED, event -> {    if (event.getCode() == KeyCode.ENTER) {        if (event.isAltDown()) {            setFullScreen(!stage.isFullScreen());            event.consume();        }    }});然而,当按下 Alt+Enter 时,似乎所有 JavaFX 应用程序默认都会播放“哔”声效果(不知道为什么......)。我将如何继续消除这种声音效果?
查看完整描述

2 回答

?
慕的地8271018

TA贡献1796条经验 获得超4个赞

我遇到了同样的问题,并通过使用 Windows API 对窗口进行子类化来解决它。如果你被允许使用 JNA,下面的代码会对你有所帮助。


我的用户32.java


import com.sun.jna.Callback;

import com.sun.jna.Native;

import com.sun.jna.platform.win32.*;

import com.sun.jna.win32.W32APIOptions;


public interface MyUser32 extends User32 {

    int WM_MENUCHAR = 0x0120;

    int MNC_CLOSE = 1;

    int VK_RETURN = 0x0d;


    MyUser32 INSTANCE = Native.loadLibrary("user32", MyUser32.class, W32APIOptions.UNICODE_OPTIONS);


    LONG_PTR SetWindowLongPtr(WinDef.HWND hWnd, int nIndex, Callback callback);

    LRESULT CallWindowProc(LONG_PTR lpPrevWndProc, HWND hWnd, int Msg, WPARAM wParam, LPARAM lParam);

}

App.java


import com.sun.jna.Pointer;

import com.sun.jna.platform.win32.*;

import com.sun.jna.platform.win32.WinDef.*;

import com.sun.jna.win32.StdCallLibrary;

import javafx.application.Application;

import javafx.stage.Stage;

import java.lang.reflect.Method;


public class App extends Application implements StdCallLibrary.StdCallCallback {


    private BaseTSD.LONG_PTR baseWndProc;


    public static void main(String[] args) { launch(args); }


    @Override

    public void start(Stage primaryStage) {


        // set up scene ...


        primaryStage.show();


        final HWND hWnd = new HWND(getWindowPointer(primaryStage));

        baseWndProc = MyUser32.INSTANCE.SetWindowLongPtr(hWnd, User32.GWL_WNDPROC, this);

    }


    public LRESULT callback(HWND hWnd, int Msg, WPARAM wParam, LPARAM lParam) {

        if (Msg == MyUser32.WM_MENUCHAR && (wParam.longValue() & 0xffff) == MyUser32.VK_RETURN) {

            return new LRESULT(MyUser32.MNC_CLOSE << 16);

        }


        return MyUser32.INSTANCE.CallWindowProc(baseWndProc, hWnd, Msg, wParam, lParam);

    }


    private Pointer getWindowPointer(Stage stage) {

        try {

            Method getPeer = stage.getClass().getMethod("impl_getPeer");

            final Object tkStage = getPeer.invoke(stage);

            Method getPlatformWindow = tkStage.getClass().getDeclaredMethod("getPlatformWindow");

            getPlatformWindow.setAccessible(true);

            final Object platformWindow = getPlatformWindow.invoke(tkStage);

            Method getNativeHandle = platformWindow.getClass().getMethod("getNativeHandle");

            return new Pointer((Long) getNativeHandle.invoke(platformWindow));

        } catch (Throwable t) {

            return null;

        }

    }



查看完整回答
反对 回复 2021-06-02
?
GCT1015

TA贡献1827条经验 获得超4个赞

我猜你是在 Windows 中编程,因此你得到的哔声是默认的哔声。

基于此论坛帖子,似乎ALT+KEY没有找到菜单快捷方式。这很可能是由于Mnemonic Parsing,它允许您将键盘快捷键添加到菜单项,例如ALT+F文件、ALT+S保存等...

根据其中一篇文章,Windows 似乎也想获取该组合键,但找不到它,所以它发出哔哔声。

我不确定您是否可以添加一个ENTER作为助记符标识符,但您可以通读这篇关于 javafx 助记符的文章,以及关于按钮加速器的这篇文章。我知道第二个是 JavaFx 2.2,但它应该仍然有效。这些应该会给你一些关于如何更彻底地解决这个问题的好主意。


查看完整回答
反对 回复 2021-06-02
  • 2 回答
  • 0 关注
  • 174 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信