65.9K
CodeProject 正在变化。 阅读更多。
Home

WPF 友好的 Shell_NotifyIcon 包装类 - 第三部分:广告拦截器前端

emptyStarIconemptyStarIconemptyStarIconemptyStarIconemptyStarIcon

0/5 (0投票)

2020 年 12 月 2 日

CPOL

4分钟阅读

viewsIcon

5090

downloadIcon

198

本文逐步介绍了广告拦截应用程序的前端,该应用程序位于通知图标后面。

引言

本文提供了一个机会来了解我在为 Windows 10 桌面构建广告拦截器前端时探索的一系列主题。我的下一篇文章将介绍此广告拦截器的后端。我的主要目标是创建一个可以通过单击通知图标启用或禁用的广告拦截器。

本文(第 3 部分:广告拦截器前端)是 NotifyIconLibrary 在实际应用中的一个实例。

背景

用户界面目标

我对 UI 的目标很简单

  • 从通知图标的上下文菜单控制广告拦截器的操作
  • 提供以下命令
    • 解除阻止
    • 关于
    • 退出
  • 提供对键盘导航的支持
  • 提供多语言支持
  • 使用 MVVM 概念
    • 使用视图模型将“是什么”与“怎么做”分开。
    • 使用 RelayCommand 尽可能消除视图中的事件处理程序。
    • 使用 EventToCommand 将“是什么”与“怎么做”分开。
  • 通过创建一个无需提升即可直接调试的后端存根,使 GUI 易于测试。

Using the Code

AdBlockerTest 可以在 Visual Studio 2019 Preview 下或独立运行。您可以使用调试版本或发布版本。我建议在调试器下运行调试版本,以便您可以与正在运行的应用程序交互以查看它正在做什么。

执行从 Program Module 开始,并使用 AppWrapper 项目、AdBlockingManager 存根和 AdBlockerLibrary 项目。反过来,AdBlockerLibrary 项目使用 NotifyIconWrapper 项目。

AdBlockingLibrary 中有一个名为 IAdBlockingManager 的接口,它“定义了 AdBlockingLibrary 与其两个可能的客户端:AdBlockingManagerAdBlockingManagerStub 之间的契约”。这抽象出了这两个替代客户端相对于 AdBlockingLibrary 所承担的职责。

应用程序启动后,您将在任务栏上找到一个通知图标。该图标将是一个绿色交通信号灯。几秒钟后,通知图标将迁移到通知区域。那是单击任务栏上的“^”符号时显示的矩形弹出窗口。您可以左键双击通知图标以反转交通信号灯的设置。红色(停止)表示当前阻止了广告。绿色(通行)表示当前未阻止广告。您也可以使用键盘导航到任务栏上的通知图标或“^”符号,方法是按 Windows+B,然后按一些向右箭头。如果通知图标被隐藏,一旦您到达“^”符号,请按空格键打开通知区域。然后使用箭头键导航到通知图标。现在您可以使用上下文菜单键或 Enter 键打开应用程序的上下文菜单。您可以使用向上和向下箭头键导航到上下文菜单,或使用 Escape 键关闭上下文菜单。您也可以通过右键单击通知图标来打开上下文菜单。您可以使用空格键或 Enter 键,或者通过左键单击所需的项目,从上下文菜单中选择一个项目。有四个项目

  1. 阻止 项目阻止广告
  2. 解除阻止 选项解除对广告的阻止
  3. 关于 选项打开“关于”对话框
  4. 退出 选项关闭上下文菜单,删除通知图标并退出应用程序

您可以通过单击“X”或按 Escape 键来关闭“关于”对话框。

关注点

这种架构设计的一个不寻常的方面是,主视图是在 dll (AdBlockerLibrary) 中定义的,而不是在通常的 exe (AdBlockerTest) 中定义的。

我选择使此应用程序独立于此类第三方代码,而不是依赖 MVVM Light。这样做的一个影响是,我选择使用 EventBindingExtension 而不是按预期使用 EventToCommand。它更优雅,但不幸的是,便携性较差。如果您要使用 MVVM Light 或其他替代方案,您可以很容易地在此处对其进行改造。事实上,这里有几个类可以很容易地被 MVVM Light 的等效功能所取代。

本系列中的下一篇文章将介绍广告拦截应用程序的后端。

历史

  • 2020 年 12 月 1 日:初始版本
© . All rights reserved.