Lync二次开发关于Lync启动退出问题
2013-07-02 10:40
204 查看
以前使用C++开发的version.dll文件,由于各个用户环境的不同,造成某些用户加载不了我们开发的插件,并且写version.dll的同事还没找到好的解决办法,所以得换一种思路去解决这个问题,就是Lync启动时加载我们的插件。
因此写了一个winform程序来监控进程的变化,这个程序还要设置为开机启动。下面是主要代码:
View Code
这个winform程序启动之后调用win32 api隐藏起来。检测到新增Lync.exe进程时,注册ICOLync插件,Lync.exe进程注销后,重启winform程序。开始还考虑把winform程序的进程保护起来,很麻烦,不同的操作系统,出现的状况还不一样,所以取消了。
2013.7.26修改:
使用System.Threading.Mutex互斥体,实现程序只启动单一进程,发现有一个Bug,在windows多用户的情况下,每一个用户都可以启动一个进程,所以要保持整天计算机只启动一个进程,应改为如下:
因此写了一个winform程序来监控进程的变化,这个程序还要设置为开机启动。下面是主要代码:
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 > 0) { lyncnet.clsLyncNet cls = new lyncnet.clsLyncNet(); this.Invoke(new Action(() => { cls.NetMain(); })); } //创建WQL事件查询,用于实例创建 var qCreate = new WqlEventQuery("__InstanceCreationEvent", TimeSpan.FromSeconds(1), //WHTHIN = 1 "TargetInstance ISA 'Win32_Process'"); //创建WQL事件查询,用于实例删除 var qDelete = new WqlEventQuery("__InstanceDeletionEvent", TimeSpan.FromSeconds(1), //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, 0); } } 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(); } }
View Code
这个winform程序启动之后调用win32 api隐藏起来。检测到新增Lync.exe进程时,注册ICOLync插件,Lync.exe进程注销后,重启winform程序。开始还考虑把winform程序的进程保护起来,很麻烦,不同的操作系统,出现的状况还不一样,所以取消了。
2013.7.26修改:
使用System.Threading.Mutex互斥体,实现程序只启动单一进程,发现有一个Bug,在windows多用户的情况下,每一个用户都可以启动一个进程,所以要保持整天计算机只启动一个进程,应改为如下:
相关文章推荐
- 几个关于Oracle EBS二次开发的问题
- 关于OPhone开发环境下重装ADT后无法找到库文件和无法启动模拟器的问题处理
- 关于Android开发中使用System.exit(0)的问题(如写返回键响应时用到双击退出函数的时候)
- 关于FlexPaper 2.1.2版本 二次开发 Logo 、打印、搜索、缩略图、添加按钮、js交互、右键菜单等相关问题
- 关于Android开发中启动应用但桌面不显示图标的问题
- Android开发:关于在启动页面就会报相机异常等类似问题
- windows游戏开发中一个关于Visual Studio的编译链接成功,输出窗口却显示线程已退出。无法运行项目的问题
- 关于水晶报表二次开发的几个问题
- 关于DWG格式读写控件的二次开发问题
- 关于android百度地图开发LocationClient对象不能启动的问题解决
- 关于FlexPaper 2.1.2版本 二次开发 Logo 、打印、搜索、缩略图、添加按钮、js交互、右键菜单等相关问题
- 关于FlexPaper 2.1.2版本 二次开发 Logo 、打印、搜索、缩略图、添加按钮、js交互、右键菜单、书签等相关问题
- 关于引用exchange webservice做二次开发的一些问题
- 关于把struts2项目修改为开发模式,项目无法启动问题说明
- 关于海康威视网络摄像机二次开发问题
- 关于Revit 二次开发问题请咨询Autodesk ADN
- 关于xampp 集成开发包电脑重启mysql无法启动的问题
- 关于RTX二次开发.net程序,80040154问题的解决办法
- 论坛里关于ArcEngine二次开发的分类统计的问题
- 关于FlexPaper 2.1.2版本 二次开发 Logo 、打印、搜索、缩略图、添加按钮、js交互、右键菜单等相关问题