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 日韩一级片在线,免费看片亚洲,国产免费一级精品视频

          整合營銷服務(wù)商

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

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

          javascript中的鍵盤抬起事件onkeyup實(shí)

          javascript中的鍵盤抬起事件onkeyup實(shí)現(xiàn)文本域的輸入字?jǐn)?shù)控制

          實(shí)際運(yùn)用中啊隨處可見的就是PC端的字?jǐn)?shù)控制案例,如標(biāo)題只能多少字 內(nèi)容多少字 密碼多少長度等等等等,那么這些功能它是怎么實(shí)現(xiàn)的呢,今兒這個(gè)小分享道哥就給大家分享一下怎么用js去實(shí)現(xiàn)文字的輸入控制。

          已知有如下html代碼

          <p class="p1"> 
          計(jì)算剩余字?jǐn)?shù)<br> 
          <textarea cols="70" rows="8" id="msg" onkeyup="test()"></textarea><br> 
          <span id="msg_s"></span> 	
          </p>
          

          要實(shí)現(xiàn)在文本域textarea中輸入長度不能超過50的字符并且剩余字?jǐn)?shù)跟隨輸入的內(nèi)容不斷變化,提示還可以輸入多少個(gè)字符 (要注意的是一個(gè)中文占兩個(gè)字符 一個(gè)英文字母或者符號占一個(gè)字符)

          代碼如下

          <script type="text/javascript">
          	function test2(){
          		//取出文本框中文本內(nèi)容 
          		var a=document.getElementById("msg");
          		var len=50-a.value.length; //與50作比較,得道剩余字?jǐn)?shù)
          		if(len>0){ 
          			//如果剩余字?jǐn)?shù)大于0,則提示剩余字?jǐn)?shù)
          			document.getElementById("msg_s").innerHTML="您還剩余"+len+"個(gè)字";
          		}else{
          			//如果剩余字?jǐn)?shù)小于0,即字?jǐn)?shù)已超出,則只留前50個(gè)字
          			document.getElementById("msg_s").innerHTML="您還剩余0個(gè)字";
          			a.value=a.value.substr(0,50);
          		}
          	}
          </script>
          

          運(yùn)行結(jié)果如下

          文為大家推薦一些實(shí)用的JavaScript鍵盤封裝器,希望在今后的前端過程中有所幫助!

          1、mousetrap(處理鍵盤快捷鍵的 JavaScript 庫)

          2、Keypress(鍵入捕捉工具庫,任何鍵都可以成為一個(gè)修飾健)

          3、KeyboardJS(一個(gè)用于綁定鍵盤組合的 JavaScript 庫,讓你脫離快捷鍵和快捷鍵組合沖突的痛苦)

          4、jquery.hotkeys(jQuery Hotkeys 能讓你在代碼任何的地方監(jiān)聽鍵盤事件,并幾乎支持所有按鍵組合)

          5、jwerty(令人驚嘆的鍵盤事件處理庫)

          6、keymaster(定義和調(diào)度鍵盤快捷鍵的小型庫)

          切版 qieban(.cn)

          ut.js 是 Node.js 的桌面自動化框架,允許您使用 JavaScript 或 TypeScript 對鼠標(biāo)和鍵盤進(jìn)行編程!

          第一步

          nut.js 的第一步——從安裝到自動化鼠標(biāo)移動

          先決條件


          nut.js 為您各自的目標(biāo)平臺提供了預(yù)構(gòu)建版本的 OpenCV。為了使用這些預(yù)編譯的綁定,必須滿足某些運(yùn)行時(shí)條件。

          Windows


          如果您運(yùn)行的是 Windows 10 N 并且想要使用 ImageFinder 插件,請確保安裝了媒體功能包。

          macOS


          在 macOS 上,需要 Xcode 命令行工具。您可以通過運(yùn)行以下命令來安裝它們:

          xcode-select --install

          注意:

          如果您遇到鼠標(biāo)不動或鍵盤不打字等問題,請確保為您執(zhí)行測試的進(jìn)程提供可訪問權(quán)限。

          如果缺少權(quán)限,nut.js 會給你一個(gè)提示:

          ##### WARNING! The application running this script is not a trusted process! Please visit https://github.com/nut-tree/nut.js#macos #####

          當(dāng)應(yīng)用程序想要使用輔助功能時(shí),應(yīng)該顯示權(quán)限彈出窗口。如果沒有,您可以嘗試手動添加運(yùn)行腳本的應(yīng)用程序。

          設(shè)置 -> 安全和隱私 -> 隱私選項(xiàng)卡 -> 輔助功能 -> 添加...

          例如,如果你想在iTerm2執(zhí)行你的node腳本,您必須將 iTerm.app 添加到列表中。從內(nèi)置終端運(yùn)行腳本時(shí),例如 VSCode 或 IntelliJ,您必須添加相應(yīng)的 IDE。


          Linux


          根據(jù)您的發(fā)行版,Linux 設(shè)置可能會有所不同。

          一般來說,nut.js 需要 libXtst

          在 *buntu 發(fā)行版上安裝:

          sudo apt-get install build-essential libxtst-dev

          其他linux發(fā)行版的設(shè)置可能不同。

          node.js


          nut.js 針對各種版本的node.js構(gòu)建和測試的。但是,為了獲得最佳兼容性,建議運(yùn)行node.js的最新可用 LTS 版本(在撰寫本文時(shí)為 lts/gallium)并使用像 nvm 這樣的版本管理器。

          安裝


          滿足我們的先決條件后,讓我們繼續(xù)安裝。以下步驟將在您選擇的目錄中執(zhí)行。我們將此目錄簡稱為工作目錄。

          npm project


          讓我們首先通過執(zhí)行以下命令在我們的工作目錄中初始化一個(gè)新的 npm 項(xiàng)目:

          npm init

          隨意填寫交互式對話,但這并不是繼續(xù)初始設(shè)置的硬性要求。

          (你可以通過運(yùn)行 npm init -y 來接受所有默認(rèn)值)

          安裝nut.js


          運(yùn)行

          npm i @nut-tree/nut-js

          yarn add @nut-tree/nut-js

          在我們新創(chuàng)建的 npm 項(xiàng)目中,將安裝 nut.js 及其所需的依賴項(xiàng)。

          快照發(fā)布版


          nut.js 還提供快照版本,允許測試即將推出的功能。

          運(yùn)行

          npm i @nut-tree/nut-js@next

          或者

          yarn add @nut-tree/nut-js@next

          將安裝最新的 nut.js 開發(fā)版本。

          注意:雖然快照版本非常適合在新的穩(wěn)定版本之前與即將推出的功能一起使用,但它仍然是快照版本。請記住,快照版本在將來可能會發(fā)生變化和/或中斷,因此不建議在生產(chǎn)中使用它們 .

          動起來


          現(xiàn)在都已準(zhǔn)備就緒,是時(shí)候開始行動了!

          在我們的工作目錄中,讓我們創(chuàng)建一個(gè)新文件 index.js。

          在您喜歡的編輯器中打開它并添加以下行以開始使用:

          const { mouse }=require("@nut-tree/nut-js");
          
          (async ()=> {
              
          })();

          mouse 讓您可以控制您的鼠標(biāo),讓我們來玩一玩吧!

          注意:nut.js 是完全異步的,所以在大多數(shù)示例中你會看到類似上面代碼片段的內(nèi)容,這是一個(gè)異步操作 IIFE,用作在頂層使用 async / await 的變通方法。

          簡單移動鼠標(biāo)


          const { mouse, left, right, up, down }=require("@nut-tree/nut-js");
          
          (async ()=> {
              await mouse.move(left(500));
              await mouse.move(up(500));
              await mouse.move(right(500));
              await mouse.move(down(500))
          })();

          nut.js 提供了一個(gè)聲明式 API,因此我們可以使用 MovementApi 函數(shù)將光標(biāo)相對于當(dāng)前位置移動,而不是明確指明光標(biāo)移動到的位置。

          當(dāng)通過 node index.js 執(zhí)行時(shí),你會看到你的光標(biāo)沿著一個(gè)正方形的變移動,并結(jié)束在它的初始位置。

          針對特定點(diǎn)


          能夠向上、向下、向左或向右移動光標(biāo)是一個(gè)好的開始,但我們并不是坐在畫板前素描。讓我們看看如何在屏幕上定位特定點(diǎn)。

          const { mouse, straightTo, Point }=require("@nut-tree/nut-js");
          
          (async ()=> {
              const target=new Point(500, 350);
              
              await mouse.move(straightTo(target));
          })();

          straightTo 是另一個(gè) MovementApi 函數(shù),它接受一個(gè)目標(biāo)點(diǎn)并計(jì)算一條朝向它的直線,從我們當(dāng)前的光標(biāo)位置開始到目標(biāo)點(diǎn)。

          加速/減速


          如果您想將鼠標(biāo)移動速度配置得更快/更慢,nut.js 公開的每個(gè)實(shí)例都提供了一個(gè)配置對象。

          鼠標(biāo)配置對象允許您配置以像素/秒為單位的移動速度。

          const { mouse, straightTo, Point }=require("@nut-tree/nut-js");
          
          (async ()=> {
              mouse.config.mouseSpeed=2000;
              const fast=new Point(500, 350);
              await mouse.move(straightTo(fast));
              mouse.config.mouseSpeed=100;
              const slow=new Point(100, 150);
              await mouse.move(straightTo(slow));
          })();

          瞬移


          有時(shí)我們不想沿著路徑移動到某個(gè)點(diǎn)。

          在這種情況下,我們可以依靠 setPosition 立即將光標(biāo)位置更改為提供的點(diǎn)。

          const { mouse, Point }=require("@nut-tree/nut-js");
          
          (async ()=> {
              const target=new Point(500, 350);
              await mouse.setPosition(target);
          })();

          總結(jié)


          • nut.js 提供了mouse實(shí)例來控制你的光標(biāo)。
          • 以像素/秒為單位的移動速度可通過配置對象進(jìn)行配置。
          • 它提供了一個(gè)高級 MovementApi 以方便相對鼠標(biāo)起始點(diǎn)移動。
          • 對于快速更改光標(biāo)位置,setPosition 是正確的方法。

          屏幕搜索

          了解如何在屏幕上搜索圖像以將其用于自動化

          圖像搜索


          “張圖片勝過千言萬語”

          nut.js 允許您在屏幕上定位圖像,這是自動化的一個(gè)關(guān)鍵功能。

          ImageFinder 提供程序


          為此,我們必須安裝一個(gè)額外的包,提供執(zhí)行圖像比較的功能。否則,所有依賴圖像匹配的函數(shù)都會拋出錯(cuò)誤,如 Error: No ImageFinder registered。

          一個(gè)可用的選項(xiàng)是@nut-tree/template-matcher:

          npm i @nut-tree/template-matcher

          要使用此提供程序包,只需在您的代碼中引入它,例如 index.js:

          const { screen, imageResource }=require("@nut-tree/nut-js");
          require("@nut-tree/template-matcher"); // 這是新加的
          
          (async ()=> {
            try {
              await screen.find(imageResource("img.png"));
            } catch (e) {
              console.error(e);
            }
          })();

          提供程序的功能


          find、findAll 和 waitFor 是圖像搜索的主要函數(shù)。

          當(dāng) find 和 findAll 嘗試立即在屏幕上定位圖像時(shí),waitFor 將重復(fù)掃描屏幕以查找圖像,直到達(dá)到特定的超時(shí)時(shí)間。

          默認(rèn)情況下,圖像搜索是在多個(gè)尺度上進(jìn)行的。

          在自動化更復(fù)雜的任務(wù)時(shí),上述所有功能都是非常強(qiáng)大的幫手,所以讓我們看看如何利用它們來發(fā)揮我們的優(yōu)勢!

          使用模板圖像


          為了在您的屏幕上搜索圖像,我們必須提供模板圖像。

          這些圖像可以通過它們的完整路徑和 loadImage 加載,也可以相對于可配置的資源目錄加載。

          資源目錄


          使用資源目錄時(shí),您可以通過文件名引用模板圖像,省略完整路徑。在加載模板圖像時(shí),這些文件名是相對于 screen.config.resourceDirectory 的。

          screen.config.resourceDirectory="/path/to/my/template/images"

          如果未明確配置,screen.config.resourceDirectory 將設(shè)置為當(dāng)前工作目錄。

          從資源目錄加載圖像


          不使用 loadImage,而是通過 imageResource 加載所謂的圖像資源。

          從遠(yuǎn)程主機(jī)獲取圖像


          fetchFromUrl 允許您將 URL 傳遞給位于遠(yuǎn)程主機(jī)上的圖像,該圖像將被獲取并作為 nut.js 圖像返回。

          find


          模板圖像是使用其完整路徑直接加載的圖像,相對于可配置的資源目錄或通過 fetchFromUrl 從遠(yuǎn)程主機(jī)加載。

          尋找圖像


          讓我們通過查看示例片段來剖析 screen.find 的工作原理:

          const { screen, imageResource }=require("@nut-tree/nut-js");
          require("@nut-tree/template-matcher");
          
          (async ()=> {
              screen.config.resourceDirectory="/resouce/path";
              try {
                  const region=await screen.find(imageResource("mouse.png"));
                  console.log(region);
              } catch (e) {
                  console.error(e);
              }
          })();

          首先,在第 1 行和第 2 行設(shè)置導(dǎo)入。

          第 5 行設(shè)置我們的資源目錄,盡管最有趣的事情發(fā)生在第 7 行:實(shí)際搜索圖像。

          screen.find 將掃描您的主屏幕以查找提供的模板圖像,如果找到匹配項(xiàng),它將返回模板圖像所在的區(qū)域。圖像以每個(gè)像素為基礎(chǔ)進(jìn)行匹配。匹配像素的數(shù)量是可配置的, 通過配置對象的 confidence 屬性設(shè)置。confidence 應(yīng)為 0 到 1 之間的值,默認(rèn)為 0.99(對應(yīng)于 99% 匹配)。

          nut.js 目前不支持多顯示器設(shè)置

          跨平臺技巧


          資源目錄起初可能看起來讓你很混亂,但它實(shí)際上有一個(gè)非常好的副作用。想象一下編寫一個(gè)跨平臺的自動化腳本,我們正在處理不同的 UI,因此需要處理不同的模板圖像。

          使用資源目錄,我們可以根據(jù)當(dāng)前平臺配置目錄:

          screen.config.resourceDirectory=`/path/to/the/project/${process.platform}`;

          這樣,我們可以將所有特定于平臺的模板圖像保存在單獨(dú)的文件夾中,這樣我們不必關(guān)心我們的代碼了。

          通過使用依賴于平臺的資源目錄,我們不必處理平臺特定的文件名。相同的文件名將為當(dāng)前平臺加載正確的模板圖像,無需進(jìn)一步操作!

          故障排除


          萬一我們搞砸了,nut.js 會通過拒絕拋出錯(cuò)誤讓我們知道。

          錯(cuò)誤的資源目錄


          Searching for mouse.png failed. Reason: 'Error: Failed to load /foo/bar/mouse.png. Reason: 'Failed to load image from '/foo/bar/mouse.png''.'

          未找到匹配圖像


          Searching for mouse.png failed. Reason: 'Error: No match with required confidence 0.99. Best match: 0 at (0, 0, 477, 328)'

          總結(jié)


          • nut.js 提供了一個(gè)屏幕實(shí)例來搜索屏幕上的模板圖像。
          • 從中加載模板圖像的目錄可通過配置對象進(jìn)行配置。
          • 它將在您的主屏幕上搜索模板圖像,如果找到匹配項(xiàng),它將返回模板圖像所在的區(qū)域。
          • 匹配像素的數(shù)量可通過配置對象的置信度屬性進(jìn)行配置。

          findAll


          findAll 與 find 的用法非常相似。兩者之間的主要區(qū)別在于 findAll 將在主屏幕上返回所有檢測到的匹配項(xiàng)的列表。

          find 中提到的所有其他內(nèi)容也適用于 findAll。

          waitFor


          能夠在我們的屏幕上定位圖像在自動化時(shí)是一個(gè)巨大的有事,但實(shí)際上,我們必須處理時(shí)間超時(shí)。waitFor 在這里幫助我們指定一個(gè)超時(shí)時(shí)長,希望多久時(shí)間內(nèi)我們的模板圖像出現(xiàn)在屏幕上 !

          模板圖像是使用其完整路徑直接加載的圖像,相對于可配置的資源目錄或通過 fetchFromUrl 從遠(yuǎn)程主機(jī)加載。

          等待圖像


          讓我們稍微調(diào)整一下查找示例中使用的代碼片段:

          const { screen, imageResource }=require("@nut-tree/nut-js");
          require("@nut-tree/template-matcher");
          
          (async ()=> {
              screen.config.resourceDirectory="/resouce/path";
              try {
                  const region=await screen.waitFor(imageResource("mouse.png"));
                  console.log(region);
              } catch (e) {
                  console.error(e);
              }
          })();

          waitFor 基本上與 find 完全相同,但在指定的時(shí)間段內(nèi)執(zhí)行多次。

          它會掃描您的主屏幕以查找給定的模板圖像,但如果找不到它,它會再試一次。這些重試發(fā)生的時(shí)間間隔也是可配置的。

          const { screen, imageResource }=require("@nut-tree/nut-js");
          require("@nut-tree/template-matcher");
          
          (async ()=> {
              screen.config.resourceDirectory="/resouce/path";
              try {
                  const region=await screen.waitFor(imageResource("mouse.png"), 5000, 1000);
                  console.log(region);
              } catch (e) {
                  console.error(e);
              }
          })();

          在上面的代碼片段中,我們告訴 waitFor 最多尋找模板圖像五秒鐘,每秒重試一次。

          如果在配置的毫秒超時(shí)后仍然找不到圖像,它將拒絕。否則,它將返回它定位圖像的區(qū)域,就像查找一樣。

          故障排除


          find 中提到的所有內(nèi)容也適用于 waitFor。

          超時(shí)


          操作在 5000 毫秒后超時(shí)

          總結(jié)


          • waitFor 將重復(fù)搜索您的主屏幕以查找模板圖像,如果找到匹配項(xiàng),它將返回模板圖像所在的區(qū)域。
          • 如果找不到圖像,它將以可配置的時(shí)間間隔重試搜索,直到達(dá)到配置的超時(shí)(以毫秒為單位)。

          取消waitFor


          正如我們之前了解到的,waitFor 將重復(fù)搜索我們的屏幕以查找給定的模板圖像。

          這種巨大的靈活性不是免費(fèi)的,因此我們可能不想等待超時(shí)觸發(fā)才能取消正在進(jìn)行的搜索。nut.js 遵循與瀏覽器獲取 API 相同的取消方法,使用 AbortController。

          在我們實(shí)際查看示例之前,我們必須為我們的項(xiàng)目安裝一個(gè)額外的包:

          npm i node-abort-controller

          現(xiàn)在,讓我們看一個(gè)(人為的)例子:

          const { screen, Region, imageResource }=require("@nut-tree/nut-js");
          require("@nut-tree/template-matcher");
          const { AbortController }=require("node-abort-controller");
          
          (async ()=> {
              const controller=new AbortController();
              screen.waitFor(imageResource("test.png"), 5000, 1000, {abort: controller.signal});
              setTimeout(()=> controller.abort(), 2000);
          })();

          我們在第 6 行實(shí)例化我們的 AbortController 并將其信號作為 OptionalSearchParameter 傳遞給 waitFor。

          waitFor 配置了 5000 毫秒的超時(shí),1000 毫秒后重試,但 2000 毫秒后,我們在 AbortController 上調(diào)用 abort() ,這將取消正在進(jìn)行的搜索:

          Action aborted by signal

          總結(jié)


          • waitFor 可以使用 AbortController 取消。

          突出顯示


          特別是在開發(fā)過程中,我們可能希望直觀地跟蹤執(zhí)行腳本時(shí)發(fā)生的情況。尤其是在當(dāng)涉及到圖像搜索時(shí)。 我們找到匹配項(xiàng)的日志,但視覺指示器會更好。

          高亮就是用來解決這個(gè)問題的!

          配置



          通過用不透明的突出顯示窗口覆蓋感興趣區(qū)域來突出顯示區(qū)域。

          高亮顯示持續(xù)時(shí)間和不透明度成為 screen.config 對象上的可配置屬性。

          • highlightDurationMs
          • highlightOpacity

          突出顯示區(qū)域


          highlight 接收一個(gè) Region 指定要突出顯示的區(qū)域。然后它將用不透明的突出顯示窗口覆蓋給定的區(qū)域。

          const { screen, Region }=require("@nut-tree/nut-js");
          
          (async ()=> {
              screen.config.highlightDurationMs=3000;
              const highlightRegion=new Region(50, 100, 200, 300);
              await screen.highlight(highlightRegion);
          })();

          自動突出顯示


          API 的結(jié)構(gòu)方式非常容易突出顯示位于例如位置的區(qū)域。 尋找:

          const { screen, imageResource }=require("@nut-tree/nut-js");
          require("@nut-tree/template-matcher");
          
          (async ()=> {
              screen.config.resourceDirectory="/resouce/path";
              screen.config.highlightDurationMs=3000;
              await screen.highlight(screen.find(imageResource("image.png")));
          })();

          然而,手動添加突出顯示不僅麻煩,而且還需要額外的工作,因?yàn)槲覀冊谏a(chǎn)環(huán)境中運(yùn)行腳本之前要再次刪除它。

          因此,nut.js 提供了一種自動高亮機(jī)制,可通過配置屬性切換。在開發(fā)期間突出顯示,在生產(chǎn)中禁用它!

          const { screen, imageResource }=require("@nut-tree/nut-js");
          require("@nut-tree/template-matcher");
          
          (async ()=> {
              screen.config.resourceDirectory="/resouce/path";
              screen.config.autoHighlight=true;
              screen.config.highlightDurationMs=1500;
              await screen.find(imageResource("test.png"));
          })();

          開啟自動高亮后,我們再也不用關(guān)心手動高亮查找結(jié)果了。一旦find返回一個(gè)有效的Region,它就會被高亮顯示。而且由于waitFor重用了find,自動高亮也在那里起作用!

          Summary


          • nut.js 提供了一種可視化調(diào)試圖像搜索結(jié)果的方法。
          • 突出顯示持續(xù)時(shí)間和突出顯示窗口不透明度都可以通過配置對象進(jìn)行配置。
          • 自動突出顯示將自動突出顯示從查找返回的結(jié)果。

          參數(shù)化搜索


          find、findAll 和 waitFor 接受 OptionalSearchParameters 以微調(diào)搜索。

          這允許例如 將搜索空間限制在屏幕的特定部分:

          const { screen, Region, OptionalSearchParameters, imageResource }=require("@nut-tree/nut-js");
          require("@nut-tree/template-matcher");
          const { AbortController }=require("node-abort-controller");
          
          (async ()=> {
              // 配置你希望搜索的區(qū)域的位置和大小
              const searchRegion=new Region(10, 10, 500, 500);
              
              // 配置您希望 Nut 在找到匹配項(xiàng)之前擁有的相似度比率
              const confidence=0.88;
              
              // 配置一個(gè) Abort controller,這樣可以隨時(shí)取消查找操作
              const controller=new AbortController();
              const { signal }=controller;
              
              // 將您的參數(shù)輸入 OptionalSearchParameters 構(gòu)造函數(shù)以確保它們符合規(guī)范
              const fullSearchOptionsConfiguration=new OptionalSearchParameters(searchRegion, confidence, signal);
              
              //.find() 將根據(jù)您的搜索參數(shù)和提供的圖像數(shù)據(jù)返回找到匹配項(xiàng)的區(qū)域
              const matchRegion=await screen.find(imageResource("image.png"), fullSearchOptionsConfiguration);
              
              const cancelFindTimeout=setTimeout(()=> {
                controller.abort();
              }, 5000);
              
              
          })();

          單一與多尺度搜索


          多尺度圖像搜索讓您在多個(gè)屏幕分辨率之間切換時(shí)具有彈性,但也有代價(jià)。與在單一尺度上搜索相比,在多個(gè)尺度上搜索時(shí)可能需要更長的時(shí)間。

          根據(jù)您手頭的任務(wù),您可能不需要這種額外的靈活性,而是希望從更快的執(zhí)行中獲益。有關(guān)示例,請參見此示例測試結(jié)果:

          hyperfine --warmup 3 'node multi-scale.js' 'node single-scale.js' --show-output
          Benchmark 1: node multi-scale.js
            Time (mean ± σ):     933.5 ms ±  10.4 ms    [User: 1647.4 ms, System: 433.8 ms]
            Range (min … max):   920.9 ms … 948.4 ms    10 runs
          
          Benchmark 2: node single-scale.js
            Time (mean ± σ):     526.8 ms ±   9.3 ms    [User: 400.2 ms, System: 108.4 ms]
            Range (min … max):   514.3 ms … 544.4 ms    10 runs
          
          Summary
            'node single-scale.js' ran
              1.77 ± 0.04 times faster than 'node multi-scale.js'

          使用窗口

          了解如何通過使用窗口來增強(qiáng)您的工作流程

          getActiveWindow 允許您在函數(shù)調(diào)用時(shí)獲取系統(tǒng)焦點(diǎn)窗口的 Window 引用。getActiveWindow 將作為 Promise 返回。

          const { getActiveWindow }=require('@nut-tree/nut-js');
          
          (async ()=> {
              const windowRef=await getActiveWindow();
          })();

          現(xiàn)在單獨(dú)輸出這個(gè)不會很有用,記住它只是一個(gè)參考:

          // source:
          //  ...
              const windowRef=await getActiveWindow();
              console.log(windowRef);
          //  ...
          
          // output:
          Window {
            providerRegistry: DefaultProviderRegistry {
            // ...
            },
            windowHandle: 2165090
          }

          相反,我們想利用窗口的標(biāo)題和區(qū)域?qū)傩浴?不過要小心,這些是 getter 屬性,每個(gè)屬性都返回一個(gè) Promise 而不是一個(gè)普通值——所以我們必須使用 await :

          const { getActiveWindow }=require('@nut-tree/nut-js');
          
          (async ()=> {
              const windowRef=await getActiveWindow();
              const title=await windowRef.title
              const region=await windowRef.region
              console.log(title, region)
          })();

          您還可以并行而不是順序等待這些值,如下所示:

          const { getActiveWindow }=require('@nut-tree/nut-js');
          
          (async ()=> {
              const windowRef=await getActiveWindow();
              const [title, region]=await Promise.all([windowRef.title, windowRef.region])
              console.log(title, region)
          })();

          此外,請注意此腳本將始終詳細(xì)說明您從中運(yùn)行它的 shell 的窗口信息。 要嘗試獲取不同窗口的詳細(xì)信息,請考慮在調(diào)用 getActiveWindow 之前添加延遲。 我們可以使用 nut.js 自帶的 sleep 輔助函數(shù)來實(shí)現(xiàn):

          const { getActiveWindow, sleep }=require('@nut-tree/nut-js');
          
          (async ()=> {
              await sleep(4000) //延遲 4 秒再繼續(xù)
              const windowRef=await getActiveWindow();
              const [title, region]=await Promise.all([windowRef.title, windowRef.region])
              console.log(title, region)
          })();

          示例


          在激活窗口內(nèi)點(diǎn)擊


          const { getActiveWindow, centerOf, randomPointIn, mouse, sleep }=require('@nut-tree/nut-js');
          
          (async ()=> {
              const windowRef=await getActiveWindow();
              const region=await windowRef.region
              await mouse.setPosition(await centerOf(region))
              await mouse.leftClick()
              await sleep(1000)
              await mouse.setPosition(await randomPointIn(region))
              await mouse.leftClick()
          })();

          重復(fù)記錄活動窗口信息


          主站蜘蛛池模板: 亚洲AV无码一区二区大桥未久| 一区二区中文字幕在线观看| 精品一区精品二区| 中文字幕一区二区精品区| 国产一区二区三区在线看片 | 亚洲一区二区三区91| 一区二区视频免费观看| 国产精品av一区二区三区不卡蜜| 无码人妻AV免费一区二区三区| 亚洲欧洲一区二区三区| 日韩精品一区二三区中文| 欧洲精品码一区二区三区| 麻豆一区二区免费播放网站| 国产一区二区免费视频| 亚洲一区二区三区自拍公司| 国产一区二区视频在线播放| 一区二区三区免费视频播放器| 日本精品一区二区在线播放| 亚洲欧美一区二区三区日产| 亚洲AV一区二区三区四区| 日韩一区二区超清视频| 无码丰满熟妇一区二区| 亚洲一区在线免费观看| 日本片免费观看一区二区| 日韩人妻不卡一区二区三区| 久久国产精品一区免费下载| 麻豆精品久久久一区二区| 久久国产免费一区| 亚洲欧美日韩一区二区三区在线 | 亚洲日韩精品无码一区二区三区 | 中文字幕精品亚洲无线码一区应用| 国产一区二区三区免费看| 国产亚洲福利一区二区免费看| 免费萌白酱国产一区二区| 国产一区二区三区播放| 成人精品一区二区三区中文字幕| 国产亚洲一区二区三区在线不卡 | 99精品国产高清一区二区三区 | 亚洲高清一区二区三区| 无码一区二区波多野结衣播放搜索| 亚洲Av永久无码精品一区二区|