公用的cefsharp窗口


書接上回,.net實現一個nw,一個字,簡單。

結構,無廢話,上圖。

 

要說這部分上回展示過的,大致結構如此,其實要說清楚結構,還是得從工作流程開始說起

流程

  1.通過桌面的快捷方式啟動WebOnDesk, 攜帶參數,目標客戶文件夾的名字,這個文件夾因為是在本機xampp服務器上,所以也可以拼接出類似localhost/xxx的形式,用作界面

  2.啟動搜索參數指向的文件目錄

    1)xxxx.dll,與文件名同名的客戶端邏輯dll,動態掛載,所有的業務邏輯,后端支持都可以由它來完成,nw里的package.json完成的那點事,都是分分鍾完成的。強大的一批,因為他的擴展是無窮的。當然也可以沒有這個dll,因為js本身也可以寫很多邏輯在里面。所以,這個很重要的東西,也是可選的,因為,可能不操作本地,直接操作網絡上的東西。

    2)圖標,這都是小菜一碟,順手的事兒。

  3.cefsharp加載拼接好的localhost/xxx或者dll內部指向的其他外網網頁(不過,這就相當於瀏覽器了,無趣)。

  4.鬼喲,完事兒了,想干啥干啥吧。

  短小精煉,無廢話,連錯誤處理都可以省略

    

稍微展示一下代碼,別學我,我這隨便寫寫的。

主窗口代碼

Imports CefSharp
Imports CefSharp.WinForms

