C# 通过进程名/进程Id 操作窗口/程序

摘要:
(GetWindow(newHandleRef(this,handle),4)!

1. 判断窗口是否存在

1     private boolIsWindowExist(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, intuCmd);
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(intprocessId)
7 {
8         var windowHandle =IntPtr.Zero;
9         EnumThreadWindowsCallback windowsCallback = newEnumThreadWindowsCallback(FindMainWindow);
10 EnumWindows(windowsCallback, IntPtr.Zero);
11         //保持循环
12 GC.KeepAlive(windowsCallback);
13 
14         boolFindMainWindow(IntPtr handle, IntPtr extraParameter)
15 {
16             intnum;
17             GetWindowThreadProcessId(new HandleRef(this, handle), outnum);
18             if (num == processId &&IsWindowExist(handle))
19 {
20                 windowHandle =handle;
21                 return true;
22 }
23             return false;
24 }
25 
26         returnwindowHandle;
27 }
28     public delegate boolEnumThreadWindowsCallback(IntPtr hWnd, IntPtr lParam);
29 
30     [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
31     public static extern boolEnumWindows(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(intprocessId)
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(stringprocessName)
2 {
3             Process[] processList =Process.GetProcessesByName(processName);
4             foreach (Process process inprocessList)
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(stringprocessName)
7 {
8         try
9 {
10             Process[] psEaiNotes =Process.GetProcessesByName(processName);
11             foreach (Process psEaiNote inpsEaiNotes)
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 = newProcess();
4     newClient.StartInfo.FileName =appFileName;
5     //设置要启动的进程的初始目录
6     newClient.StartInfo.WorkingDirectory =System.Windows.Forms.Application.ExecutablePath;
7     
8     //启动程序
9 currentClientProcess.Kill();
10     newClient.Start();

窗口之间发送/接收消息的处理,请参考《C# 跨进程通信

免责声明:文章转载自《C# 通过进程名/进程Id 操作窗口/程序》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇java~使用枚举来实现接口的多态(十一)Maven运行TestNG的testcase 两种方式:testng.xml和testngCase.java下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

随便看看

OSSEC初探

OSSEC的初始概念:OSSEC是一个开源的基于主机的入侵检测系统,可以执行日志分析、完整性检查、windows注册表监视、隐藏检测和实时报警。简单地说,OSSEC在C/S模式下工作。代理监视和收集信息并将其报告给服务器。服务器分析并预处理信息,并通过电子邮件将系统更改发送给管理员。...

EwoMail 开源邮件服务器安装教程

本教程示例中使用的主要域名是ewomail.cn。设置主机名EwoMail将在安装后默认使用带有域名前缀mail的主机名。例如,mail.ewomail。cn将系统主机名更改为mail.ewomail.cn。查看当前主机名hostname-f修改主机名,修改文件/etc/sysconfig/network修改文件/etc/hosts,添加mail.ewoma...

Caused by: com.alibaba.druid.pool.DataSourceClosedException: dataSource already closed

春季启动正常启动后,计划任务中的数据库查询报告错误。错误消息如下:1Causedby:org.apache。伊巴提斯。例外情况。PersistenceException:2###错误查询数据库。暂停:org.springframework。jdbc。无法获取JdbcConnection异常:无法获取JDBC连接;3estedexetinisom.alibab...

用python调用caffe时出错:AttributeError: 'module' object has no attribute 'bool_'

下面给出了一个解决方案,即重命名冲突的io文件:numpyと PyCaffe公司が io。年が 竞争す る よ で す$ pythonclassify。py--raw_scale255~/caffe/101_ObjectCategories/airaires/image_0001.jpg../result.npyTraceback:文件“classif.py...

C# Winform Treeview控件

WinformTreeview控件目录手动添加节点。丰富节点数据并清除所有节点信息。选择指定的节点。函数GetAllTreeNodeWinformTreeview控件手动添加节点//在根节点下添加根节点和子节点TreeNodeCollectionRoot=treeView1.Nodes;TreeNodecurNode=根。添加(“良好”);curN(电流)...

Json对象转Ts类

其次,Json是一种轻量级的数据交换格式。在前端和后端之间的数据交互过程中,后端接口返回Json格式的数据,前端需要使用相应的Ts类对象来接收它。此时,如果后端提供样本数据或现有接口返回的Json格式数据,是否有方法帮助我们从Json格式数据生成Ts类?介绍了三个主要功能。1.查看Json对应的Ts类,将要格式化的Json字符串复制粘贴到中间编辑区域。单击右...