日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

.NET5 开发手机提词应用,基于内嵌Web服务器及PowerPoint自动化

發布時間:2023/12/4 asp.net 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 .NET5 开发手机提词应用,基于内嵌Web服务器及PowerPoint自动化 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
  • 項目說明

我使用電腦錄制視頻教程的時候,會展示PPT給觀眾,同時也有一些提示性的文字給我自己看。這就類似于很多電視節目錄制現場的“提詞器”。

節目錄制現場的提詞器

?

?????? 在PC環境下,PowerPoint也具有提詞器功能,在編輯PPT的時候,把每一頁的備注中寫上提示詞即可。投影到屏幕上的給觀眾看的畫面沒有提示詞,而演講者的電腦屏幕的畫面中有提示詞。但是這要求使用投影儀或者使用雙屏幕。而我的視頻錄制環境是我和觀眾是看的同一塊屏幕,因此無法使用PowerPoint的提詞功能。所以我只能自己開發一個應用。

?????? 既然我和觀眾是看的同一塊屏幕,如果想達到“觀眾看不到提示詞,而我能看到”的效果,就只能把提示詞展示到額外的顯示設備上。我們每個人都有智能手機,因此我就想到了把智能手機做為顯示提示詞的設備。基于這個想法,我開發出了一個桌面應用,這個應用提供了一個內嵌的Web服務器,提供了“獲取當前PPT頁面備注文字”以及“翻頁”等功能的接口,并且提供了一個調用這些接口的網頁;這樣,只要在手機上訪問這個網頁,就可以通過手機來獲取提示詞,也可以通過手機來切換PPT的翻頁。下圖是我使用這個提詞應用實際工作的場景:

我的提詞器實際工作場景

?

?????? 這個應用使用.NET 5/.NET Core開發,但是思路是不局限于語言的,其他編程語言的開發者也可以使用你習慣的語言來開發。

我的應用主要使用了兩個技術,一個是在WinForm程序中內嵌Web服務器,另一個就是通過代碼控制PowerPoint文檔。我下面將對它們分別做講解。

?

  • .NET 內嵌Web服務器技術

.NET中可以使用Kestrel實現內嵌Web服務器,而Kestrel就是ASP.NET Core項目默認的Web服務器。由于Kestrel只是一個NuGet包而已,因此可以把它裝到任何.NET項目上,比如控制臺、WinForm、WPF、Xamarin等。其實所謂的ASP.NETCore項目本質上也只是一個裝了Kestrel等相關包的控制臺程序而已。

這里演示在WinForm項目中的用法,其他類型項目操作步驟都差不多:

1、首先創建一個WinForm項目,然后在項目根目錄下創建名字為wwwroot的文件夾,這個文件夾用來放html、js、css等靜態文件。

2、在項目的csproj文件中增加如下配置:

<None Update="wwwroot\**"><CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </None>

這段配置的作用是:項目構建的時候,會把wwwroot目錄下所有的內容都復制到輸出目錄下。

3、在wwwroot目錄下創建index.html文件。

4、通過Nuget安裝:Microsoft.AspNetCore.Owin

?

Install-Package?Microsoft.AspNetCore.Owin

?

5、在主窗口中聲明

private?IWebHost?host;

在窗口的構造函數中添加如下內容:

host = new WebHostBuilder().UseKestrel().UseUrls("http://*:80").Configure(Configure).Build(); host.RunAsync();

其中"http://*:80" 表示網站監聽所有網卡(這樣就可以通過其他設備訪問內嵌的網站了),并且通過80端口提供服務。要確保計算機中的防火墻中開啟了對應端口的訪問權限。

?

在需要關閉服務器或者窗口關閉的時候執行如下代碼,否則程序不會正常退出:

host.StopAsync(); host.WaitForShutdown();

?

然后聲明如下方法:

public void Configure(IApplicationBuilderapp) {app.UseDefaultFiles();app.UseStaticFiles();app.Run(async(context) =>{varrequest = context.Request;varresponse = context.Response;stringpath = request.Path.Value;if(path == "/report"){response.StatusCode= 200;awaitresponse.WriteAsync("OK");}else{response.StatusCode= 404;}}); }

其中app.UseDefaultFiles()表示啟用對于index.html等默認文檔的支持;app.UseStaticFiles()表示把wwwroot提供為靜態文件夾。app.Run()中的代碼意思為:如果用戶訪問了/report這個路徑,則輸出OK,否則就響應碼為404。

?

  • 代碼控制PowerPoint文檔

代碼需要實現讀取PowerPoint頁面的備注文字以及翻頁等功能,這需要使用Office Automation技術,也就是通過代碼調用Office的COM接口,當前前提條件就是計算機上必須安裝PowerPoint軟件。

