Search code examples
c#winformsunity-game-engineflickersecurityexception

SecurityException occurred


I have read, that it could be possible to fuse UnityEngine with Winforms, so that is what I am trying to do. I am trying to use a sine wave to control the flickering between colors on a button in Winform. However I am getting a SecurityException which I do not konw how to solve.

    private void DisplayMessage(string messge)
    {
        int numVal;
        //SPELL.Text += messge + Environment.NewLine;

        numVal = Convert.ToInt32(messge);
        udpSock1.Close();
        if (numVal == 83)
        {

        //Application.EnableVisualStyles();
        //Application.SetCompatibleTextRenderingDefault(false);
        //Application.Idle += new EventHandler(Application_Idle);
        //Application.Run(form1);
            BCI1 form1 = new BCI1();
            //Application.Run(form1);
            form1.ShowDialog();
            //stopwatch.Start();
            SPELL.Text = SPELL.Text + form1.LET;

            udpSock1 = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
            udpSock1.Bind(new IPEndPoint(IPAddress.Any, 8050));
            buffer = new byte[1024];

            newClientEP = new IPEndPoint(IPAddress.Any, 0);
            udpSock1.BeginReceiveFrom(buffer, 0, buffer.Length, SocketFlags.None, ref newClientEP, DoReceiveFrom, udpSock1);

            //udpSock.Disconnect(true);
            //udpSock.Connect(new IPEndPoint(IPAddress.Any, 8050));
        }

Here I open the new form, and the form hen diplays som characters, which can chosen, hereafter the form closes agian, and you return to the main, form 1.


Solution

  • complete program:

    using System;
    using System.Drawing;
    using System.Runtime.InteropServices;
    using System.Security;
    using System.Windows.Forms;
    
    namespace Flicker
    {
        static class Program
        {
            [StructLayout(LayoutKind.Sequential)]
            private struct Message
            {
                public IntPtr hWnd;
                public int msg;
                public IntPtr wParam;
                public IntPtr lParam;
                public uint time;
                public Point p;
            }
    
            [return: MarshalAs(UnmanagedType.Bool)]
            [SuppressUnmanagedCodeSecurity, DllImport("user32.dll", CharSet = CharSet.Auto)]
            private static extern bool PeekMessage(out Message msg, IntPtr hWnd, uint messageFilterMin, uint messageFilterMax, uint flags);
    
            static Form1 form;
    
            [STAThread]
            static void Main()
            {
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);
                form = new Form1();
                Application.Idle += new EventHandler(Application_Idle);
                Application.Run(form);
            }
    
            static void Application_Idle(object sender, EventArgs e)
            {
                Message message;
                while (!PeekMessage(out message, IntPtr.Zero, 0, 0, 0))
                {
                    form.UpdateFrame();
                }
            }
        }
    }
    

    and the form:

    using System;
    using System.Diagnostics;
    using System.Windows.Forms;
    
    namespace Flicker
    {
        public partial class Form1 : Form
        {
            Stopwatch stopwatch = new Stopwatch();
    
            public Form1()
            {
                InitializeComponent();
    
                stopwatch.Start();
            }
    
            public void UpdateFrame()
            {
                double cycleHz = 0.001;
    
                double wave = Math.Sin((stopwatch.ElapsedMilliseconds * 2.0 * Math.PI) * cycleHz);
    
                if (wave > 0.0)
                {
                    pictureBox1.BackColor = System.Drawing.Color.Black;
                }
                else
                {
                    pictureBox1.BackColor = System.Drawing.Color.White;
                }
            }
        }
    }
    

    just add pictureBox1 to your form in your designer.

    i would suggest writing the whole application in Microsoft XNA - it is easier to learn than Unity3D :)