e4アプリケーションで「alt + f4」(Windowsでアプリケーションを閉じる)のネイティブ動作を無効または上書きできるかどうかを知っている人はいますか? これを達成するための提案された解決策は何ですか?
よろしくお願いします
e4アプリケーションで「alt + f4」(Windowsでアプリケーションを閉じる)のネイティブ動作を無効または上書きできるかどうかを知っている人はいますか? これを達成するための提案された解決策は何ですか?
よろしくお願いします
私のソリューションは、純粋な 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();
}
解決策を見つけましたが、私はそれに満足していません。アドオンを作成しました: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);
}
この解決策は私には正しくないようですので、誰かがより良い解決策を持っている場合は共有してください:-)