微軟官方推薦的在.NET中訪問Office的方法就是在Visual Studio中通過COM引用生成Office的Interop程序集,也就是所謂的“Early Binding”。這種方式的優點就是一切對象都是強類型的,所以代碼編寫比較方便。而缺點就是和特定Office版本綁定,必須注意開發的時候的Office綁定,必須用盡可能低的版本的Office進行開發。不知道是我本地環境的原因還是.NET 5對于這種方式支持不成熟,我在.NET 5項目通過COM引用方式使用的時候,一直出現“MsoTriState在未被引用的程序集中定義。必須添加對程序集office的引用”的編譯錯誤,如下圖:

Figure3編譯錯誤

?

?????? 也可以使用Late Binding方式操作,也就是通過dynamic這種方式進行COM接口的訪問。這種方式的優點是不依賴于特性Office版本,缺點就是全都是弱類型調用,因此需要查詢文檔,開發效率比較低。

?????? 我發現一個開源項目NetOffice(https://netoffice.io/),它仍然是強類型的,但是不依賴于特定的Office版本。最大的遺憾就是它目前的.NET Standard版本的開發正在進行,所以目前的版本仍然不支持.NET Core。

?????? 經過比較,我只能選擇Late Binding這種方式來進行了。

由于Com的復雜性,特別是“引用計數”這種比較古老的資源管理技術的復雜性,導致晚綁定的對象回收要十分注意,否則會導致Office無法退出。我封裝了一個簡單的庫Zack.ComObjectHelpers,可以簡化Com對象資源的回收。

這個庫的Nuget安裝命令是:

Install-PackageZack.ComObjectHelpers

? ? ??

?????? 然后使用其中的COMReferenceTracker類進行COM引用的管理:打開文檔創建一個COMReferenceTracker對象,在每一步可能返回Com對象的地方,都用T方法進行資源回收,操作完成后調用Dispose。

?????? 如下的代碼就是打開一個PPT文檔,然后進入演示模式的代碼:

private dynamic presentation; private COMReferenceTracker comRefTracker =new COMReferenceTracker();private void Form1_Closed(object sender,EventArgs e) {this.comRefTracker.Dispose(); }private dynamic T(dynamic comObj) {returnthis.comRefTracker.T(comObj); }private void MiOpen_Click(object sender,System.EventArgs e) {stringfilename = "d:/1.pptx";dynamicpptApp = T(PowerPointHelper.CreatePowerPointApplication());pptApp.Visible= true;dynamicpresentations = T(pptApp.Presentations);this.presentation= T(presentations.Open(filename));T(this.presentation.SlideShowSettings).Run(); }

?

?????? C#操作Office Automation的文檔、資料比較少,不過由于COM對象本身是跨語言的,而VBA操作Office Automation的資料非常多,因此完全參考VBA操作的資料即可。比如下面的代碼就是我仿照網上搜索“VBA 讀取PowerPoint備注”的代碼改造成C#語法而成的“讀取當前PowerPoint頁面的備注”代碼:

dynamic notesPage =T(T(T(T(presentation.SlideShowWindow).View).Slide).NotesPage); notesText = GetInnerText(notesPage);private string GetInnerText(dynamic part) {StringBuildersb = new StringBuilder();dynamicshapes = T(T(part).Shapes);intshapesCount = shapes.Count;for(int i = 0; i < shapesCount; i++){dynamicshape = T(shapes[i + 1]);vartextFrame = T(shape.TextFrame);if(textFrame.HasText == -1)//MsoTriState.msoTrue==-1{stringtext = T(textFrame.TextRange).Text;sb.AppendLine(text);}sb.AppendLine();}returnsb.ToString(); }

?

  • 手機提詞器應用代碼

?

上面已經把整個應用的最核心代碼介紹了,想了解整個項目的代碼請訪問項目的github頁面https://github.com/yangzhongke/PhoneAsPrompter

?

  • 手機控制電腦中視頻播放

?

用“應用中內嵌Web服務器”技術,我還實現了一個“手機控制電腦中視頻播放”的應用,可以通過手機控制電腦中的視頻播放器進行暫停、播放、調節音量、快進快退等功能,甚至可以進一步開發完成切換直播電視頻道等功能。代碼也放到了上面github頁面的VideoRemoteController項目中。

?

  • 視頻教程

????除了這篇文章,我還錄制了大約2個小時的視頻教程來更詳細的講解代碼,視頻都是免費的,可以訪問我推送的這條公眾號消息中的其他視頻。也可以訪問我的嗶哩嗶哩、頭條、微博等平臺中同步發布的賬號中的視頻,賬號名都是“楊中科”。

?

點擊閱讀原文訪問開源項目

總結

以上是生活随笔為你收集整理的.NET5 开发手机提词应用,基于内嵌Web服务器及PowerPoint自动化的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。