OleFrame frame = site.frame;
static int getMsgProc(int code, int wParam, int lParam) {	Display display = Display.getCurrent();	if (display == null) return 0;	Integer hHook = (Integer)display.getData(HHOOK);	if (hHook == null) return 0;	if (code < 0) {		return OS.CallNextHookEx(hHook.intValue(), code, wParam, lParam);	}	MSG msg = (MSG)display.getData(HHOOKMSG);	OS.MoveMemory(msg, lParam, MSG.sizeof);	int message = msg.message;	if (OS.WM_KEYFIRST <= message && message <= OS.WM_KEYLAST) {				if (display != null) {			Widget widget = null;			int hwnd = msg.hwnd;			while (hwnd != 0) {				widget = display.findWidget (hwnd);				if (widget != null) break;				hwnd = OS.GetParent (hwnd);			}			if (widget != null && widget instanceof OleClientSite) {				OleClientSite site = (OleClientSite)widget;				if (site.handle == hwnd) {					OleFrame frame = site.frame;					/*					 * Do not allow the activeX control to translate key down arrow 					 * events because this interferes with context menu traversal.					 */					if (message != OS.WM_KEYDOWN ||						(msg.wParam != OS.VK_UP && msg.wParam != OS.VK_DOWN && msg.wParam != OS.VK_LEFT && msg.wParam != OS.VK_RIGHT)) {						if (frame.translateOleAccelerator(msg)) {							// In order to prevent this message from also being processed							// by the application, zero out message, wParam and lParam							msg.message = OS.WM_NULL;							msg.wParam = 0;							msg.lParam = 0;							OS.MoveMemory(lParam, msg, MSG.sizeof);							return 0;						}					}				}			}		}	}	return OS.CallNextHookEx(hHook.intValue(), code, wParam, lParam);}