以前使用C++开发的version.dll文件,由于各个用户环境的不同,造成某些用户加载不了我们开发的插件,并且写version.dll的同事还没找到好的解决办法,所以得换一种思路去解决这个问题,就是Lync启动时加载我们的插件。

因此写了一个winform程序来监控进程的变化,这个程序还要设置为开机启动。下面是主要代码:

 static class Program
{
public static System.Threading.Mutex _run;
/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main()
{
bool noRun = false;
_run = new System.Threading.Mutex(true, "ICOLyncWindow", out noRun);
if (noRun)
{
_run.ReleaseMutex();
try
{
//处理未捕获的异常
Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);
//处理UI线程异常
Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(Application_ThreadException);
//处理非UI线程异常
AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException); Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new IcoLyncForm());
}
catch (Exception ex)
{
Logger.Error(ex);
}
}
} static void Application_ThreadException(object sender, System.Threading.ThreadExceptionEventArgs e)
{
Logger.Error(e.Exception);
} static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{
Logger.Error(e.ExceptionObject as Exception);
}
}
 public partial class IcoLyncForm : Form
{
[DllImport("user32.dll", EntryPoint = "ShowWindow", SetLastError = true)]
static extern bool ShowWindow(IntPtr hWnd, uint nCmdShow);
[DllImport("user32.dll", EntryPoint = "FindWindow", SetLastError = true)]
public static extern IntPtr FindWindow(string lpClassName, string lpWindowName); public IcoLyncForm()
{
InitializeComponent();
this.Load += new EventHandler(Form1_Load);
} void Form1_Load(object sender, EventArgs e)
{
Process[] p = Process.GetProcessesByName("lync");
if (p.Length > )
{
lyncnet.clsLyncNet cls = new lyncnet.clsLyncNet();
this.Invoke(new Action(() => { cls.NetMain(); }));
} //创建WQL事件查询,用于实例创建
var qCreate = new WqlEventQuery("__InstanceCreationEvent",
TimeSpan.FromSeconds(), //WHTHIN = 1
"TargetInstance ISA 'Win32_Process'");
//创建WQL事件查询,用于实例删除
var qDelete = new WqlEventQuery("__InstanceDeletionEvent",
TimeSpan.FromSeconds(), //WHTHIN = 1
"TargetInstance ISA 'Win32_Process'"); //创建事件查询的侦听器(ManagementEventWatcher)
var wCreate = new ManagementEventWatcher(qCreate);
var wDelete = new ManagementEventWatcher(qDelete); wCreate.EventArrived += new EventArrivedEventHandler(wCreate_EventArrived);
wDelete.EventArrived += new EventArrivedEventHandler(wDelete_EventArrived); //异步开始侦听
wCreate.Start();
wDelete.Start(); IntPtr intptr;
try
{
do
{
intptr = FindWindow(null, "ICOLync");
if (intptr != IntPtr.Zero)
{
ShowWindow(intptr, );
}
}
while (intptr == IntPtr.Zero);
IcoLync.Util.RegistryHelper.RunWhenStart(true, "ICOLync", AppDomain.CurrentDomain.BaseDirectory + "ICOLync.exe");
}
catch (Exception ex)
{
Logger.Error(ex);
}
} //输出事件对应的ManagementBaseObject(本例中的Win32_Process实例)的信息
static string GetInfo(ManagementBaseObject mobj)
{
var instance = (ManagementBaseObject)mobj["TargetInstance"];
return instance["Name"].ToString();
} void wCreate_EventArrived(object sender, EventArrivedEventArgs e)
{
if (GetInfo(e.NewEvent).Equals("lync.exe"))
{
lyncnet.clsLyncNet cls = new lyncnet.clsLyncNet();
this.Invoke(new Action(() => { cls.NetMain(); }));
}
} void wDelete_EventArrived(object sender, EventArrivedEventArgs e)
{
if (GetInfo(e.NewEvent).Equals("lync.exe")) this.RestartMe();
} private void RestartMe()
{
Program._run.Close();
Process.Start(Application.ExecutablePath);
Process.GetCurrentProcess().Kill();
}
}

这个winform程序启动之后调用win32 api隐藏起来。检测到新增Lync.exe进程时,注册ICOLync插件,Lync.exe进程注销后,重启winform程序。开始还考虑把winform程序的进程保护起来,很麻烦,不同的操作系统,出现的状况还不一样,所以取消了。

2013.7.26修改:

使用System.Threading.Mutex互斥体,实现程序只启动单一进程,发现有一个Bug,在windows多用户的情况下,每一个用户都可以启动一个进程,所以要保持整天计算机只启动一个进程,应改为如下:

Lync二次开发关于Lync启动退出问题的更多相关文章

  1. kettle工具二次开发-代码启动JOB

    kettle工具是一款优秀的数据同步.数据处理的BI工具,收到了很多人的青睐.kettle软件通过可视化的图标可以让我们很轻易的能完成数据同步.处理的开发工作.但是使用kettle可视化界面在跑JOB ...

  2. Linux内核启动代码分析二之开发板相关驱动程序加载分析

    Linux内核启动代码分析二之开发板相关驱动程序加载分析 1 从linux开始启动的函数start_kernel开始分析,该函数位于linux-2.6.22/init/main.c  start_ke ...

  3. MongoDB之二基础入门(安装启动)

    mongodb中有三元素:数据库,集合,文档,其中“集合” 就是对应关系数据库中的“表”,“文档”对应“行”. 一. 下载 上MongoDB官网 ,我们发现有32bit和64bit,这个就要看你系统了 ...

  4. E8.Net 工作流二次开发架构平台

    一.          产品简介 E8.Net工作流开发架构是基于微软.Net技术架构的工作流中间件产品,是国内商业流程管理(BPM)领域在.Net平台上的领先产品,是快速搭建流程管理解决方案的二次开 ...

  5. Rational AppScan 标准版可扩展性和二次开发能力简介

    下载:IBM® Rational® AppScan 标准版  |   Web 应用安全与 IBM Rational AppScan 工具包 获取免费的 Rational 软件工具包系列,下载更多的 R ...

  6. 04 用户个人信息和二次开发django的文件存储系统

    用户的个人信息的前端页面如下: 业务逻辑分析 从上图中可以看出,需要后端传送的数据有,用户的名字和练习的地址,和最近的浏览记录. 用户的名字和联系的地址可以通过地址表(adress)中获得,地址表可以 ...

  7. AutoCAD二次开发——AutoCAD.NET API开发环境搭建

    AutoCAD二次开发工具:1986年AutoLisp,1989年ADS,1990年DCL,1993年ADS-RX,1995年ObjectARX,1996年Active X Automation(CO ...

  8. 关于搬运CSDN上学生信息管理系统的阅读与二次开发

    关于本篇博客内容,我大概分成了三个部分进行讲述:对于源代码的解读.二次重开发后程序的介绍和自己在做完对他人代码的解读和重开发后自己的一些感想. 一.  源代码的解读 在本部分的解读中主要分为三部分:该 ...

  9. [连载]《C#通讯(串口和网络)框架的设计与实现》- 12.二次开发及应用

    目       录 第十二章     二次开发及应用... 2 12.1        项目配制... 3 12.2        引用相关组件... 4 12.3        构建主程序... 5 ...

随机推荐

  1. 2、OpenCV Python 图像属性获取

    __author__ = "WSX" import cv2 as cv import numpy as np image = cv.imread("1.JPG" ...

  2. P2173 [ZJOI2012]网络

    \(\color{#0066ff}{ 题目描述 }\) 有一个无向图G,每个点有个权值,每条边有一个颜色.这个无向图满足以下两个条件: 对于任意节点连出去的边中,相同颜色的边不超过两条. 图中不存在同 ...

  3. Leetcode 520. Detect Capital 发现大写词 (字符串)

    Leetcode 520. Detect Capital 发现大写词 (字符串) 题目描述 已知一个单词,你需要给出它是否为"大写词" 我们定义的"大写词"有下 ...

  4. linux线程切换和进程切换

    进程切换分两步: 1.切换页目录以使用新的地址空间 2.切换内核栈和硬件上下文 对于linux来说,线程和进程的最大区别就在于地址空间,对于线程切换,第1步是不需要做的,第2是进程和线程切换都要做的. ...

  5. spring-redis 存储数据

    package com.fndsoft.bcis.utils; import org.springframework.beans.factory.annotation.Autowired;import ...

  6. windows 中使用 winscp 工具连接linux

    1.安装winscp 2.在linux系统中安装ssh,执行命令:sudo apt-get install openssh-server 3.连接成功

  7. P1111 修复公路(并查集)

    题目背景 AA地区在地震过后,连接所有村庄的公路都造成了损坏而无法通车.政府派人修复这些公路. 题目描述 给出A地区的村庄数NN,和公路数MM,公路是双向的.并告诉你每条公路的连着哪两个村庄,并告诉你 ...

  8. spoj COT - Count on a tree(主席树 +lca,树上第K大)

    您将获得一个包含N个节点的树.树节点的编号从1到Ñ.每个节点都有一个整数权重. 我们会要求您执行以下操作: uvk:询问从节点u到节点v的路径上的第k个最小权重 输入 在第一行中有两个整数Ñ和中号.( ...

  9. 使用wget下载oracle jdk1.8

    wget --no-cookies --no-check-certificate --header "Cookie: gpw_e24=http%3A%2F%2Fwww.oracle.com% ...

  10. java中使用nextLine(); 没有输入就自动跳过的问题?

    [问题分析] 必要的知识:in.nextLine();不能放在in.nextInt();代码段后面否则in.nextLine();会读入"\n"字符,但"\n" ...