C# SendMessage 控制其他进程程序2010年04月21日 星期三 3:00Win32 平台是 消息驱动模式
.Net 框架是 事件驱动模式
标题所指的 “控制外部程序”,外部程序是指与本程序无内在相关性的另外一个程序
基于上面提到的,对于.NET的winform程序,在默认情况下(即未对接收消息的事件做自定义处理,说白了:就是没有 重写/覆写(override)窗体(Form)的DefWndProc 事件),.Net 的 winform 程序,是不响应所接收到的自定义消息的。

我们这里要讨论的内容,就分为两种情况:

C#/.NET的程序,控制外部的 win32程序(win16不做考虑)
C#/.NET的程序,控制外部的 .NET程序
从标题,大家也看到, C# 对外部程序的控制, 我们也分为两种情况来讨论:

.NET 平台自带的 SendKeys 和 Process 结合的方式
完全利用 Windows API 的消息机制 的方式
一、.NET平台自带的 Process 和 SendKeys 结合的方式
本例子,用 C# 的一个Winform程序,创建一个指定路径的文本文件,写入某些内容后,并保存。

为了看清效果,将 Form 的 TopMost 设为 true

private void button1_Click( object sender, EventArgs e )
{
//启动notepad.exe 记事本程序,并在d:\下创建 或 打开 text_test.txt文件
System.Diagnostics.Process txt = System.Diagnostics.Process.Start ( @"notepad.exe", @"d:\text_test.txt" );
txt.StartInfo.WindowStyle = ProcessWindowStyle.Normal;
//等待一秒,以便目标程序notepad.exe输入状态就绪
txt.WaitForInputIdle ( 1000 );
//如果目标程序 notepad.exe 没有停止响应,则继续
if ( txt.Responding )
{
//开始写入内容
SendKeys.SendWait ( "-----下面的内容是外部程序自动写入-----\r\n" );
SendKeys.SendWait ( this.textBox1.Text );     //将文本框内的内容写入
SendKeys.SendWait ( "{Enter}{Enter}" );     //写入2个回车
SendKeys.SendWait ( "文档创建时间:" );
SendKeys.SendWait ( "{F5}" );          //发送F5按键
SendKeys.SendWait ("{Enter}");       //发送回车键
SendKeys.SendWait ( "^s" );       //发送 Ctrl + s 键
SendKeys.SendWait ( "%{F4}" );      // 发送 Alt + F4 键
MessageBox.Show ("文件已经保存成功!");
}
}

注: SendKeys 发送的按键的接收窗体,必须是当前的活动窗体

二、C# 利用 Windows API 控制 外部的 win32 程序
我们这里,用控制 “计算器”程序,算一个 3 + 2 = 5 的算式来做示例。

API 中我们要用到的函数有 FindWindow, FindWindowEx, SendMessage, SetForegroundWindow

对于API的引用方法,大家去看 API 手册,我这里提供一个VB自带的API查询程序

要使用API,需要引入命名空间

using System.Runtime.InteropServices;

下面的API引用部分的代码,放入 class 内部

[DllImport ( "user32.dll", EntryPoint = "FindWindow", SetLastError = true )]
private static extern IntPtr FindWindow( string lpClassName, string lpWindowName );
[DllImport ( "user32.dll", EntryPoint = "FindWindowEx", SetLastError = true )]
private static extern IntPtr FindWindowEx( IntPtr hwndParent, uint hwndChildAfter, string lpszClass, string lpszWindow );
[DllImport ( "user32.dll", EntryPoint = "SendMessage", SetLastError = true, CharSet = CharSet.Auto )]
private static extern int SendMessage( IntPtr hwnd, uint wMsg, int wParam, int lParam );
[DllImport ( "user32.dll", EntryPoint = "SetForegroundWindow", SetLastError = true )]
private static extern void SetForegroundWindow( IntPtr hwnd );

private void button1_Click( object sender, EventArgs e )
{
const uint BM_CLICK = 0xF5; //鼠标点击的消息,对于各种消息的数值,大家还是得去API手册
IntPtr hwndCalc = FindWindow ( null, "计算器" ); //查找计算器的句柄
if ( hwndCalc != IntPtr.Zero )
{
IntPtr hwndThree = FindWindowEx ( hwndCalc, 0, null, "3" ); //获取按钮3 的句柄
IntPtr hwndPlus = FindWindowEx ( hwndCalc, 0, null, "+" );  //获取按钮 + 的句柄
IntPtr hwndTwo = FindWindowEx ( hwndCalc, 0, null, "2" );  //获取按钮2 的句柄
IntPtr hwndEqual = FindWindowEx ( hwndCalc, 0, null, "=" ); //获取按钮= 的句柄
SetForegroundWindow ( hwndCalc );    //将计算器设为当前活动窗口
System.Threading.Thread.Sleep ( 2000 );   //暂停2秒让你看到效果
SendMessage ( hwndThree, BM_CLICK, 0, 0 );
System.Threading.Thread.Sleep ( 2000 );   //暂停2秒让你看到效果
SendMessage ( hwndPlus, BM_CLICK, 0, 0 );
System.Threading.Thread.Sleep ( 2000 );   //暂停2秒让你看到效果
SendMessage ( hwndTwo, BM_CLICK, 0, 0 );
System.Threading.Thread.Sleep ( 2000 );   //暂停2秒让你看到效果
SendMessage ( hwndEqual, BM_CLICK, 0, 0 );
System.Threading.Thread.Sleep ( 2000 );
MessageBox.Show ("你看到结果了吗?");
}
else
{
MessageBox.Show ("没有启动 [计算器]");
}
}

