Exemple #1
0
        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));
        }
        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));
        }