# 使用生成 URL 進入表單

#### 步驟

**1. 準備 CEFsharp**

新的結構化2.0套件，新增語音以及子視窗剪貼功能，需啟用媒體功能，以及剪貼簿功能，建議在全局 Cef 做以下設定。

```csharp
[STAThread]
static void Main()
{
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);

    if (!Cef.IsInitialized)
    {
        var settings = new CefSettings();

        // 你的權限與行為開關
        settings.CefCommandLineArgs.Add("enable-media-stream", "1");
        settings.CefCommandLineArgs.Add("enable-usermedia-screen-capturing", "1");
        settings.CefCommandLineArgs.Add("allow-running-insecure-content", "1");
        settings.CefCommandLineArgs.Add("disable-web-security", "1");

        // 若要在 http 下啟用 getUserMedia，指定你的來源（很重要）
        settings.CefCommandLineArgs.Add("unsafely-treat-insecure-origin-as-secure", "http://10.30.111.14:85");

        Cef.Initialize(settings);
    }

    Application.ApplicationExit += (s, e) =>
    {
        // 此時所有 ChromiumWebBrowser 都應該已 Dispose
        Cef.Shutdown();
    };

    Application.Run(new MainForm());
}
```

**2. 準備參數**

首先，需要準備一組參數，這些參數將用於生成特定的 URL 來打開表單。這些參數包括但不限於：

* `tempShortcut`: 模板快捷方式
* `defaultTempID`: 預設模板ID
* `user`: 使用者ID
* Idno: 使用者身分證號 (用來確認查閱管制病歷權限)
* `usernm`: 使用者名稱
* `chtno`: 使用者健保卡號
* `deptNo`: 科別編號
* `opdno`: 門診號
* `ck_enableF4`: 是否啟用F4
* `ck_enableF2`: 是否啟用F2
* `ck_F2Fix`: F2是否固定
* `ck_hidePreset`: 是否隱藏預設
* `scutsource`: 快捷來源（數組）
* `scutgroup`: 快捷組別（數組）

**3. 生成 URL**

使用以下 C# 代碼生成 URL：

* ck\_defaultAssist 預設表單UUID
* basePopup:&#x20;

```csharp
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Script.Serialization;

public class Program
{
    public static void Main()
    {
        var basePopup = "";
        var parameters = new Dictionary<string, object>
        {
            { "tempShortcut", "助手" },
            { "defaultTempID", ck_defaultAssist },
            { "user", IOTjson.user },
            { "usernm", IOTjson.usernm },
            { "chtno", IOTjson.chtno },
            { "deptNo", IOTjson.deptNo },
            { "opdno", IOTjson.opdno },
            { "ck_enableF4", false },
            { "ck_enableF2", false },
            { "ck_F2Fix", false },
            { "ck_hidePreset", true },
            { "scutsource", new string[] { "usr", "sub", "dpt", "sys" } },
            { "scutgroup", new string[] { "助手" } }
        };

        var urlCallout = BuildStructureUrl(basePopup, parameters);
        OpenBrowser(urlCallout);
    }

    public static string BuildStructureUrl(string url, Dictionary<string, object> obj)
    {
        var query = HttpUtility.ParseQueryString(string.Empty);

        foreach (var param in obj)
        {
            if (param.Value != null)
            {
                if (param.Value is Array array)
                {
                    var json = new JavaScriptSerializer().Serialize(array);
                    query[param.Key] = json;
                }
                else
                {
                    query[param.Key] = param.Value.ToString();
                }
            }
        }

        return url + query.ToString();
    }

    public static void OpenBrowser(string url)
    {
        var edgeUrl = "microsoft-edge:" + url;
        System.Diagnostics.Process.Start(new System.Diagnostics.ProcessStartInfo
        {
            FileName = edgeUrl,
            UseShellExecute = true
        });
    }

    // Mock data for demonstration purposes
    static dynamic IOTjson = new
    {
        user = "user123",
        usernm = "user name",
        chtno = "chtno123",
        deptNo = "dept123",
        opdno = "opd123"
    };

    static string ck_defaultAssist = "defaultAssist123";
}

```
