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

简介: 1. 判断窗口是否存在 1 private bool IsWindowExist(IntPtr handle) 2 { 3 return (!(GetWindow(new HandleRef(this, handle), 4) != IntPtr.

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# 跨进程通信》 

 

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须在文章页面给出原文连接,否则保留追究法律责任的权利。
目录
相关文章
|
22天前
|
Web App开发 数据采集 C#
解决Firefox代理身份验证弹出窗口问题:C#和Selenium实战指南
本文是一份实战指南,主要介绍了在使用Selenium和C#进行网页抓取时,如何设置代理服务器的身份验证以避免自动化流程中断。文章首先列出了所需的开发环境和工具,然后通过C#代码示例详细展示了如何在Firefox浏览器中设置代理IP、端口、用户名、密码以及UserAgent和Cookies。代码中包含了自动处理代理身份验证弹出窗口的配置,以及如何添加Cookies的方法。最后,文章强调了结合C#和Selenium可以提高网页抓取任务的稳定性和效率。
解决Firefox代理身份验证弹出窗口问题:C#和Selenium实战指南
|
19天前
|
Python
惊!Python进程间通信IPC,让你的程序秒变社交达人,信息畅通无阻
【8月更文挑战第1天】在编程世界中,进程间通信(IPC)犹如一场社交舞会,各进程通过IPC机制优雅地交换信息,共同完成复杂任务。IPC就像隐形桥梁,连接并行运行的进程,使它们能跨越边界自由沟通。Python提供了多种IPC机制,如管道、队列、共享内存和套接字等,适应不同需求。例如,使用`multiprocessing.Queue`实现进程间通信,生产者向队列添加数据,消费者取出并处理数据,两者虽独立却能有效协作。IPC打破了进程界限,使得程序能像社交达人般自由交流,构建出高效、灵活的应用。掌握IPC,让程序信息畅通无阻。
16 1
|
1天前
|
安全 C# 开发者
【C# 多线程编程陷阱揭秘】:小心!那些让你的程序瞬间崩溃的多线程数据同步异常问题,看完这篇你就能轻松应对!
【8月更文挑战第18天】多线程编程对现代软件开发至关重要,特别是在追求高性能和响应性方面。然而,它也带来了数据同步异常等挑战。本文通过一个简单的计数器示例展示了当多个线程无序地访问共享资源时可能出现的问题,并介绍了如何使用 `lock` 语句来确保线程安全。此外,还提到了其他同步工具如 `Monitor` 和 `Semaphore`,帮助开发者实现更高效的数据同步策略,以达到既保证数据一致性又维持良好性能的目标。
7 0
|
26天前
|
数据采集 Web App开发 JavaScript
快速参考:用C# Selenium实现浏览器窗口缩放的步骤
在C#结合Selenium的网络爬虫应用中,掌握浏览器窗口缩放、代理IP、cookie与user-agent设置至关重要。本文详述了如何配置代理(如亿牛云加强版),自定义用户代理,启动ChromeDriver,并访问目标网站如抖音。通过执行JavaScript代码实现页面缩放至75%,并添加cookie增强匿名性。此策略有效规避反爬机制,提升数据抓取的准确度与范围。代码示例展示了整个流程,确保爬虫操作的灵活性与高效性。
|
1月前
|
弹性计算 DataWorks 关系型数据库
DataWorks操作报错合集之DataX在执行过程中接收到了意外的信号15,导致进程被终止,该怎么处理
DataWorks是阿里云提供的一站式大数据开发与治理平台,支持数据集成、数据开发、数据服务、数据质量管理、数据安全管理等全流程数据处理。在使用DataWorks过程中,可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。
|
8天前
|
并行计算 开发者 Python
解锁Python多进程编程的超能力:并行计算的魔法与奇迹,探索处理器核心的秘密,让程序性能飞跃!
【8月更文挑战第12天】在Python编程领域,多进程编程是一项关键技能,能有效提升程序效率。本文通过理论与实践结合,深入浅出地介绍了Python中的多进程编程。首先解释了多进程的概念:即操作系统中能够并发执行的多个独立单元,进而提高整体性能。接着重点介绍了`multiprocessing`模块,演示了如何创建和启动进程,以及进程间的通信方式,如队列等。此外,还提到了更高级的功能,例如进程池管理和同步原语等。通过这些实例,读者能更好地理解如何在实际项目中利用多核处理器的优势,同时注意进程间通信和同步等问题,确保程序稳定高效运行。
21 0
|
14天前
|
C#
WPF/C#:程序关闭的三种模式
WPF/C#:程序关闭的三种模式
24 0
|
1月前
|
C#
C#进程调用FFmpeg操作音视频
因为公司需要对音视频做一些操作,比如说对系统用户的发音和背景视频进行合成,以及对多个音视频之间进行合成,还有就是在指定的源背景音频中按照对应的规则在视频的多少秒钟内插入一段客户发音等一些复杂的音视频操作。本篇文章主要讲解的是使用C#进程(Process)调用FFmpeg.exe进行视频合并、音频合并、音频与视频合并成视频这几个简单的音视频操作。
|
1月前
|
Java 调度 Windows
Java面试之程序、进程、线程、管程和并发、并行的概念
Java面试之程序、进程、线程、管程和并发、并行的概念
20 0
进程管理,每一个程序运行,都会有一个独有的ID,进程号
进程管理,每一个程序运行,都会有一个独有的ID,进程号