在进行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. 大作!webpack详细配置

    webpack学习之旅 好好学习 天天向上!遇到bug,不要慌! 文章目录 webpack学习之旅 大一统的模块化规范--ES6模块化 1.node.js中通过babel体验ES6模块化 2.ES6模 ...

  2. android设置时钟

    <TextClock        android:id="@+id/timeText"        android:layout_width="match_pa ...

  3. Archlinux zsh终端美化 powerlevel10k配置

    环境 Arch Linux + KDE Plasma 安装zsh yay -S zsh 更改默认终端 chsh -s /bin/zsh 安装oh-my-zsh-git archlinuxcn源有打好的 ...

  4. Java枚举类与注解详解——一篇文章读懂枚举类与注解详

    目录 一.枚举类 ① 自定义枚举类 ② enum关键字定义枚举类 ③ enum 枚举类的方法 ④ enum 枚举类实现接口 二.注解 ① 生成文档相关注解 ②注解在编译时进行格式检查 ③注解跟踪代码的 ...

  5. Cisco Catalyst 9800-CL Wireless Controller for Cloud

    面向云的思科 Catalyst 9800-CL 无线控制器,专为基于意图的网络全新打造. 版本: C9800-CL-universalk9.17.04.01 (29-Nov-2020) C9800-C ...

  6. MMF的初步介绍:一个规范化的视觉-语言多模态任务框架

    在VQA, Image Caption等任务中,构建模型是一件工作量较大的工作.有没有什么能减少这些重复的工作量呢?与此同时,Pytorch,tensorflow等开源的深度学习工具包发布,大大减少了 ...

  7. Step By Step(Lua-C API简介)

    Step By Step(Lua-C API简介) Lua是一种嵌入式脚本语言,即Lua不是可以单独运行的程序,在实际应用中,主要存在两种应用形式.第一种形式是,C/C++作为主程序,调用Lua代码, ...

  8. 使用Runtime执行推理(C++)

    使用Runtime执行推理(C++) 概述 通过MindSpore Lite模型转换后,需在Runtime中完成模型的推理执行流程.本教程介绍如何使用C++接口编写推理代码. Runtime总体使用流 ...

  9. 特斯拉Tesla Model 3整体架构解析(上)

    特斯拉Tesla Model 3整体架构解析(上) 一辆特斯拉 Model 3型车在硬件改造后解体 Sensors for ADAS applications 特斯拉 Model 3型设计的传感器组件 ...

  10. FFmpeg扩展开发

    FFmpeg扩展开发 对FFmpeg RTMP/FLV部分做了扩展,用于支持H.265. 针对<video_file_format_spec_v10_1> VIDEODATA部分扩展如下: ...