退出屏保前玩一把游戏吧!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分钟)后才能退出屏保。在等待期间,可以展示一些有趣的事物,如名言警句、美丽的图片或者实时新闻等。
通过这些有趣的屏保设计方案,用户在退出屏保时可以享受到更多互动和趣味性。此外,这些方案还可以根据用户的喜好和需求进行定制和扩展,为用户带来更丰富的屏保体验。
同时,我还在更新中提供了一个经典的 2048 小游戏,要求玩家在赢得游戏后才能退出屏保。

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


5. 背后的哲学
当玩家在游戏中努力拼搏,最终赢得游戏时,他们可能会发现,游戏并没有因此结束,屏保依然继续运行。这时,他们可能会意识到,即使付出了努力,结果也不一定如人意。而当玩家选择投降并重新开始游戏10次后,他们将发现这个看似无用的操作竟然让屏保退出,让电脑恢复正常使用。
也许只有努力过才会发现,游戏还是投降躺平舒服些,只需要重开十次,就会被比你努力凑齐 2048 赢得游戏来退出屏保更快。人生有时就是这样,在现实生活中,我们往往会面临两种选择:努力拼搏还是躺平投降。有时候,努力拼搏的结果并不一定能让我们达到预期的目标,反而可能让我们陷入更深困境,带来更多的困扰。而在某些情况下,选择躺平投降,反而能让我们以更轻松的心态面对问题,从而找到解决问题的更快方法。当然,该拼搏的时候,还是需要努力一把,万一就成功了呢?
6. 最后
本文向大家介绍了如何在 webBrowser 中的网页调用 .NET 方法,以及如何在屏保程序中加入游戏元素。通过这些技巧,我们可以为用户带来更有趣的屏保体验。希望本文能对大家有所帮助,最后项目地址是:https://github.com/sangyuxiaowu/HackerScreenSaver?wt.mc_id=DT-MVP-5005195 感兴趣的话,可以下载体验一下。
相关文章:
退出屏保前玩一把游戏吧!webBrowser中网页如何调用.NET方法
本文主要以 HackerScreenSaver 新功能的开发经历介绍 webBrowser中网页如何调用.NET方法的过程。 1. 背景 之前开源了一款名为 HackerScreenSaver 的 Windows 屏保程序。该程序具有模拟黑客炫酷界面的特点,用户可以将自定义的网页作为锁屏界面。不久前,…...
hive-列转行
转成 select customer_code,product_type from temp.temp_xx LATERAL VIEW explode(SPLIT(product_types,,)) table_tmp AS product_type where customer_code K100515182...
【网络】IP网络层和数据链路层
IP协议详解 1.概念 1.1 四层模型 应用层:解决如何传输数据(依照什么格式/协议处理数据)的问题传输层:解决可靠性问题网络层:数据往哪里传,怎么找到目标主机数据链路层(物理层)&…...
基于Spring Gateway路由判断器实现各种灰度发布场景
文章目录 1、灰度发布实现1.1 按随机用户的流量百分比实现灰度1.2 按人群划分实现的灰度1.2.1 通过Header信息实现灰度1.2.2 通过Query信息实现灰度1.2.3 通过RemoteAdd判断来源IP实现灰度 2、路由判断器2.1. After2.2. Before2.3. Between2.4. Cookie2.5. Header2.6. Host2.7.…...
mysql57、mysql80 目录结构 之 Windows
查看mysql 数据存储的位置 /bin:存储可执行文件,主要包含客户端和服务端启动程序,如mysql.exe、mysqld.exe等 /docs:存放一些文档 /include:用于放置一些头文件,如:mysql.h、mysqld_error.h 等 …...
Mac操作系统Safari 17全新升级:秋季推出全部特性
苹果的内置浏览器可能是Mac上最常用的应用程序(是的,甚至比Finder、超级Mac Geeks还要多)。因此,苹果总是为其浏览器Safari添加有用的新功能。在今年秋天与macOS Sonoma一起推出的第17版中,Safari可以帮助你提高工作效…...
UDP通信、本地套接字
#include <sys/types.h> #include <sys/socket > ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,const struct sockaddr *dest_addr, socklen_t addrlen);- 参数:- sockfd : 通信的fd- buf : 要发送的数据- len : 发送数据的长度…...
ChatGPT提示与技巧分享:如何作出更好的提示2023年8月
对ChatGPT的一些酷炫技巧感兴趣吗?这里提供了一些可以帮助你充分利用ChatGPT,成为AI工具专家的技巧。 毫无疑问,ChatGPT是目前最广泛使用的人工智能工具之一。它不仅毫不留情地取代了一些特定领域常用的软件小工具(如智能对联、经典语录生…...
网络安全(自学黑客)一文全解
目录 特别声明:(文末附资料笔记工具) 一、前言 二、定义 三、分类 1.白帽黑客(White Hat Hacker) 2.黑帽黑客(Black Hat Hacker) 3.灰帽黑客(Gray Hat Hacker) 四…...
Vue中ElementUI结合transform使用时,发现弹框定位不准确问题
在近期开发中,需要将1920*1080放到更大像素大屏上演示,所以需要使用到transform来对页面进行缩放,但是此时发现弹框定位出错问题,无法准备定位到实际位置。 查看element-ui官方文档无果后,打算更换新的框架进行开发&am…...
(一)连续随机量的生成-基于分布函数
连续随机量的生成-基于分布函数 1. 概率积分变换方法(分布函数)2. Python编程实现指数分布的采样 1. 概率积分变换方法(分布函数) Consider drawing a random quantity X X X from a continuous probability distribution with …...
【springboot】Spring Cache缓存:
文章目录 一、导入Maven依赖:二、实现思路:三、代码开发: 一、导入Maven依赖: <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-cache</artifactId><…...
数学建模-建模算法(4)
python虽然不是完全为数学建模而生的,但是它完整的库让它越来越适合建模了。 - 线性规划:使用scipy.optimize.linprog()函数 python from scipy.optimize import linprogc [-1, 4] A [[-3, 1], [1, 2]] b [6, 4] x0_bounds (None, None) x1_bound…...
python之函数返回数据框
1.原始文件 ##gff-version 3 Chr1A IWGSC_v2.1 gene 40098 70338 33 - . IDTraesCS1A03G0000200;previous_idTraesCS1A02G000100;primconfHC;NameTraesCS1A03G0000200;cdsCDS_OK;mappingfullMatchWithMissmatches Chr1A IWGSC_v2.1 mRN…...
电子商务安全体系架构技术方面
技术方面是本文所要阐述的主要方面,因为它能够依靠企业自 身的努力来达到令人满意的安全保障效果。目前,关于电子商务安全体系的研究比 较多,有基于层次的体系,也有基于对象的体系,还有基于风险管理的体系࿰…...
新安装IDEA 常用插件、设置
新安装IDEA 常用插件、设置 mybatiscodeHelperProRestfulToolkit-fixJrebelmybatis log freepojo to jsonGrep ConsoleMaven HelperCamelCaseCamelCase常用设置 mybatiscodeHelperPro mapper.xml 编码校验 sql 生成,代码生成 RestfulToolkit-fix URI 跳转到对应的…...
ChromeOS 的 Linux 操作系统和 Chrome 浏览器分离
导读科技媒体 Ars Technica 报道称,谷歌正在将 ChromeOS 的浏览器从操作系统中分离出来 —— 让它变得更像 Linux。虽然目前还没有任何官方消息,但这项变化可能会在本月的版本更新中推出。 据介绍,谷歌将该项目命名为 "Lacros"——…...
哔哩哔哩 B站 bilibili 视频倍速设置 视频倍速可自定义
目录 一、复制如下代码 二、在B站视频播放页面进入控制台 三、将复制的代码粘贴到下方输入框,并 回车Enter 即可 四、然后就可以了 一、复制如下代码 (该代码用于设置倍速为3,最后的数值是多少就是多少倍速,可以带小数点&#…...
Lazada商品详情接口 获取Lazada商品详情数据 Lazada商品价格接
一、引言 随着电子商务的迅速发展和普及,电商平台之间的竞争也日趋激烈。为了提供更好的用户体验和更高效的后端管理,Lazada作为东南亚最大的电商平台之一,开发了一种商品详情接口(Product Detail API)。该接口允许第…...
路由攻击(ospf attack)及C/C++代码实现
开放式最短路径优先(OSPF)是应用最广泛的域内路由协议之一。不幸的是,它有许多严重的安全问题。OSPF上的伪造是可能导致路由循环和黑洞的最关键的漏洞之一。 大多数已知的OSPF攻击基于伪造攻击者控制的路由器的链路状态通告(LSA&…...
内存分配函数malloc kmalloc vmalloc
内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...
SkyWalking 10.2.0 SWCK 配置过程
SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外,K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案,全安装在K8S群集中。 具体可参…...
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする 1、前言(1)情况说明(2)工程师的信仰2、知识点(1) にする1,接续:名词+にする2,接续:疑问词+にする3,(A)は(B)にする。(2)復習:(1)复习句子(2)ために & ように(3)そう(4)にする3、…...
【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器
——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的一体化测试平台,覆盖应用全生命周期测试需求,主要提供五大核心能力: 测试类型检测目标关键指标功能体验基…...
Day131 | 灵神 | 回溯算法 | 子集型 子集
Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣(LeetCode) 思路: 笔者写过很多次这道题了,不想写题解了,大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...
拉力测试cuda pytorch 把 4070显卡拉满
import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试,通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小,增大可提高计算复杂度duration: 测试持续时间(秒&…...
EtherNet/IP转DeviceNet协议网关详解
一,设备主要功能 疆鸿智能JH-DVN-EIP本产品是自主研发的一款EtherNet/IP从站功能的通讯网关。该产品主要功能是连接DeviceNet总线和EtherNet/IP网络,本网关连接到EtherNet/IP总线中做为从站使用,连接到DeviceNet总线中做为从站使用。 在自动…...
【JavaSE】绘图与事件入门学习笔记
-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角,以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向,距离坐标原点x个像素;第二个是y坐标,表示当前位置为垂直方向,距离坐标原点y个像素。 坐标体系-像素 …...
uniapp中使用aixos 报错
问题: 在uniapp中使用aixos,运行后报如下错误: AxiosError: There is no suitable adapter to dispatch the request since : - adapter xhr is not supported by the environment - adapter http is not available in the build 解决方案&…...
Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)
参考官方文档:https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java(供 Kotlin 使用) 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...