Public Class Form1

    Public WorkPath As IO.DirectoryInfo
    Private WithEvents Cef As ChromiumWebBrowser
    Private WithEvents Methods As CustomerMethods.Class1

    Public Const WM_DRAWCLIPBOARD = &H308

    Private Declare Sub SwitchToThisWindow Lib "User32.dll" Alias "SwitchToThisWindow" (ByVal hWnd As Integer, ByVal bRestore As Integer)

    Private Sub Form1_FormClosing(sender As Object, e As FormClosingEventArgs) Handles Me.FormClosing
        Try
            Methods.ending()
        Catch ex As Exception

        End Try
    End Sub

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        '啟動參數分析
        WorkPath = New IO.DirectoryInfo(Microsoft.VisualBasic.Command)
        If WorkPath.Exists = False Then
            MsgBox("啟動目錄不存在,請檢查快捷方式參數")
            Close()
        End If

        '加載用戶方法Dll
        Dim fi As New IO.FileInfo(WorkPath.FullName + "\" + WorkPath.Name + ".dll")
        If fi.Exists Then
            Try
                Dim asm As System.Reflection.Assembly = System.Reflection.Assembly.LoadFile(WorkPath.FullName + "\" + WorkPath.Name + ".dll")
                Dim classtemp As Type = asm.GetType(WorkPath.Name + ".Class1")
                Methods = asm.CreateInstance(classtemp.FullName)
                Methods.MainForm = Me
            Catch ex As Exception
                MsgBox("加載用戶Dll錯誤")
            End Try
        Else
            Methods = New DefMethod
        End If
      
        '創建桌面快捷方式
        CreateLnk(WorkPath)

        '圖標設置
        Try
            Me.Icon = New Icon(WorkPath.FullName + "\favicon.ico")
        Catch ex As Exception
        End Try

        '標題
        Me.Text = WorkPath.Name

        '啟動引導前項
        Try
            Methods.init()
        Catch ex As Exception
            MsgBox("Method 初始化錯誤:" + ex.Message)
        End Try
        '啟動
        If Methods.StartPath.Length = 0 Then
            Methods.StartPath = "localhost/" + WorkPath.Name
        End If

        CefSharp.Cef.Initialize(New CefSharp.CefSettings)
        CefSharp.CefSharpSettings.LegacyJavascriptBindingEnabled = True

        Cef = New ChromiumWebBrowser(Methods.StartPath)

        '注冊js對象
        Try
            Dim sett As New BrowserSettings
            sett.WebSecurity = CefState.Disabled
            Cef.BrowserSettings = sett
            Cef.RegisterAsyncJsObject("wnd", Methods)
        Catch ex As Exception
            MsgBox(ex.Message)
        End Try

        Controls.Add(Cef)
        Cef.Dock = DockStyle.Fill
    End Sub

    Public Sub CreateLnk(path As IO.DirectoryInfo)

        Dim wsh As Object = CreateObject("WScript.Shell")

        Dim Lnk As Object = wsh.CreateShortcut("C:\Users\Administrator\Desktop\" & path.Name & ".lnk")
        With Lnk
            .arguments = path.FullName
            .iconlocation = path.FullName + "\favicon.ico"
            .targetpath = Application.StartupPath + "\WebOnDisk.exe "
            .workingdirectory = Application.StartupPath
            .save()
        End With

    End Sub


    Private Sub Methods_CallJsEvent(methodname As String, args() As String) Handles Methods.CallJsEvent
        Try
            Cef.EvaluateScriptAsync(methodname, args)

        Catch ex As Exception
            MsgBox(ex.Message)
        End Try
    End Sub

    Private Sub Methods_LoadEvent(url As String) Handles Methods.LoadEvent
        Cef.Load(url)
    End Sub

    Private Sub Methods_SetDevToolsEvent(isShow As Boolean) Handles Methods.SetDevToolsEvent
        If isShow Then
            Cef.ShowDevTools()
        Else
            Cef.CloseDevTools()
        End If
    End Sub

    Private Sub Cef_FrameLoadEnd(sender As Object, e As FrameLoadEndEventArgs) Handles Cef.FrameLoadEnd
        'Cef.ShowDevTools()
    End Sub

    Private Sub Methods_SingleInstanceCheck() Handles Methods.SingleInstanceCheck
        '單進程檢測
        If Methods.IsSingleInstance Then
            Dim ps() As Process = Process.GetProcessesByName(Me.ProductName)
            For Each p As Process In ps
                If p.MainWindowTitle = WorkPath.Name Then

                    SwitchToThisWindow(p.MainWindowHandle, 1)
                    Process.GetCurrentProcess.Kill()
                    Close()
                End If
            Next
        End If
    End Sub
End Class

如果不提供dll,給一個默認的類

Public Class DefMethod
    Inherits CustomerMethods.Class1

    Public Overrides Sub ending()

    End Sub

    Public Overrides Sub init()

    End Sub
End Class

如果要寫dll,繼承一下這個

Imports System.Web.Script.Serialization
Imports System.Windows.Forms

Public MustInherit Class Class1
    Public StartPath As String = ""
    Public MainForm As System.Windows.Forms.Form
    Public mIsSingleInstance As Boolean = False
    Public Event SingleInstanceCheck()
    Public Property IsSingleInstance
        Get
            Return mIsSingleInstance
        End Get
        Set(value)
            mIsSingleInstance = value
            RaiseEvent SingleInstanceCheck()
        End Set
    End Property

    Public MustOverride Sub init()
    Public MustOverride Sub ending()

    Public Event CallJsEvent(methodname As String, args() As String)
    Public Sub calljs(methodname As String, ParamArray args() As String)

        RaiseEvent CallJsEvent(methodname, args)
    End Sub

    Public Event SetDevToolsEvent(isShow As Boolean)
    
    Public Sub showDevTools()
        RaiseEvent SetDevToolsEvent(True)
    End Sub

    Public Sub closeDevTools()
        RaiseEvent SetDevToolsEvent(False)
    End Sub

    Public Event LoadEvent(url As String)
    Public Sub load(url As String)
        RaiseEvent LoadEvent(url)
    End Sub

    Public Sub SetWindowBounds(bound As Drawing.Rectangle)
        MainForm.Bounds = bound
    End Sub
End Class

html和vue那邊的目錄結構

 

大概就這樣吧,大體上一個簡單的nw就搞出來了,只能說簡陋

下回說說vue那點兒事兒吧。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM