退出屏保前玩一把游戏吧!webBrowser中网页如何调用.NET方法

本文主要以 HackerScreenSaver 新功能的开发经历介绍 webBrowser中网页如何调用.NET方法的过程。

1. 背景

之前开源了一款名为 HackerScreenSaver 的 Windows 屏保程序。该程序具有模拟黑客炫酷界面的特点,用户可以将自定义的网页作为锁屏界面。不久前,有网友提出一个有趣的需求:能否在退出屏保时需要输入密码?虽然我不太清楚他的用意,但这个其实可以安排,不过需要变通一下。

2. 新功能设计

之前做这个程序的时候我就发现,屏幕保护程序需要自己处理退出,如果屏保程序设计得不够合理,可能会导致用户在无法正常退出屏保时遇到困扰。所以在设计之初,我添加了 MouseKeyHook 用来监听全局的键鼠事件。

那么设计新的功能来实现网友的需求也很简单,当然不是直接的设计什么密码输入,然后判断退出的功能。这里只需将屏保退出的功能提供给网页控制就可以了。

请添加图片描述

3. 网页与 .NET 交互

之前介绍到为了程序简易软件采用了 webBrowser,那么为了让网页可以决定什么时候退出屏保,就需要让 webBrowser 中的网页可以调用 .NET 的方法。

在网页中,我们需要在屏保退出的逻辑部分添加一段 JavaScript 代码,用于调用 .NET 方法。这段代码的核心是 window.external 对象,它允许 JavaScript 访问 .NET 对象。我们在用户输入正确密码或者游戏胜利等条件下执行下面的 JavaScript 代码即可:

window.external.ExecuteExitSrc(); 

对于 .NET 代码,可以创建一个和单独的类以供 web 调用:

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

需要注意的是,我们需要在该类上添加一个 [ComVisible(true)] 特性。这个特性使得该类的公共成员可以被 COM 组件访问,从而实现 JavaScript 与 .NET 方法之间的互操作,否则你会收到下面的错误信息:

System.ArgumentException:“ObjectForScripting 的类必须对 COM 可见。  请确认该对象是公共的,或考虑向您的类添加 ComVisible 特性。”

最后,需要在 webBrowser 控件的 ObjectForScripting 属性中设置一个 .NET 对象,这个对象将用于被 JavaScript 调用:

webB.ObjectForScripting = new JavaScriptInteraction();

4. 新的屏保

为了演示新功能的使用,在 html 目录中,提供了一个演示用的 exit.html 直接提供了网页退出屏保的演示按钮。

新的功能提供了更多的可玩性,用户可以根据自己的喜好设计各种有意思的屏保,这样也是满足了输入密码退出这个功能的实现基础。当然我们可以有许多有意思的功能可以自行设计,比如:

  1. 解谜屏保:设计一个带有简单谜题的屏保,用户需要在网页上回答正确才能退出屏保。谜题可以是数学题、逻辑题或者常识题等,每次屏保激活时,可以随机从题库中抽取一道题目。既然是题库,甚至可以利用屏保学习各种知识,比如英语单词,各种考试题等等。

  2. 拼图屏保:制作一个拼图游戏,用户需要在网页上完成拼图才能退出屏保。可以使用用户自己的照片作为拼图素材,或者从网上随机抓取图片。拼图难度可以根据用户的喜好进行调整。

  3. 计时屏保:设置一个倒计时屏保,用户需要在网页上等待一段时间(例如,1分钟)后才能退出屏保。在等待期间,可以展示一些有趣的事物,如名言警句、美丽的图片或者实时新闻等。

通过这些有趣的屏保设计方案,用户在退出屏保时可以享受到更多互动和趣味性。此外,这些方案还可以根据用户的喜好和需求进行定制和扩展,为用户带来更丰富的屏保体验。

同时,我还在更新中提供了一个经典的 2048 小游戏,要求玩家在赢得游戏后才能退出屏保。

请添加图片描述

这个游戏改的逻辑其实是没有改好的,也懒得调整了,更新一下游戏介绍也是可以的。

请添加图片描述

请添加图片描述

5. 背后的哲学

当玩家在游戏中努力拼搏,最终赢得游戏时,他们可能会发现,游戏并没有因此结束,屏保依然继续运行。这时,他们可能会意识到,即使付出了努力,结果也不一定如人意。而当玩家选择投降并重新开始游戏10次后,他们将发现这个看似无用的操作竟然让屏保退出,让电脑恢复正常使用。

也许只有努力过才会发现,游戏还是投降躺平舒服些,只需要重开十次,就会被比你努力凑齐 2048 赢得游戏来退出屏保更快。人生有时就是这样,在现实生活中,我们往往会面临两种选择:努力拼搏还是躺平投降。有时候,努力拼搏的结果并不一定能让我们达到预期的目标,反而可能让我们陷入更深困境,带来更多的困扰。而在某些情况下,选择躺平投降,反而能让我们以更轻松的心态面对问题,从而找到解决问题的更快方法。当然,该拼搏的时候,还是需要努力一把,万一就成功了呢?

6. 最后

本文向大家介绍了如何在 webBrowser 中的网页调用 .NET 方法,以及如何在屏保程序中加入游戏元素。通过这些技巧,我们可以为用户带来更有趣的屏保体验。希望本文能对大家有所帮助,最后项目地址是:https://github.com/sangyuxiaowu/HackerScreenSaver?wt.mc_id=DT-MVP-5005195 感兴趣的话,可以下载体验一下。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/55774.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【C++笔记】C++之类与对象(下)

【C笔记】C之类与对象(下) 1、再看构造函数1.1、构造函数的初始化列表1.2、C支持单参数的构造函数的隐式类型转换1.3、匿名对象 2、Static成员2.1、为什么要有静态成员变量?2.2、一个类的静态成员变量属于这个类的所有对象2.3、静态成员函数 3、友元3.1、…

基于体素形态学测量分析(VBM)的工具包比较及其在年龄预测中的应用

摘要 基于体素的形态学测量分析(VBM)通常用于灰质体积(GMV)的局部量化。目前存在多种实现VBM的方法。然而,如何比较这些方法及其在应用中的效用(例如对年龄效应的估计)仍不清楚。这会使研究人员疑惑他们应该在其项目中使用哪种VBM工具包。本研究以用户为中心&#…

基于单片机的智能数字电子秤proteus仿真设计

一、系统方案 1、当电子称开机时,单片机会进入一系列初始化,进入1602显示模式设定,如开关显示、光标有无设置、光标闪烁设置,定时器初始化,进入定时器模式,如初始值赋值。之后液晶会显示Welcome To Use Ele…

摆动序列【贪心算法】

