Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 亚洲男男视频,国产younv交在线视频,欧美日韩在线观看视频

          整合營(yíng)銷服務(wù)商

          電腦端+手機(jī)端+微信端=數(shù)據(jù)同步管理

          免費(fèi)咨詢熱線:

          WebBrowser控件自動(dòng)提交表單

          作中有這樣的場(chǎng)景,需要手動(dòng)填寫很多格式一樣的表單,然后點(diǎn)擊提交。如果數(shù)據(jù)在Excel中,一個(gè)個(gè)的copy,重復(fù)性工作太繁瑣。今天就介紹一個(gè)實(shí)現(xiàn)網(wǎng)頁自動(dòng)化的控件--WebBrowser控件。

          ﹥﹥先給大家看看效果:(自動(dòng)填寫注冊(cè)頁面的表單數(shù)據(jù))




          這個(gè)效果稍做改變,加個(gè)循環(huán),就可以實(shí)現(xiàn)批量填入網(wǎng)頁表單數(shù)據(jù),并自動(dòng)提交。(備注:公司內(nèi)部的表單一般是不會(huì)有驗(yàn)證碼的,所以暫時(shí)不用考慮識(shí)別驗(yàn)證碼的工作。)

          這就是WebBrowser控件的強(qiáng)大之處。下面就教大家如何實(shí)現(xiàn)上述網(wǎng)頁自動(dòng)化的效果。

          ﹥﹥何為WebBrower?

          WebBrowser 是微軟提供的一個(gè)用于瀏覽網(wǎng)頁的 ActiveX 控件,是植入在程序中一個(gè)控件,網(wǎng)頁顯示在窗體中.可以利用WebBrowser 對(duì)網(wǎng)頁進(jìn)行控制,進(jìn)行一些操作。

          在VBA中WebBrowser 控件插入到 VBA 的用戶窗體、一般情況下,VBA 的控件工具箱中找不到該控件,需要在控件工具箱點(diǎn)擊右鍵,在右鍵菜單中選擇“附加控件”,在附加控件對(duì)話框中,找到“Microsoft Web Browser”并且勾選。




          控件工具箱中出現(xiàn)一個(gè)地球形狀的控件,這樣就可以把該控件和其他控件一樣,拖放到用戶窗體中使用。




          ﹥﹥制作方法:

          ■第一步:拖拽控件到窗體上,添加兩個(gè)按鈕。一個(gè)是打開網(wǎng)頁按鈕,一個(gè)是填入數(shù)據(jù)按鈕、一個(gè)點(diǎn)擊【提交按鈕】的按鈕。(實(shí)際可以合為一個(gè)按鈕,這里只是為了方便演示操作)




          ■第二步:分析網(wǎng)頁結(jié)構(gòu),找出需要填寫的表單文本框ID,還有提交按鈕的ID。

          網(wǎng)頁F12調(diào)出開發(fā)者工具,可以看到,對(duì)應(yīng)于網(wǎng)頁上具體的控件內(nèi)容,都有具體的html代碼。




          找到填寫昵稱的代碼段,我們看到,昵稱文本框的ID為"inputName",這就是我們需要的。用相同的方法,找到其他幾個(gè)文本框的ID。




          ■第三步:雙擊"打開網(wǎng)頁"按鈕,填入以下代碼;

          Private Sub CommandButton1_Click()
           UserForm1.WebBrowser1.Navigate "http://zc.7k7k.com/"
           UserForm1.WebBrowser1.Silent = True'禁止安全彈窗提醒
          End Sub
          

          雙擊"填入數(shù)據(jù)"按鈕,填入以下代碼

          Private Sub CommandButton2_Click()
           With UserForm1.WebBrowser1.Document
           .getElementById("inputName").Value = Range("a2")
           .getElementById("inputPwd").Value = Range("b2")
           .getElementById("inputRePwd").Value = Range("b2")
           .getElementById("inputRealName").Value = Range("c2")
           .getElementById("inputCardId").Value = Range("d2")
           End With
          End Sub
          

          雙擊"點(diǎn)擊按鈕"按鈕,填入以下代碼:(實(shí)現(xiàn)提交按鈕的點(diǎn)擊)

          Private Sub CommandButton3_Click()
           Set doc = UserForm1.WebBrowser1.Document
           For i = 0 To doc.All.Length - 1
           If (LCase(doc.All(i).tagname)) = "input" Then
           If (LCase(doc.All(i).Type)) = "submit" Then
           Set tg = doc.All(i)
           tg.Click
           Exit Sub
           End If
           End If
           Next i
          End Sub
          


          這只是個(gè)簡(jiǎn)單的例子,復(fù)雜的網(wǎng)頁需要具體的分析解決。

          我們也可以利用WebBrowser控件提取網(wǎng)頁的數(shù)據(jù),因?yàn)榫W(wǎng)頁都是加載成功后的數(shù)據(jù),所以內(nèi)容基本都能提取成功。

          述:本文將討論如何用最簡(jiǎn)單的術(shù)語在網(wǎng)站上運(yùn)行 C# 代碼。半技術(shù)講座我使用了 wasm-tools-net7,這是一個(gè)基于 wasm-tools 的工作負(fù)載,沒有包含任何額外的包。我的重點(diǎn)是簡(jiǎn)單性和主要主題。徹底了解該主題可提供完成所有其他任務(wù)所需的信息。如何工作?WebAssembly 工作原理:序列圖創(chuàng)建演示創(chuàng)建項(xiàng)目我用的是net7,但這取決于你。Dotnet new console -o WASM_Demo cd WASM_Demo Dotnet workload install wasm-tools-net7此時(shí),需要對(duì) csproj 文件進(jìn)行修改。Project Sdk=Mi

          本文將討論如何用最簡(jiǎn)單的術(shù)語在網(wǎng)站上運(yùn)行 C# 代碼。

          半技術(shù)講座

          我使用了 wasm-tools-net7,這是一個(gè)基于 wasm-tools 的工作負(fù)載,沒有包含任何額外的包。我的重點(diǎn)是簡(jiǎn)單性和主要主題。徹底了解該主題可提供完成所有其他任務(wù)所需的信息。

          如何工作?

          WebAssembly 工作原理:序列圖

          創(chuàng)建演示

          創(chuàng)建項(xiàng)目

          • 我用的是net7,但這取決于你。
          Dotnet new console -o WASM_Demo  
            
          cd WASM_Demo  
            
          Dotnet workload install wasm-tools-net7
          

          此時(shí),需要對(duì) csproj 文件進(jìn)行修改。

          <Project Sdk="Microsoft.NET.Sdk">
          
              <PropertyGroup>
                  <OutputType>Exe</OutputType>
                  <TargetFramework>net7.0</TargetFramework>
                  <ImplicitUsings>enable</ImplicitUsings>
                  <Nullable>enable</Nullable>
          
                  <RuntimeIdentifier>browser-wasm</RuntimeIdentifier>
                  <WasmMainJSPath>main.js</WasmMainJSPath>
                  <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
              </PropertyGroup>
          
              <ItemGroup>
                  <WasmExtraFilesToDeploy Include="index.html" />
                  <WasmExtraFilesToDeploy Include="main.js" />
              </ItemGroup>
          
          </Project>

          我們添加了什么:

          • RuntimeIdentifier (wasm-tools 需要)
          • WasmMainJSPath (wasm-tools 需要)
          • AllowUnsafeBlocks(JSExportAttribute 需要不安全的代碼)
          • ItemGroup (Include as resource)導(dǎo)入 index.html導(dǎo)入main.js

          返回到program.cs文件,需要考慮某些規(guī)則。

          • 類必須是公共的和部分的。
          • 函數(shù)必須是公共的和靜態(tài)的,并且必須使用 [JSExport] 進(jìn)行屬性化。

          讓我們舉個(gè)例子。

          using System.Runtime.InteropServices.JavaScript;
          
          namespace WASM_Demo;
          
          public partial class Program
          {
              static void Main(string[] args) { }
          
              [JSExport]
              public static string Response()
              {
                  return """
                         <h1>
                             Hello World
                         </h1>
                         """;
              }
          }

          沒關(guān)系,但是我們?nèi)绾卧跒g覽器中運(yùn)行此代碼?

          運(yùn)行這個(gè)程序的代碼是dotnet.js的,它自帶了wasm-tools,所以沒有必要擔(dān)心它。要使用此dotnet.js,我們只需使用一個(gè)名為 main.js 的文件。

          import { dotnet } from './dotnet.js'
          
          const is_browser = typeof window != "undefined";
          if (!is_browser) throw new Error(`Expected to be running in a browser`);
          
          const { setModuleImports, getAssemblyExports, getConfig, runMainAndExit } = await dotnet
              .withDiagnosticTracing(false)
              .withApplicationArgumentsFromQuery()
              .create();
          
          const config = getConfig();
          const exports = await getAssemblyExports(config.mainAssemblyName);
          
          const html = 
              exports
                  .WASM_Demo    // Namespace
                  .Program      // Class Name
                  .Response();  // Function Name
          
          // Regular javascript code
          document.getElementById("app").innerHTML = `${html}`;
          
          await runMainAndExit(config.mainAssemblyName, [] /* Console App Args */);

          index.html頁面的模板已經(jīng)準(zhǔn)備完畢。

          <!DOCTYPE html>
          <html lang="en">
              <head>
                  <title>WASM Demo</title>
                  <meta charset="UTF-8" />
                  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
                  <link rel="modulepreload" href="./dotnet.js" />
              </head>
              
              <body>
                  <main id="app"></main>
                  <script type="module" src="./main.js"></script>
              </body>
          </html>

          現(xiàn)在,讓我們?cè)倏匆槐檫@個(gè)過程,

          • HTTP 請(qǐng)求傳入
          • WASM-Tools 處理此問題并發(fā)送index.html文件。
          • index.html文件請(qǐng)求dotnet.js和main.js文件,dotnet.js由 WASM-Tools 發(fā)送,main.js是我們的自定義代碼。
          • 通過在 main.js 中使用 dotnet.js,我們可以進(jìn)入 C# 代碼中的 Program 類,調(diào)用 Response 函數(shù)并在 main.js 中進(jìn)行我們想要的任何客戶端更改。

          我們還有一件事要做,你需要打開一個(gè)名為 runtimeconfig.template.json 的文件,并將以下 JSON 數(shù)據(jù)放入其中。

          {
            "wasmHostProperties": {
              "perHostConfig": [
                {
                  "name": "browser",
                  "html-path": "index.html",
                  "Host": "browser"
                }
              ]
            }
          }

          我們已經(jīng)到了盡頭,程序現(xiàn)在可以運(yùn)行了。唯一需要的命令是:

          Dotnet run -c Release
          

          常見問題

          我可以托管所有文件而不是 wasm-tools 嗎?又是如何做到的呢?

          當(dāng)然,但它可能會(huì)變得有點(diǎn)復(fù)雜,你用 wasm-tools 制作的項(xiàng)目不能用于任何其他目的,即控制臺(tái)應(yīng)用程序不起作用,wasm-tools 可以工作。因?yàn)槲覀冞x擇 browser-wasm 作為 RuntimeIdentifier,并且多個(gè) RuntimeIdentifiers 在 .NET 中不可用。作為替代方法,您可以打開兩個(gè)項(xiàng)目,將第一個(gè)項(xiàng)目設(shè)置為 WASM 項(xiàng)目,然后在第二個(gè)項(xiàng)目中將其設(shè)置為控制臺(tái)應(yīng)用程序,然后生成第一個(gè)項(xiàng)目并托管輸出文件夾,所有 DLL 和文件都將在那里。

          這個(gè)演示只是索引文件,我可以做多頁嗎?又是如何做到的呢?

          當(dāng)然,但這比你想象的要難得多,因?yàn)檫@樣做的方法是一種叫做SPA(單頁應(yīng)用程序)的方法,用戶總是在同一頁面上,只是內(nèi)容發(fā)生了變化。有多種方法可以做到這一點(diǎn)。所以它可以用你的創(chuàng)造力來完成。

          我可以像計(jì)數(shù)器一樣做動(dòng)態(tài)代碼嗎?又是如何做到的呢?

          _是的,我也這樣做了,你可以一遍又一遍地調(diào)用 C# 函數(shù),如果你只是將導(dǎo)出綁定到 window 對(duì)象,你可以從每個(gè) JavaScript 代碼中調(diào)用它。

          文主要以 HackerScreenSaver 新功能的開發(fā)經(jīng)歷介紹 webBrowser中網(wǎng)頁如何調(diào)用.NET方法的過程。

          1. 背景

          之前開源了一款名為 HackerScreenSaver 的 Windows 屏保程序。該程序具有模擬黑客炫酷界面的特點(diǎn),用戶可以將自定義的網(wǎng)頁作為鎖屏界面。不久前,有網(wǎng)友提出一個(gè)有趣的需求:能否在退出屏保時(shí)需要輸入密碼?雖然我不太清楚他的用意,但這個(gè)其實(shí)可以安排,不過需要變通一下。

          2. 新功能設(shè)計(jì)

          之前做這個(gè)程序的時(shí)候我就發(fā)現(xiàn),屏幕保護(hù)程序需要自己處理退出,如果屏保程序設(shè)計(jì)得不夠合理,可能會(huì)導(dǎo)致用戶在無法正常退出屏保時(shí)遇到困擾。所以在設(shè)計(jì)之初,我添加了 MouseKeyHook 用來監(jiān)聽全局的鍵鼠事件。

          那么設(shè)計(jì)新的功能來實(shí)現(xiàn)網(wǎng)友的需求也很簡(jiǎn)單,當(dāng)然不是直接的設(shè)計(jì)什么密碼輸入,然后判斷退出的功能。這里只需將屏保退出的功能提供給網(wǎng)頁控制就可以了。


          新增設(shè)置


          3. 網(wǎng)頁與 .NET 交互

          之前介紹到為了程序簡(jiǎn)易軟件采用了 webBrowser,那么為了讓網(wǎng)頁可以決定什么時(shí)候退出屏保,就需要讓 webBrowser 中的網(wǎng)頁可以調(diào)用 .NET 的方法。

          在網(wǎng)頁中,我們需要在屏保退出的邏輯部分添加一段 JavaScript 代碼,用于調(diào)用 .NET 方法。這段代碼的核心是 window.external 對(duì)象,它允許 JavaScript 訪問 .NET 對(duì)象。我們?cè)谟脩糨斎胝_密碼或者游戲勝利等條件下執(zhí)行下面的 JavaScript 代碼即可:

          window.external.ExecuteExitSrc();

          對(duì)于 .NET 代碼,可以創(chuàng)建一個(gè)和單獨(dú)的類以供 web 調(diào)用:

          • [ComVisible(true)]public class JavaScriptInteraction{ public void ExecuteExitSrc() { Application.Exit(); }}

            需要注意的是,我們需要在該類上添加一個(gè) [ComVisible(true)] 特性。這個(gè)特性使得該類的公共成員可以被 COM 組件訪問,從而實(shí)現(xiàn) JavaScript 與 .NET 方法之間的互操作,否則你會(huì)收到下面的錯(cuò)誤信息:

            System.ArgumentException:“ObjectForScripting 的類必須對(duì) COM 可見。請(qǐng)確認(rèn)該對(duì)象是公共的,或考慮向您的類添加 ComVisible 特性。”

            最后,需要在 webBrowser 控件的 ObjectForScripting 屬性中設(shè)置一個(gè) .NET 對(duì)象,這個(gè)對(duì)象將用于被 JavaScript 調(diào)用:

            webB.ObjectForScripting = new JavaScriptInteraction();

            4. 新的屏保

            為了演示新功能的使用,在 html 目錄中,提供了一個(gè)演示用的 exit.html 直接提供了網(wǎng)頁退出屏保的演示按鈕。

            新的功能提供了更多的可玩性,用戶可以根據(jù)自己的喜好設(shè)計(jì)各種有意思的屏保,這樣也是滿足了輸入密碼退出這個(gè)功能的實(shí)現(xiàn)基礎(chǔ)。當(dāng)然我們可以有許多有意思的功能可以自行設(shè)計(jì),比如:

            1.解謎屏保:設(shè)計(jì)一個(gè)帶有簡(jiǎn)單謎題的屏保,用戶需要在網(wǎng)頁上回答正確才能退出屏保。謎題可以是數(shù)學(xué)題、邏輯題或者常識(shí)題等,每次屏保激活時(shí),可以隨機(jī)從題庫中抽取一道題目。既然是題庫,甚至可以利用屏保學(xué)習(xí)各種知識(shí),比如英語單詞,各種考試題等等。2.拼圖屏保:制作一個(gè)拼圖游戲,用戶需要在網(wǎng)頁上完成拼圖才能退出屏保。可以使用用戶自己的照片作為拼圖素材,或者從網(wǎng)上隨機(jī)抓取圖片。拼圖難度可以根據(jù)用戶的喜好進(jìn)行調(diào)整。3.計(jì)時(shí)屏保:設(shè)置一個(gè)倒計(jì)時(shí)屏保,用戶需要在網(wǎng)頁上等待一段時(shí)間(例如,1分鐘)后才能退出屏保。在等待期間,可以展示一些有趣的事物,如名言警句、美麗的圖片或者實(shí)時(shí)新聞等。

            通過這些有趣的屏保設(shè)計(jì)方案,用戶在退出屏保時(shí)可以享受到更多互動(dòng)和趣味性。此外,這些方案還可以根據(jù)用戶的喜好和需求進(jìn)行定制和擴(kuò)展,為用戶帶來更豐富的屏保體驗(yàn)。

            同時(shí),我還在更新中提供了一個(gè)經(jīng)典的 2048 小游戲,要求玩家在贏得游戲后才能退出屏保。


            2048


            這個(gè)游戲改的邏輯其實(shí)是沒有改好的,也懶得調(diào)整了,更新一下游戲介紹也是可以的。


            游戲介紹



            提交信息


            5. 背后的哲學(xué)

            當(dāng)玩家在游戲中努力拼搏,最終贏得游戲時(shí),他們可能會(huì)發(fā)現(xiàn),游戲并沒有因此結(jié)束,屏保依然繼續(xù)運(yùn)行。這時(shí),他們可能會(huì)意識(shí)到,即使付出了努力,結(jié)果也不一定如人意。而當(dāng)玩家選擇投降并重新開始游戲10次后,他們將發(fā)現(xiàn)這個(gè)看似無用的操作竟然讓屏保退出,讓電腦恢復(fù)正常使用。

            也許只有努力過才會(huì)發(fā)現(xiàn),游戲還是投降躺平舒服些,只需要重開十次,就會(huì)被比你努力湊齊 2048 贏得游戲來退出屏保更快。人生有時(shí)就是這樣,在現(xiàn)實(shí)生活中,我們往往會(huì)面臨兩種選擇:努力拼搏還是躺平投降。有時(shí)候,努力拼搏的結(jié)果并不一定能讓我們達(dá)到預(yù)期的目標(biāo),反而可能讓我們陷入更深困境,帶來更多的困擾。而在某些情況下,選擇躺平投降,反而能讓我們以更輕松的心態(tài)面對(duì)問題,從而找到解決問題的更快方法。當(dāng)然,該拼搏的時(shí)候,還是需要努力一把,萬一就成功了呢?

            6. 最后

            本文向大家介紹了如何在 webBrowser 中的網(wǎng)頁調(diào)用 .NET 方法,以及如何在屏保程序中加入游戲元素。通過這些技巧,我們可以為用戶帶來更有趣的屏保體驗(yàn)。希望本文能對(duì)大家有所幫助,最后項(xiàng)目地址是:https://github.com/sangyuxiaowu/HackerScreenSaver?wt.mc_id=DT-MVP-5005195 感興趣的話,可以下載體驗(yàn)一下。


          主站蜘蛛池模板: 91久久精品一区二区| 国产怡春院无码一区二区 | www一区二区www免费| 久久综合精品不卡一区二区| 在线观看国产一区二三区| 色综合视频一区二区三区44| 本免费AV无码专区一区| 色综合视频一区二区三区| 变态调教一区二区三区| 99久久综合狠狠综合久久一区| 成人H动漫精品一区二区| 国产成人一区二区动漫精品| 久久一区二区明星换脸| 国产一区在线视频观看| 色一情一乱一伦一区二区三欧美 | 无码人妻一区二区三区在线水卜樱| 免费播放一区二区三区| 国精产品一区二区三区糖心 | 亚洲.国产.欧美一区二区三区| 一区二区视频在线| 国产在线观看一区精品| 日韩制服国产精品一区| 亚洲日韩精品一区二区三区无码| 中文字幕一区在线| 亚洲AV本道一区二区三区四区| 国产成人精品视频一区二区不卡| 日韩一区二区久久久久久| 亚洲AV日韩AV天堂一区二区三区| 亚洲av无码一区二区三区天堂古代| 骚片AV蜜桃精品一区| 无码人妻一区二区三区在线水卜樱| 国产美女露脸口爆吞精一区二区| 亚洲成人一区二区| 中文无码一区二区不卡αv| 精品无码国产一区二区三区51安| 国产一区二区精品久久岳√| 久久精品国产一区二区| 亚洲欧美日韩中文字幕在线一区| 天堂va视频一区二区| 日韩毛片一区视频免费| 国产亚洲综合一区柠檬导航|