2

e4アプリケーションで「alt + f4」(Windowsでアプリケーションを閉じる)のネイティブ動作を無効または上書きできるかどうかを知っている人はいますか? これを達成するための提案された解決策は何ですか?

よろしくお願いします

4

2 に答える 2

0

私のソリューションは、純粋な SWTソリューションではありません。Windows でのみ動作します。しかし、Windows について言及されましたが、1 つのプラットフォームのみをターゲットにする場合は、これで十分です。SWT の内部コードを使用しますが、Microsoft によって文書化されている Windows API にマップされるため、変更されません。

public static void main(String[] args) {
    final Display display = new Display();
    final Shell shell = new Shell(display);

    shell.addListener(SWT.Close, new Listener() {
        @Override
        public void handleEvent(Event event) {
            if (OS.GetKeyState(OS.VK_MENU) < 0 && OS.GetKeyState(OS.VK_F4) < 0) {
                event.doit = false;
            }
        }
    });

    shell.open();
    while (!shell.isDisposed()) {
        if (!display.readAndDispatch()) {
            display.sleep();
        }
    }
    display.dispose();
}
于 2013-11-05T16:23:01.890 に答える
0

解決策を見つけましたが、私はそれに満足していません。アドオンを作成しました:UIEvents.UILifeCycle.APP_STARTUP_COMPLETEトピックにイベント ハンドラーを登録しています。次に、何らかの方法でトピックのメタデータからシェルを取得し、ディスプレイにフィルターを登録します。

@PostConstruct
void hookListeners() {
    eventHandler = new EventHandler() {



        @Override
        public void handleEvent(Event arg0) {
            MElementContainer property = (MElementContainer) arg0.getProperty("org.eclipse.e4.data");
            final Shell shell = (Shell) property.getSelectedElement().getWidget();
            final Display display = shell.getDisplay();
            display.addFilter(SWT.Close, new Listener() {

                @Override
                public void handleEvent(org.eclipse.swt.widgets.Event event) {

                    if (!MessageDialog.openQuestion(shell, "Exit",
                            "Do you really want to close the Application?")) {
                        //see api documentation display.addFilter( 
                         event.type = SWT.NONE;
                         event.doit = false;

                    }

                }
            });             
        }
    };
eventBroker.subscribe(UIEvents.UILifeCycle.APP_STARTUP_COMPLETE, eventHandler);
}

この解決策は私には正しくないようですので、誰かがより良い解決策を持っている場合は共有してください:-)

于 2013-11-06T09:07:51.713 に答える