項目場景:
客戶需求文檔中,要求在Win10系統(tǒng)下須使用Chrome谷歌瀏覽器展示頁面,但高層相關(guān)方希望頁面展示時可以實現(xiàn)全屏效果以提高用戶體驗。
對于谷歌瀏覽器的全屏功能來說,前端的實現(xiàn)已經(jīng)不行了,之前谷歌瀏覽器基于安全的考慮封禁了任何調(diào)用全屏的事件(必須用戶手勢user gesture),有嘗試過捕獲用戶手勢觸發(fā)點(diǎn)擊事件的參數(shù),但捕獲到后發(fā)現(xiàn)事件參數(shù)太多(密密麻麻的),模擬起來太費(fèi)勁會浪費(fèi)太多時間(還是算了吧)。
由于Chrome谷歌瀏覽器的全屏觸發(fā)鍵盤按鍵是F11,我就以按F11為目標(biāo)整理一下思路。首先,頁面初始化發(fā)送一個get請求給后端程序接口,程序接收請求開始編寫vbs腳本并生成vbs腳本文件保存在Win10默認(rèn)桌面路徑上,程序再運(yùn)行此腳本點(diǎn)擊F11完成全屏效果,流程圖如下:
問題描述:
接下來的問題在于后端代碼執(zhí)行運(yùn)行vbs腳本時遇到的權(quán)限問題,這段代碼如下:
1
|
Process process = Runtime.getRuntime(). exec (cmd); |
原因分析:
假如運(yùn)行沒有系統(tǒng)管理員權(quán)限的cmd來運(yùn)行jar包的話,你會發(fā)現(xiàn)這段代碼不會運(yùn)行也不會報錯,但是就是沒有效果出來(咦?我明明按了F11,全屏呢)。
解決方案:
接下來就來看一下代碼部分,首先先從后端程序接口開始:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
|
/ * * * @Author: Tony Peng * @Date: 2021 / 7 / 9 10 : 20 * * / @Slf4j @RestController @RequestMapping ( "/fullscreen" ) public class FullscreenController { @GetMapping ( "/active" ) public void active(HttpServletRequest request) { / / 獲取客戶端IP,用來寫日志的 String clientIp = request.getRemoteHost(); / / 桌面生成腳本的文件名,可自定義 String fileName = "F11" ; / / vbs腳本內(nèi)容 String command = "set ws=createObject(\"WScript.Shell\")\nws.SendKeys \"{F11}\"" ; / / 獲取Win10默認(rèn)桌面路徑,親測部署可用 String fileUrl = FileSystemView.getFileSystemView().getHomeDirectory() + "\\" + fileName + " .vbs"; / / 生成vbs腳本文件在桌面上 File file = new File (fileUrl); try { / / 這邊判斷一下,文件不存在的話就再寫一份 if (! file .exists()) { FileWriter fw = new FileWriter(fileUrl); fw.write(command); fw.close(); } String[] cmd = new String[]{ "wscript" , fileUrl}; / / 此行代碼運(yùn)行vbs腳本文件會需要系統(tǒng)管理員權(quán)限 Process process = Runtime.getRuntime(). exec (cmd); process.waitFor(); } catch (Exception e) { log.error( "客戶端IP【{}】F11調(diào)用失敗!原因:" + e.getMessage(), clientIp); } log.info( "客戶端IP【{}】F11調(diào)用成功!" , clientIp); } } |
以上接口寫好后用自己的編譯器(偶用滴素IDEA)運(yùn)行起來,用另一臺電腦打開Postman測試一下接口,屢試不爽,興沖沖的打包部署,部署完后卻發(fā)現(xiàn)測來測去咋滴都沒效果呢。
還好,經(jīng)驗豐富滴我,試了一下系統(tǒng)管理員cmd運(yùn)行jar包,誒~~~口以了!!!
然后,開始寫批處理文件先獲取系統(tǒng)管理員權(quán)限打開cmd后臺運(yùn)行jar包,批處理文件代碼如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
|
:::::::::::::::::::::::::::::::::::::::::::: :: Elevate.cmd - Version 4 :: Automatically check & get admin rights :::::::::::::::::::::::::::::::::::::::::::: @ECHO off CLS ECHO. ECHO = = = = = = = = = = = = = = = = = = = = = = = = = = = = = ECHO Running Admin shell ECHO = = = = = = = = = = = = = = = = = = = = = = = = = = = = = :init setlocal DisableDelayedExpansion set cmdInvoke = 1 set winSysFolder = System32 set "batchPath=%~0" for % % k in ( % 0 ) do set batchName = % % ~nk set "vbsGetPrivileges=%temp%\OEgetPriv_%batchName%.vbs" setlocal EnableDelayedExpansion :checkPrivileges NET FILE 1 >NUL 2 >NUL if '%errorlevel%' = = '0' ( goto gotPrivileges ) else ( goto getPrivileges ) :getPrivileges if '%1' = = 'ELEV' (echo ELEV & shift / 1 & goto gotPrivileges) ECHO. ECHO * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ECHO Invoking UAC for Privilege Escalation ECHO * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ECHO Set UAC = CreateObject^( "Shell.Application" ^) > "%vbsGetPrivileges%" ECHO args = "ELEV " >> "%vbsGetPrivileges%" ECHO For Each strArg in WScript.Arguments >> "%vbsGetPrivileges%" ECHO args = args ^& strArg ^& " " >> "%vbsGetPrivileges%" ECHO Next >> "%vbsGetPrivileges%" if '%cmdInvoke%' = = '1' goto InvokeCmd ECHO UAC.ShellExecute "!batchPath!" , args, " ", " runas ", 1 >> " % vbsGetPrivileges % " goto ExecElevation :InvokeCmd @ECHO OFF ECHO args = "/c " " " + " !batchPath! " + " " " " + args >> "%vbsGetPrivileges%" ECHO Set ws = CreateObject( "Wscript.Shell" ) ECHO UAC.ShellExecute "%SystemRoot%\%winSysFolder%\cmd.exe" , args, " ", " runas ", 1 >> " % vbsGetPrivileges % " :ExecElevation "%SystemRoot%\%winSysFolder%\WScript.exe" "%vbsGetPrivileges%" % * exit / B :gotPrivileges @ECHO OFF setlocal & cd / d % ~dp0 if '%1' = = 'ELEV' ( del "%vbsGetPrivileges%" 1 >nul 2 >nul & shift / 1 ) :::::::::::::::::::::::::::: ::START :::::::::::::::::::::::::::: ::這里輸入你的代碼 @ECHO off start javaw - Dfile.encoding = utf - 8 - jar - Xmn128m - Xms256m - Xmx256m % ~dp0\fullscreen.jar |
先創(chuàng)建一個文本文件(后綴.txt),編輯輸入以上代碼,文件后綴改成.bat,雙擊運(yùn)行(jar包必須和批處理文件同一個目錄下),這時彈窗完兩次即啟動完成。
作為一個程序員,能少一次彈窗我都覺得開熏 ,所以我又寫了一個vbs腳本文件隱藏第一次彈窗,目前還沒想到如何隱藏第二次彈窗的方法,如果有大神可以指導(dǎo)一下,可以留言一下我再做一下補(bǔ)充并申明某某某大神,感激不盡!Thanks
隱藏第一次cmd彈窗腳本如下:
1
2
|
Set ws = CreateObject( "Wscript.Shell" ) ws.run "cmd /c D:\Fullscreen\fullscreen.bat" ,vbhide |
PS:盤符路徑請修改成運(yùn)行jar包的批處理文件的路徑。
這時就差不多大功告成啦!
下面來補(bǔ)充前端的部分,如何用JS判斷當(dāng)前谷歌瀏覽器是否全屏,代碼如下:
1
2
3
4
|
/ / 谷歌瀏覽器判斷如果不是全屏的情況下 if (!(document.body.scrollHeight = = = window.screen.height && document.body.scrollWidth = = = window.screen.width)) { / / 發(fā)送全屏請求 } |
PS:后端程序jar包必須和客戶端在同一臺計算機(jī)上部署,否則全屏無效。
源碼鏈接:
https://github.com/tony901/Fullscreen
都看完啦,給個一鍵三連八~
行到水窮處,坐看云起時。
到此這篇關(guān)于SpringBoot實戰(zhàn)項目之谷歌瀏覽器全屏效果實現(xiàn)的文章就介紹到這了,更多相關(guān)SpringBoot 全屏內(nèi)容請搜索服務(wù)器之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持服務(wù)器之家!
原文鏈接:https://blog.csdn.net/qq_21609191/article/details/118784814