C# SendMessage 控制其他进程程序相关推荐

  1. Linux-进程控制详解(进程创建+进程终止+进程等待+进程程序替换)

    Linux进程控制 1. 进程创建 1.1 fork 1.2 vfork 2. 进程终止 3. 进程等待 3.1 为什么要进程等待 3.2 wait 3.3 waitpid 3.4 获取子进程退出信息 ...

  2. [Linux-进程控制] 进程创建进程终止进程等待进程程序替换简易shell

    [Linux-进程控制] 进程创建&进程终止&进程等待&进程程序替换&简易shell 进程创建 fork函数回顾 双返回值 为什么要给子进程返回0,给父进程返回子进程的 ...

  3. 【Linux】linux进程--进程控制:进程创建、进程终止、进程等待、进程程序替换

    目录 1.进程创建 1)重温fork():让正在运行的进程创建出来一个子进程:从已存在的进程中创建一个新的进程,新进程为子进程而远进程为父进程. 2)fork内部完成的事情 3)用户空间 & ...

  4. 小实验:用创建进程()打开计算器,然后关闭进程句柄。再用打开进程(进程ID),使用两次,得到两个进程句柄。实验目的:这两个进程句柄都能控制这个进程吗?通过该试验加深对句柄的理解!!...

    小实验:用创建进程()打开计算器,然后关闭进程句柄.再用打开进程(进程ID),使用两次,得到两个进程句柄.实验目的:这两个进程句柄都能控制这个进程吗? .版本 2 .程序集 窗口程序集1 .子程序 _ ...

  5. 用PHP控制Nagios进程

    单位一直用Nagios做数据中心的服务监控,由于近期应用升级频繁,经常需要配合启.停nagios进程,以免产生错误告警.为了使升级流程更顺畅,希望给应用组一个PHP网页来控制Nagios程序. 开始动 ...

  6. 广州大学学生实验报告,进程控制与进程通信

                                                    广州大学学生实验报告 开课学院及实验室: 计算机科学与网络工程学院  电子楼418B        20 ...

  7. Linux下的C编程实战(开发平台搭建,文件系统编程,进程控制与进程通信编程,“线程”控制与“线程”通信编程,驱动程序设计,专家问答)

    Linux下的C编程实战(一) ――开发平台搭建 1.引言 Linux操作系统在服务器领域的应用和普及已经有较长的历史,这源于它的开源特点以及其超越Windows的安全性和稳定性.而近年来,Linux ...

  8. Node学习七 —— 创建和控制外部进程

    创建和控制外部进程 Node是被设计用来高效处理/O操作的,但正如你所见,某些类型的程序并不适用于这种模式.比如当用Node处理一个CPU密集型任务时可能会阻塞事件循环,所以应该将CPU密集任务分配给 ...

  9. linux守护进程以及如何编写守护进程程序

    守护进程 理论 「守护进程」是 Linux 的一种长期运行的后台服务进程,也有人称它为「精灵进程」.我们常见的 httpd.named.sshd 等服务都是以守护进程 Daemon 方式运行的,通常服 ...

  10. Linux系统编程18:超详解进程程序替换exec函数的一些用法

    文章目录 (1)进程程序替换是什么 (2)exec-替换函数 (3)实例展示-了解exec函数的替换原理 A:execl和execv B:execlp和execvp C:替换自己的程序和execle ...

最新文章

  1. 新一代的树莓派3版本——Raspberry Pi 3 发布了
  2. tornado总结7-文件切片异步非阻塞下载
  3. MySQL创建触发器(CREATE TRIGGER)
  4. React Native 和ionic2 你选择哪一个?
  5. 用了2年多快3年的老ASUS本子出了点小问题了
  6. BZOJ 4819: [Sdoi2017]新生舞会
  7. Oracle触发器和MySQL触发器之间的区别
  8. 凌波微步-python小游戏源码下载
  9. python urllib3离线安装_离线安装spyder的Python环境
  10. CText类使用例程
  11. linux系统中各颜色的代表
  12. 如何把kafka Log4j1.x升级到Log4j2.x ?
  13. python语言月份缩写_[宜配屋]听图阁
  14. 命令激活Windows系统
  15. 什么是1u服务器;服务器中的u是什么意思
  16. matlab之计算排列组合
  17. 关于BOS开发工具启动EAS客户端提示使用限期0天的问题
  18. xp如何配置信息服务器地址,xp如何配置信息服务器地址
  19. 用python的turtle模块给女票画个小心心
  20. Vue学习之认识到应用(三)

热门文章

  1. 微信小程序开发入门需要学什么?
  2. win10的Pytorch最全安装教程,解决pytorch安装问题!
  3. 苹果cms怎么上传本地视频资源
  4. 需要记住的的资料网址
  5. 融资轮数划分 天使轮 种子轮 preA A A+ B轮 C轮
  6. android称重的技术,智能称重系统之智能地磅称解决方案
  7. 串口调试助手没有显示
  8. Stduino IDE stm32 最小系统 小蓝板 驱动继电器(五)
  9. 用了三天终于安装成功 jsv8 centos7.6 + 宝塔+ php7.2 安装V8js
  10. 获取Excel合并单元格的值