在进行WPF开发时,总是在找更加优雅去写单例模式的代码。

很多人都喜欢用Mutex,一个App.cs下很多的Mutex,我也喜欢用。

看完《WPF编程宝典》的第七章Applicaton类后,为了代码的美观和整洁,我就使用了7.2.5章节的《单实例应用程序》的思路来创建项目中的单实例应用。

项目中主要添加Microsoft.VisualBasic引用,写继承自WindowsFormsApplicationBase的Wrapper来控制单例。

  public class SingleInstanceAppWrapper : WindowsFormsApplicationBase
{
private WpfApp app; public SingleInstanceAppWrapper()
{
this.IsSingleInstance = true;
}
}

通过在Wrapper的构造函数中设置IsSingleInstance=true来控制单例。

通过重写OnStartupNextInstance来控制单例,这样就多程序就自动通过OnStartupNextInstance来实现了进程间的通信。

  protected override void OnStartupNextInstance(StartupNextInstanceEventArgs eventArgs)
{
if (eventArgs.CommandLine.Count > 0)
{ string arg = eventArgs.CommandLine[0];
//单例中的逻辑
}
}

再设计升级程序时因为安全问题,程序提升了权限,还是保持以向单例模式。就在这时候出现问题了!检查升级设置文件权限时发现程序一直再报错。无法继续执行了。

程序启动的时候是计划任务使用管理员权限启动,启动时检查权限,权限正常。

System.Security.Principal.WindowsIdentity identity = System.Security.Principal.WindowsIdentity.GetCurrent();
System.Security.Principal.WindowsPrincipal principal = new System.Security.Principal.WindowsPrincipal(identity);
if (principal.IsInRole(System.Security.Principal.WindowsBuiltInRole.Administrator))
{
//如果走到这里是管理员。当前程序是管理员
}

而通过启动参数通知程序时OnStartupNextInstance中获取一次权限,竟然不是管理员了。因为当时产品催着上线。所有没有做更多的分析。而是修改了通知方式。不使用启动参数。而更换成了窗体消息。

高权限接收低权限发送的窗体消息时需要在高权限添加消息筛选器。低权限需要发送哪些消息,高权限就需要添加哪些消息到筛选器,不然无法接收。

 [DllImport("user32.dll")]
public static extern bool ChangeWindowMessageFilterEx(IntPtr HWnd, uint Msg, int WParam, IntPtr LParam);

函数为ChangeWindowMessageFilterEx 具体用法必应一下。

我创建了一个C#相关的交流群。用于分享学习资料和讨论问题。欢迎有兴趣的小伙伴:QQ群:542633085

