【转载】.net与其他程序交互(API)

一、本例子,用 C# 的一个Winform程序,创建一个指定路径的文本文件,写入某些内容后,并保存。

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

Code
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 手册。要使用API,需要引入命名空间

Code
using System.Runtime.InteropServices;

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

.net与其他程序交互(API)Code
[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 );

Code
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 (“没有启动 [计算器]”);
}
}

三、最后再来一个,查找外部程序的控件

找到程序的窗口句柄后,发个消息, 这个贴子的IE窗口别关,把下面的代码复制到窗体代码中点一下Command1就可以了。
Option   Explicit
Private   Declare   Function   SendMessage   Lib   “user32”   Alias   “SendMessageA”   (ByVal  hwnd   As   Long,   ByVal   wMsg   As   Long,   ByVal   wParam   As   Long,   lParam   As   Any)  As   Long
Private   Declare   Function   FindWindow   Lib   “user32”   Alias   “FindWindowA”   (ByVal  lpClassName   As   String,   ByVal   lpWindowName   As   String)   As   Long
Private   Declare   Function   FindWindowEx   Lib   “user32”   Alias   “FindWindowExA”   (ByVal   hWnd1   As   Long,   ByVal   hWnd2   As   Long,   ByVal   lpsz1   As   String,   ByVal   lpsz2  As   String)   As   Long
Private   Const   WM_GETTEXT   =   &HD
Private   Sub   Command1_Click()
Dim   Handle   As   Long
Dim   wndText   As   String
wndText   =   Space(255)
Handle   =   FindWindow(“IEFrame”,   “请问如何获得一个外部程序窗口中文本框的内容?   –  Microsoft   Internet   Explorer”)
Handle   =   FindWindowEx(Handle,   0&,   “WorkerW”,   vbNullString)
Handle   =   FindWindowEx(Handle,   0&,   “ReBarWindow32”,   vbNullString)
Handle   =   FindWindowEx(Handle,   0&,   “ComboBoxEx32”,   vbNullString)
Handle   =   FindWindowEx(Handle,   0&,   “ComboBox”,   vbNullString)   ‘   获得窗口句柄
Handle   =   FindWindowEx(Handle,   0&,   “Edit”,   vbNullString)
SendMessage   Handle,   WM_GETTEXT,   256,   ByVal   wndText
wndText   =   Left(wndText,   InStr(wndText,   Chr(0)))
Debug.Print   wndText
End   Sub

发布者

PdBeta

QQ:7979779 邮箱:pdbeta@qq.com 网站:WWW.PdBeta.COM 数窗工作室微博:www.weibo.com/datawindow PdBeta的微博:www.weibo.com/pdbeta

发表评论

电子邮件地址不会被公开。 必填项已用*标注