摆动序列 如果连续数字之间的差严格地在正数和负数之间交替,则数字序列称为 摆动序列 。第一个差(如果存在的话)可能是正数或负数。仅有一个元素或者含两个不等元素的序列也视作摆动序列。 class Solution {public int wiggleMaxLength(int…

老胡的周刊(第105期)

老胡的信息周刊[1],记录这周我看到的有价值的信息,主要针对计算机领域,内容主题极大程度被我个人喜好主导。这个项目核心目的在于记录让自己有印象的信息做一个留存以及共享。 🎯 项目 Piwigo[2] Piwigo 是一个开源的网络照片库软…

BM80 买卖股票的最好时机(一)

目录 1.题目描述 2.题目分析 3.编写代码 4.总结 这是牛客网上的一道题目 1.题目描述 题目链接:买卖股票的最好时机(一)_牛客题霸_牛客网 (nowcoder.com) 2.题目分析 我们看到这个题目中一个数组表示每一天的股价,那么最大利润怎么算呢&#xff0c…

selenium实现输入数字字母验证码

思路 1. 登录url 2. 获取验证码坐标 3. 根据桌标截图验证码 4. 对验证码进行识别 5. 自动输入验证码 测试代码 import os import time from io import BytesIO from PIL import Image from selenium import webdriver from selenium.webdriver.common.by import By impo…

WebGL矩阵变换

目录 变换矩阵:旋转 变换矩阵:平移 44的旋转矩阵 示例代码: gl.uniformMatrix4fv()规范 平移:相同的策略 变换矩阵:缩放 变换矩阵:旋转 对于简单的变换,你可以使用…

Elasticsearch实现增删改查

调用elasticsearch通常使用restful风格请求,这里记录一些常用的Java API和Postman Url Java API调用Es 1. 查询总文档数 Testvoid getAllCount() { // RestHighLevelClient clientnew RestHighLevelClient(RestClient.builder(new HttpHost("192.168…

【微服务】02-集成事件与MediatR

文章目录 1.集成事件1.1 定义1.2 集成事件工作原理1.3 总结 2.使用RabbitMQ来实现EventBus2.1 RabbitMQ安装2.2 CAP框架实现RabbitMQ2.2.1 CAP框架实现架构2.2.2 CAP框架实现原理 3.MediatR3.1 使用Mediator实现命令查询职责分离模式(CQRS)3.1.1 核心对象 3.2 处理领域事件3.2.…

安装部署JavaFX和IDEA添加JavaFX的详细步骤

安装部署JavaFX和IDEA添加JavaFX的详细步骤 一、认识JavaFX二、下载JavaFX三、解压到目录下四、IDEA导入JavaFX五、添加JavaFX的VM选项六、运行命令七、总结一、认识JavaFX JavaFX是Java平台的一个图形用户界面(GUI)工具包,用于创建丰富、交互式和可视化的应用程序。JavaFX提…

Java线程 - 详解(1)

一,创建线程 方法一:继承Thread类 class MyThread extends Thread{Overridepublic void run() {System.out.println("线程1");} }public class Test {public static void main(String[] args) {MyThread myThread new MyThread();myThread.…

如何管理Linux用户和权限?

首先,你要知道的是Linux是一个非常严谨和安全的操作系统。所以,它需要对用户和权限进行精细的管理。 首先,我们需要了解一下Linux系统中的用户。你可以把用户想象成生活在系统中的居民。他们需要有一个唯一的用户名来标识自己,并且…

【C语言】2023.8.27C语言入学考试复盘总结

前言 本篇文章记录的是对于2023年8月27日的 C语言 的入学考试的整理总结 成绩:220/240 题目:9/12 错题整理 首先先对于我没做出来的三道题做一个整理 错题1:7-4 分段函数PLUS 题干 以下是一个二元分段函数,请你根据所给的函…

Linux对用户路径授权

chown -R wasup:wasup /tmp 用root用户登录 授权 这个命令 chown -R wasup:wasup /tmp 用于递归地改变 /tmp 目录及其所有内容的所有者和所属组。 解释如下: chown: 这是用于修改文件或目录所有者和所属组的命令。-R: 这是一个选项,表示递归地应用修…

android系统启动流程之init启动分析

先根据上图来描述下安卓整个系统的启动流程: 当上电时,系统先执行BootRom, 加载引导程序执行。 然后进入bootloader,在安卓系统中基本上这个bootloader是uboot, 通过uboot引导启动内核,此时运行在kernel空间,这时的i…

基于全新电脑环境安装pytorch的GPU版本

前言: 距离第一次安装深度学习的GPU环境已经过去了4年多(当时TensorFlow特别麻烦),现在发现安装pytorch的GPU版本还是很简单方便的,流程记录如下。 安装步骤: 步骤一:官网下载Anaconda Free…

研磨设计模式day11观察者模式

目录 场景 代码示例 定义 观察者模式的优缺点 本质 何时选用 简单变型-区别对待观察者 场景 我是一家报社,每当我发布一个新的报纸时,所有订阅我家报社的读者都可以接收到 代码示例 报纸对象 package day11观察者模式;import java.util.Observ…

Python+TinyPNG熊猫网站自动化的压缩图片

前言 本篇在讲什么 PythonTinyPNG自动化处理图片 本篇需要什么 对Python语法有简单认知 依赖Python2.7环境 依赖TinyPNG工具 本篇的特色 具有全流程的图文教学 重实践,轻理论,快速上手 提供全流程的源码内容 ★提高阅读体验★ 👉…

AI + Milvus:将时尚应用搭建进行到底

在上一篇文章中,我们学习了如何利用人工智能技术(例如开源 AI 向量数据库 Milvus 和 Hugging Face 模型)寻找与自己穿搭风格相似的明星。在这篇文章中,我们将进一步介绍如何通过对上篇文章中的项目代码稍作修改,获得更…