WPF使用Microsoft.VisualBasic创建单例模式引起的权限降低问题的更多相关文章

  1. [WPF]为什么使用SaveFileDialog创建文件需要删除权限?

    1. 问题 好像很少人会遇到这种需求.假设有一个文件夹,用户有几乎所有权限,但没有删除的权限,如下图所示: 这时候使用SaveFileDialog在这个文件夹里创建文件居然会报如下错误: 这哪里是网络 ...

  2. 一个实用的却被忽略的命名空间:Microsoft.VisualBasic

    当你看到这个命名空间的时候,别因为是VB的东西就匆忙关掉网页,那将会是您的损失,此命名空间中的资源最初目的是为了简化VB.NET开发而创建的,所以Microsoft.VisualBasic并不属于Sy ...

  3. "一个实用的却被忽略的命名空间:Microsoft.VisualBasic":

        当你看到这个命名空间的时候,别因为是vb的东西就匆忙关掉网页,那将会是您的损失,此命名空间中的资源最初目的是为了简化vb.net开发而创建的,所以microsoft.visualbasic并不 ...

  4. WPF教程一:创建Hello world来理解XAML的内容及编译

    在实际的WPF开发中遇到很多再用Winform写法来写WPF的开发人员,很多时候项目进度延期.出现非必要的BUG等等.大多是因为开发人员虽然是再写WPF. 但是没有好好的学过WPF,就导致无法发挥出W ...

  5. Microsoft.VisualBasic.DateAndTime.Timer 与 DateTime.Now.TimeOfDay.TotalSeconds 相当

    如题,示例如下: Console.WriteLine(DateTime.Now.TimeOfDay.TotalSeconds); Console.WriteLine(Microsoft.VisualB ...

  6. 【转自CSDN】深入 Microsoft.VisualBasic.Strings.StrConv 簡繁轉換

    深入 Microsoft.VisualBasic.Strings.StrConv 簡繁轉換 昨天又遇到一個簡繁轉換的需求, 雖然這個問題以前已經處理過了, 但是以前是用自己建立的 b52gb 和 gb ...

  7. Microsoft.VisualBasic.dll的妙用and 改善C#公共程序类库质量的10种方法

    Microsoft.VisualBasic.dll的妙用(开发中肯定会用到哦) 前言 做过VB开发的都知道,有一些VB里面的好的函数在.NET里面都没有,而Microsoft.VisualBasic. ...

  8. 未能加载文件或程序集 Microsoft.VisualBasic.PowerPacks.Vs, Version=10.0.0.0 解决 亲测

    项目打开winform程序做的某些窗体时报错: ************* 异常文本 ************** System.Reflection.TargetInvocationExceptio ...

  9. Microsoft.VisualBasic.dll的妙用(开发中肯定会用到哦)

    前言 做过VB开发的都知道,有一些VB里面的好的函数在.NET里面都没有,而Microsoft.VisualBasic.dll却给我们提供使用这些函数的功能(没用过VB的这些功能一样可以使用,大同小异 ...

随机推荐

  1. kubectl cmd

    集群资源查看 kubectl get nodes #查看节点状态 kubectl get cs #kubectl检查组件健康状态 kubectl get pods kubectl get all ku ...

  2. OpenResty搭建高性能服务端

    OpenResty搭建高性能服务端   Socket编程 Linux Socket编程领域为了处理大量连接请求场景,需要使用非阻塞I/O和复用,select.poll.epoll是Linux API提 ...

  3. YOLOv4 资源环境配置和测试样例效果

    YOLOv4 资源环境配置和测试样例效果 基本环境:cuda=10.0,cudnn>=7.0, opencv>=2.4 一.下载yolov4 git clone https://githu ...

  4. CodeGen按钮循环

    CodeGen按钮循环 按钮循环是一个模板文件构造,它允许您迭代CodeGen拥有的按钮信息集合.              在按钮循环中处理的按钮的定义可以来自两个位置之一. 如果基于UI工具箱输入 ...

  5. C语言真正的编译过程

    说实话,很多人做了很久的C/C++,也用了很多IDE,但是对于可执行程序的底层生成一片茫然,这无疑是一种悲哀,可以想象到大公司面试正好被问到这样的问题,有多悲催不言而喻,这里正由于换工作的缘故,所以打 ...

  6. C++ QT安装教程2021

    第一步 去官网下载 https://download.qt.io/archive/qt/ 第二步 next 然后 我是注册的账号 注意密码的格式,要求至少7位,包含大小写字母和数字 第三步 点击下一步 ...

  7. P1024 [NOIP2001 提高组] 一元三次方程求解

    题目描述 有形如:a x^3 + b x^2 + c x + d = 0 这样的一个一元三次方程.给出该方程中各项的系数(a,b,c,d均为实数),并约定该方程存在三个不同实根(根的范围在 -100至 ...

  8. 对话Apache Hudi VP, 洞悉数据湖的过去现在和未来

    Apache Hudi是一个开源数据湖管理平台,用于简化增量数据处理和数据管道开发,该平台可以有效地管理业务需求,例如数据生命周期,并提高数据质量.Hudi的一些常见用例是记录级的插入.更新和删除.简 ...

  9. Flink从Kafka取数WordCount后TableApi写入ES

    一.背景说明 需求为从Kafka消费对应主题数据,通过TableApi对数据进行WordCount后,基于DDL写法将数据写入ES. 二.代码部分 说明:代码中关于Kafka及ES的连接部分可以抽象到 ...

  10. 【题解】Luogu p2016 战略游戏 (最小点覆盖)

    题目描述 Bob喜欢玩电脑游戏,特别是战略游戏.但是他经常无法找到快速玩过游戏的办法.现在他有个问题. 他要建立一个古城堡,城堡中的路形成一棵树.他要在这棵树的结点上放置最少数目的士兵,使得这些士兵能 ...