代码改变世界

Winform启动隐藏,WebBrowser交互JS

  stoneniqiu  阅读(1166)  评论(0编辑  收藏  举报

  一、启动隐藏  

  Winform比较奇怪,Load的时候设置Visiable=false,无效。webBrowser_DocumentCompleted之后调用hide隐藏了窗体,但是在notifyIcon调用show也不能打开窗体。各种奇葩问题。最后stackOverFlow上找到答案。设置透明度,和取消显示在任务栏。

 private void Form1_Load(object sender, EventArgs e)
        {
            webBrowser1.ObjectForScripting = this;
            WindowState = FormWindowState.Minimized;
            Opacity = 0;
            ShowInTaskbar = false;
        }

 在notifyIcon点击的时候触发:

复制代码
 private void SCADAnotifyIcon_Click(object sender, EventArgs e)
        {
            if (WindowState != FormWindowState.Normal||Visible==false)
            {
                WindowState = FormWindowState.Normal;
                Visible = true;
                Opacity =1;
                ShowInTaskbar = true;
            }
            else
            {
                Visible = false;
            }
        }
复制代码

达到想要的效果,启动后隐藏,只出现在托盘中。托盘再打开。

二、JS与C# 交互

  1.C#调用webbrowser中的JS

  javascript方法:

      function localversion(version) {
            $("#loadedversion").html(version);
        }
        function setName(name) {
            $("#pname").html(name);
        }

传递参数必须是objects数组。

复制代码
        /// <summary>
         /// 调用JS的方法设置一些信息
        /// </summary>
        /// <param name="o">The o.</param>
        /// <param name="f">The f.</param>
        private void InvokeJs(object o, string f)
        {
            _objects[0] = o;
            if (webBrowser1.Document != null) 
                webBrowser1.Document.InvokeScript(f, _objects);
        }
        private readonly object[] _objects = new object[1];
复制代码

调用的时候:

    private void CheckLocal()
        {
            InvokeJs(ConstFile.ROOLBACKFILE, "setName");
            InvokeJs(_autoUpdater.GetLoadedVersion(), "localversion");
        }

 2.js调用C#。

 需要在方法或者类上面标记:

   [System.Runtime.InteropServices.ComVisible(true)]

在html页面中直接对应过来即可。

 <button id="checkUpdate" onclick="window.external.CheckUpdate()" class="btn btn-success btn-small">检查更新</button>
<button id="installer" class="btn btn-info  btn-small" onclick="window.external.RunInstaller()"  >安装</button>

这两个按钮会分别触发Form中的方法:

复制代码
        /// <summary>
        /// 安装
        /// </summary>
        public void RunInstaller()
        { 
           _autoUpdater.RunInstaller();
        }
      public void CheckUpdate()
        {
       //........
       }
复制代码

 

 

 

 

 

编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
点击右上角即可分享
微信分享提示