This code allows Java JFrames to behave like the LWJGL window, ie, no system menu when you click the icon.
Header:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| #include <jni.h>
#ifndef _Included_library_NativeRoutines #define _Included_library_NativeRoutines #ifdef __cplusplus extern "C" { #endif
JNIEXPORT jint JNICALL Java_library_NativeRoutines_hookWindowProcess (JNIEnv *, jclass, jobject);
#ifdef __cplusplus } #endif #endif
|
C++ source:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80
| #include "Library.h" #include <Windows.h> #include <jawt_md.h> #include <jawt.h> #include <map>
std::map<HWND, WNDPROC> processMap;
LRESULT WINAPI CALLBACK HookedWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { if (uMsg == 0x0112 && wParam == 0xF093) { return 0; } if (uMsg == 0x0112 && wParam == 0xF063) { return 0; } if (uMsg == 0x00A5 || uMsg == 0x00A4) { return 0; } std::map<HWND, WNDPROC>::iterator mWndProc = processMap.find(hWnd); if (mWndProc == processMap.end()) { return 0; } return CallWindowProc(mWndProc->second, hWnd, uMsg, wParam, lParam); }
JNIEXPORT jint JNICALL Java_library_NativeRoutines_hookWindowProcess (JNIEnv *env, jclass klass, jobject jframe) { typedef jboolean (JNICALL *PJAWT_GETAWT)(JNIEnv*, JAWT*); JAWT awt; JAWT_DrawingSurface* ds; JAWT_DrawingSurfaceInfo* dsi; JAWT_Win32DrawingSurfaceInfo* dsi_win; jboolean result; jint lock; HWND hWnd = 0; HMODULE hAWT = GetModuleHandle(L"jawt.dll"); if (!hAWT) hAWT = LoadLibrary(L"jawt.dll"); if (hAWT) { PJAWT_GETAWT JAWT_GetAWT = (PJAWT_GETAWT) GetProcAddress(hAWT, "_JAWT_GetAWT@8"); if (JAWT_GetAWT) { awt.version = JAWT_VERSION_1_3; result = JAWT_GetAWT(env, &awt); if (result != JNI_FALSE) { ds = awt.GetDrawingSurface(env, jframe); if (ds != NULL) { lock = ds->Lock(ds); if((lock & JAWT_LOCK_ERROR) == 0) { dsi = ds->GetDrawingSurfaceInfo(ds); dsi_win = (JAWT_Win32DrawingSurfaceInfo*)dsi->platformInfo; hWnd = dsi_win->hwnd; ds->FreeDrawingSurfaceInfo(dsi); ds->Unlock(ds); } else { return 5; } } else { return 4; } awt.FreeDrawingSurface(ds); } else { return 3; } } else { return 2; } } else { return 1; } LONG oldWndProc = GetWindowLong(hWnd, GWL_WNDPROC); if (!oldWndProc) { return 6; } processMap[hWnd] = (WNDPROC) oldWndProc; if (!SetWindowLong(hWnd, GWL_WNDPROC, (LONG) HookedWndProc)) { return 7; } return 0; } |
Java source:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
|
package library;
import javax.swing.JFrame;
public class NativeRoutines {
private static native int hookWindowProcess(JFrame jf);
public static boolean hookWndProc(JFrame jf) { try { int result = hookWindowProcess(jf); return result == 0; } catch (Throwable err) { err.printStackTrace(); return false; } } }
|
How to disable the system menu and double icon click that closes the window:
1 2 3 4 5 6 7
| try { System.loadLibrary("jawt"); System.loadLibrary("Library"); library.NativeRoutines.hookWndProc(yourJFrame); } catch (UnsatisfiedLinkError ex) { } |
Hope this helps some of you out there.