static MessageFilterUtil() { var invokeMessageFilterMethod = new DynamicMethod( "InvokeMessageFilter", typeof(bool), new[] { typeof(NiMessage).MakeByRefType() }, typeof(MessageFilterUtil).Module, true ); ILGenerator il = invokeMessageFilterMethod.GetILGenerator(); // MSG msg; // bool modified; // bool processed; var msg = il.DeclareLocal(MsgType); var modified = il.DeclareLocal(typeof(bool)); var processed = il.DeclareLocal(typeof(bool)); // msg = new MSG(); il.Emit(OpCodes.Ldloca_S, msg); il.Emit(OpCodes.Initobj, MsgType); // msg.hwnd = message.HWnd; il.Emit(OpCodes.Ldloca_S, msg); il.Emit(OpCodes.Ldarg_0); il.Emit(OpCodes.Call, NiMessageHwnd.GetGetMethod()); il.Emit(OpCodes.Stfld, MsgHwnd); // msg.message = message.Msg; il.Emit(OpCodes.Ldloca_S, msg); il.Emit(OpCodes.Ldarg_0); il.Emit(OpCodes.Call, NiMessageMsg.GetGetMethod()); il.Emit(OpCodes.Stfld, MsgMessage); // msg.wParam = message.WParam; il.Emit(OpCodes.Ldloca_S, msg); il.Emit(OpCodes.Ldarg_0); il.Emit(OpCodes.Call, NiMessageWParam.GetGetMethod()); il.Emit(OpCodes.Stfld, MsgWParam); // msg.lParam = message.LParam; il.Emit(OpCodes.Ldloca_S, msg); il.Emit(OpCodes.Ldarg_0); il.Emit(OpCodes.Call, NiMessageLParam.GetGetMethod()); il.Emit(OpCodes.Stfld, MsgLParam); // processed = ThreadContext.FromCurrent().ProcessFilters(ref msg, ref modified); il.Emit(OpCodes.Call, FromCurrentMethod); il.Emit(OpCodes.Ldloca_S, msg); il.Emit(OpCodes.Ldloca_S, modified); il.Emit(OpCodes.Callvirt, ProcessFiltersMethod); il.Emit(OpCodes.Stloc_2); // if (modified) { il.Emit(OpCodes.Ldloc_1); var label = il.DefineLabel(); il.Emit(OpCodes.Brfalse_S, label); // message.HWnd = msg.hwnd; il.Emit(OpCodes.Ldarg_0); il.Emit(OpCodes.Ldloca_S, msg); il.Emit(OpCodes.Ldfld, MsgHwnd); il.Emit(OpCodes.Call, NiMessageHwnd.GetSetMethod()); // message.Msg = msg.message; il.Emit(OpCodes.Ldarg_0); il.Emit(OpCodes.Ldloca_S, msg); il.Emit(OpCodes.Ldfld, MsgMessage); il.Emit(OpCodes.Call, NiMessageMsg.GetSetMethod()); // message.WParam = msg.wParam; il.Emit(OpCodes.Ldarg_0); il.Emit(OpCodes.Ldloca_S, msg); il.Emit(OpCodes.Ldfld, MsgWParam); il.Emit(OpCodes.Call, NiMessageWParam.GetSetMethod()); // message.LParam = msg.lParam; il.Emit(OpCodes.Ldarg_0); il.Emit(OpCodes.Ldloca_S, msg); il.Emit(OpCodes.Ldfld, MsgLParam); il.Emit(OpCodes.Call, NiMessageLParam.GetSetMethod()); // } // return processed; il.MarkLabel(label); il.Emit(OpCodes.Ldloc_2); il.Emit(OpCodes.Ret); _invokeMessageFilterDelegate = (InvokeMessageFilterDelegate)invokeMessageFilterMethod.CreateDelegate(typeof(InvokeMessageFilterDelegate)); }