Как использовать JS в форме C#, чтобы форма не зависала? - PullRequest
0 голосов
/ 19 июня 2020

Я создал работающего бота, который использует C# потоков для выполнения нескольких действий, и поэтому пользователь сможет щелкнуть форму, не застревая.

Моя новая цель - разрешить пользователь, чтобы иметь возможность написать сценарий (In javascript) в RichTextBox, чтобы он мог модифицировать своего собственного бота по своему усмотрению.

Большая проблема заключается в том, чтобы найти хороший способ позволить пользователю сделать сценарий, сначала я попробовал C#, но мне не удалось найти безопасный способ сделать это (поэтому он не будет использовать его как преимущество для получения исходного кода). (Поиск часов).

После этого я попытался переключиться на JS, используя скрытый WebBrowser и используя код JS из него с методами C#. Это работает, но после того, как я нажму кнопку «НАЧАТЬ ЗАПУСК», которая запускает l oop скрипт пользователя, я не могу использовать кнопки формы, даже когда «начать боттинг» находится внутри потока.

Любая идея, как я могу сделать код JS WebBrowser l oop, когда я смогу использовать форму без зависания? Или альтернативный способ создания сценария, как я описал, я хотел?

Мой код примера:

Метод:

 private void BottingThread()
    {
        JavaScriptHandler js = new JavaScriptHandler();
        js.ExecuteJS(webBrowser1);
    }

Класс:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Runtime.InteropServices;
using System.Windows.Forms;

namespace bot1
{
public class JavaScriptHandler
{

    // Constructor.
    [ComVisible(true)]
    public void ExecuteJS(WebBrowser wb)
    {
        // Set the WebBrowser to use an instance of the ScriptManager to handle method calls to C#.
        wb.ObjectForScripting = new ScriptManager(Script.ActiveForm);

        // Create the webpage.
        wb.DocumentText = @"<html>
            <head>
                <title>Test</title>
            </head>
            <body>
            <script>
            while (true) {
            window.external.AnotherMethod('Hello');
            wait(2500);
            }

            function wait(ms){
            var start = new Date().getTime();
            var end = start;
            while(end < start + ms) {
            end = new Date().getTime();
            }
            }
            </script>
            </body>
            </html>";
    }
}

[ComVisible(true)]
public class ScriptManager
{
    private Form mForm;

    // Constructor.
    public ScriptManager(Form form)
    {
        mForm = form;
    }

    public void AnotherMethod(string message)
    {
        MessageBox.Show(message);
    }
}

}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...