Create a window using Windows.Forms.Form asynchronously

ad48hp wrote on 8/10/2021, 2:12 PM

Hello,

I have been trying to create a window using following code.

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Drawing;
using System.Runtime.InteropServices;
using System.Windows.Forms;
using ScriptPortal.Vegas;

public class EntryPoint
{
    public Form prompt;
    public Vegas myveg;
    public Button mybut;

    public void FromVegas(Vegas vegas)
    {
        myveg = vegas;
        prompt = new Form
        {
            Width = 300,
            Height = 150,
            Text = "Keyframer",
            BackColor = Color.Red
        };
        mybut = new Button { Text = "Add a value", Left = 0, Width = 123, Height = 64, BackColor = Color.White };
        mybut.Click += BtnKick;
        prompt.Controls.Add(mybut);
        prompt.ShowDialog();
    }

    private void BtnKick(object sender, EventArgs e)
    {
        var tracks = myveg.Project.Tracks;
        foreach (var ev in tracks)
        {
            if (ev.MediaType == MediaType.Video)
            {
                foreach (var effect in ev.Effects)
                {
                    if (effect.Bypass)
                    {
                        continue;
                    }
                    try
                    {
                        if (!effect.IsOFX)
                        {
                            continue;
                        }
                    }
                    catch (COMException)
                    {
                        continue;
                    }
                    var ofx = effect.OFXEffect;
                    foreach (var parameter in ofx.Parameters)
                    {
                        if (parameter is OFXDoubleParameter)
                        {
                            var p = parameter as OFXDoubleParameter;
                            p.SetValueAtTime(Timecode.FromFrames(30), 69);
                        }
                    }
                }
            }
        }
    }
}

Sadly, this window cannot be use while working in Vegas, as it's a modal dialog, and i need to switch between Vegas and this window..

When i changed it ShowDialog to Show, the Vegas crashed while execution..

Exception 0xE0434352 (Unknown Type) IP:0x00007FFB34154ED9
In Module 'KERNELBASE.dll' at Address 0x00007FFB34120000 + 0x0000000000034ED9

Interestingly when i removed the following line, it didn't crash..

  p.SetValueAtTime(Timecode.FromFrames(30), 69);

I found out that Vegas doesn't crash when i access a value, like p.Keyframes.Count, but when i change a value, it does..

I tried to add the following code after the prompt.Show line, and then it didn't crash, but i couldn't still access Vegas while running..

while (!prompt.IsDisposed)
{
     Application.DoEvents();
}

That could mean, that Vegas have problem with modifying a value after the script finishes, but i have no clue why..

I am using Vegas Pro 17, which is not the currently newest version, but i think the scripting along this subject didn't changed since then..

Can someone help me with this ?

I would also appreciate to know if there are other ways to create windows that can be used simultaneously while working in Vegas, or point to a publicly accessible script / library that uses one..

Comments

jetdv wrote on 8/23/2021, 9:23 AM

Here's my answer to the post you made in the other post: The solution would be to create a "Custom Command" instead of a standard script. I do have plans to show how to do that but have been working through more common tasks first. With a Custom Command, the script can stay running all the time, the window can be docked in any docking area, and you can continue to use VEGAS while the screen is open.