C# 通过进程名/进程Id 操作窗口/程序
1. 判断窗口是否存在
1 private bool IsWindowExist(IntPtr handle) 2 { 3 return (!(GetWindow(new HandleRef(this, handle), 4) != IntPtr.Zero) && IsWindowVisible(new HandleRef(this, handle))); 4 } 5 6 [DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)] 7 public static extern IntPtr GetWindow(HandleRef hWnd, int uCmd); 8 9 [DllImport("user32.dll", CharSet = CharSet.Auto)] 10 public static extern bool IsWindowVisible(HandleRef hWnd);
2. 获取窗口句柄
1 /// <summary> 2 /// 获取应用程序窗口句柄 3 /// </summary> 4 /// <param name="processId"></param> 5 /// <returns></returns> 6 private IntPtr GetWindowHandle(int processId) 7 { 8 var windowHandle = IntPtr.Zero; 9 EnumThreadWindowsCallback windowsCallback = new EnumThreadWindowsCallback(FindMainWindow); 10 EnumWindows(windowsCallback, IntPtr.Zero); 11 //保持循环 12 GC.KeepAlive(windowsCallback); 13 14 bool FindMainWindow(IntPtr handle, IntPtr extraParameter) 15 { 16 int num; 17 GetWindowThreadProcessId(new HandleRef(this, handle), out num); 18 if (num == processId && IsWindowExist(handle)) 19 { 20 windowHandle = handle; 21 return true; 22 } 23 return false; 24 } 25 26 return windowHandle; 27 } 28 public delegate bool EnumThreadWindowsCallback(IntPtr hWnd, IntPtr lParam); 29 30 [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] 31 public static extern bool EnumWindows(EnumThreadWindowsCallback callback, IntPtr extraData); 32 33 [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] 34 public static extern int GetWindowThreadProcessId(HandleRef handle, out int processId);
3. 关闭应用窗口
根据进程Id关闭应用窗口:
1 /// <summary> 2 /// 关闭程序主窗口 3 /// </summary> 4 /// <param name="processId">进程ID</param> 5 public void CloseWindow(int processId) 6 { 7 var mwh = GetWindowHandle(processId); 8 SendMessage(mwh, MW_CLOSE, 0, 0); 9 } 10 const int MW_CLOSE = 0x0010; 11 12 [DllImport("User32.dll", EntryPoint = "SendMessage")] 13 private static extern int SendMessage(IntPtr hWnd, int Msg, int wParam, int lParam);
关闭所有此进程名的窗口:
1 public void CloseAllWindows(string processName) 2 { 3 Process[] processList = Process.GetProcessesByName(processName); 4 foreach (Process process in processList) 5 { 6 CloseMainWindow(process.Id); 7 } 8 }
当然,直接杀进程,是最快的方法:
1 /// <summary> 2 /// 关闭所有进程 3 /// </summary> 4 /// <param name="processName"></param> 5 /// <returns></returns> 6 public static bool CloseAllProcesses(string processName) 7 { 8 try 9 { 10 Process[] psEaiNotes = Process.GetProcessesByName(processName); 11 foreach (Process psEaiNote in psEaiNotes) 12 { 13 psEaiNote.Kill(); 14 } 15 } 16 catch 17 { 18 return false; 19 } 20 21 return true; 22 }
4. 重启程序
1 string appFileName = currentClientProcess.MainModule.FileName; 2 3 Process newClient = new Process(); 4 newClient.StartInfo.FileName = appFileName; 5 // 设置要启动的进程的初始目录 6 newClient.StartInfo.WorkingDirectory = System.Windows.Forms.Application.ExecutablePath; 7 8 //启动程序 9 currentClientProcess.Kill(); 10 newClient.Start();
窗口之间发送/接收消息的处理,请参考《C# 跨进程通信》
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Python全栈工程师 (类变量、方法、继承、覆盖)
ParisGabriel 每天坚持手写一天一篇 决定坚持几年 为了梦想为了信仰 开局一张图 Python人工智能从入门到精通 补充: 实例方法都是操作实例对象的 属于此类对象的方法 实例变量 添加/修改属性: 对象.属性名 = 表达式 删除: del 对象.属性名 类 | 对象 | 实例 class object instance 类的本质上也是对象 类可以创建此类对象 ----------------------------------------------------------------------------------------------------------------- 类: 类变量: 类变量是类的属性, 此属性属于类, 不属于此类的实例 作用: 通常用来储存该类创建的对象的共同属性 说明: 类变量可以通过该类的实例直接访问 类变量可以通过类的实例间接访问 类变量可以通过此类的对象__class__属性间接访问示例: # -*- coding:utf-8 -*- # 类变量 class Human: total_cou...
- 下一篇
node事件循环 EventEmitter 异步I/O Buffer缓冲区 模块
node.js事件循环 node.js单进程,单线程的程序每一个api都支持回调所有的事件机制都是设计模式中的 一共是23种设计模式 http://design-patterns.readthedocs.io/zh_CN/latest/behavioral_patterns/observer.html 一个对象发生改变的时候,将自动通知其他对象,其他对象将相应的做出反应。发生改变的对象为观察目标,被通知的对象为观察者。一个观察目标可以对应多个观察者,而这些观察者之间没有任何联系,可以根据需要增加观察者,使得系统更加容易扩展,依赖关系为一对多,又被称为模型-视图模式 事件驱动程序 web server接收到请求,将其关闭,进行处理,然后接着服务下一个web请求。当请求完成以后,放回处理队列,当到达队列开头的时候,将其结果返回给用户即非阻塞式I/O 事件驱动I/O会有一个主循环来监听事件,当检测到事件以后,触发回调函数 代码 PS C:\Users\mingm\Desktop\test> node main.js 连接成功 数据接收成功 程序执行完毕 PS C:\Users\ming...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS8编译安装MySQL8.0.19
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- SpringBoot2整合Redis,开启缓存,提高访问速度
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- Hadoop3单机部署,实现最简伪集群
- CentOS7,CentOS8安装Elasticsearch6.8.6
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果