在C#中简单调用FindWindow控制其他程序
2015-11-06 23:17
585 查看
C#本身是没有FindWindow这个函数的,
为什么没有呢?
很简单,C#毕竟是微软自家开发出来的。而WIN API中本来封装了很多对窗口的操作,所以当然能重用的就要重用,这些封装好的函数一般在系统dll中。
那应该要怎么在C#中调用封装好的DLL呢?
这就要用到C#中的一个属性类 DllImport,DllImport位于命名空间System.Runtime.InteropServices;
顾名思义,DllImport就是用来导入dll的,使用方法如下:
虽然样子看着有点吃藕,但还是非常实用的;
从引用的结构可以看出,引入的函数类似于声明,所以我们只要把上面那段代码添加到类中定义成员变量的地方即可;
调用了上面的两个函数之后,我们已经可以找到受控的应用程序窗口了;
接下来就是要进行最重要的一步了;
就是通过SendMessage给受控方发送消息:
关键是第四个参数,那么他们有什么不同呢:
为什么没有呢?
很简单,C#毕竟是微软自家开发出来的。而WIN API中本来封装了很多对窗口的操作,所以当然能重用的就要重用,这些封装好的函数一般在系统dll中。
那应该要怎么在C#中调用封装好的DLL呢?
这就要用到C#中的一个属性类 DllImport,DllImport位于命名空间System.Runtime.InteropServices;
using System.Runtime.InteropServices;
顾名思义,DllImport就是用来导入dll的,使用方法如下:
[DllImport("user32.dll", EntryPoint = "FindWindow", CharSet = CharSet.Auto)] private extern private static IntPtr FindWindow(string classname, string captionName); [DllImport("user32.dll", EntryPoint = "FindWindowEx", CharSet = CharSet.Auto)] private extern static IntPtr FindWindowEx(IntPtr parent, IntPtr child, string classname, string captionName); [DllImport("user32.dll")] static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, IntPtr wParam, [MarshalAs(UnmanagedType.LPStr)] string lParam); [DllImport("user32.dll", EntryPoint = "SendMessageA")] private static extern int SendMessage(IntPtr hwnd, int wMsg, int wParam, StringBuilder lParam); [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")] static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, IntPtr wParam, [MarshalAs(UnmanagedType.LPStr)] string lParam); [DllImport("user32.dll", EntryPoint = "SendMessageA")] private static extern int SendMessage(IntPtr hwnd, int wMsg, int wParam, StringBuilder lParam);
虽然样子看着有点吃藕,但还是非常实用的;
从引用的结构可以看出,引入的函数类似于声明,所以我们只要把上面那段代码添加到类中定义成员变量的地方即可;
//这就是用来查找要控制的应用程序窗口的 //className就是要查找窗口的类,一般设置为null即可 //captionName就是要查找的窗口的名称 FindWindow(string className, string captionName); //这是用来查找窗口中的控件的 //parent就是父窗口句柄,就是调用FindWindow的返回值 //child就是子窗口句柄(因为如果根据className进行查找的话,会找到很多结果,可以根据子句柄精确定位) //classname就是要查找的窗口的类,如果根据captionName进行查找的话则设置为null即可 //captionName为查找的控件的标题(如果是按钮则是按钮上的文字) FindWindowEx(IntPtr parent, IntPtr child, string className, string captionName);
调用了上面的两个函数之后,我们已经可以找到受控的应用程序窗口了;
接下来就是要进行最重要的一步了;
就是通过SendMessage给受控方发送消息:
//三个函数的卖相都是差不多的,除了第四个函数 //第一个参数为FindWindowEx找到的控件的句柄 //第二个参数为要传递的消息类型 //第三个参数如果你引入时引入类型为uint或int,如果不获取则设为0即可 //如果引入时为IntPtr则设为IntPtr.Zero,两者并没有什么区别 [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")] private static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, IntPtr wParam, [MarshalAs(UnmanagedType.LPStr)] string lParam); [DllImport("user32.dll", EntryPoint = "SendMessageA")] private static extern int SendMessage(IntPtr hwnd, int wMsg, int wParam, StringBuilder lParam);
关键是第四个参数,那么他们有什么不同呢:
//第四个看着就和第三个参数差不多 //所以这参数不用看也知道肯定是0的 //它一般是用于模拟点击按钮的 SendMessage(IntPtr hwnd, uint wMsg, int wParam, int lParam);
//[MarshalAs(UnmanagedType.LPStr)]看着有点吓人 //但其实他只是把string强制转换为字符串指针 //方便用于在程序间传递数据 //而我们使用时只要传入string即可 SendMessage(IntPtr hWnd, UInt32 Msg, IntPtr wParam, [MarshalAs(UnmanagedType.LPStr)] string lParam);
//StringBuilder就是可变字符串 //这个重载函数与前两个不相同的地方除了最后一个参数还有第三个参数 //第三个参数不再设为0 //而是要读取的字符串的长度 SendMessage(IntPtr hwnd, int wMsg, int wParam, StringBuilder lParam);
相关文章推荐
- Direct3D 地形
- C#开发模式
- C#判断操作系统类型总结
- 微软C# Process类的两个静态方法 存在内存泄露
- C#访问剪切板
- C#总结项目《影院售票系统》编写总结完结篇
- C#实现插入排序算法(Insection Sort)
- 浅析C#中的Attribute
- 如何绘制贝塞尔样条曲线和基数样条曲线[C#]
- C#异常处理和数据类型转换
- c# 正则表达式对网页进行内容抓取
- C# sbyte[]转byte[]
- c#在一般处理程序中使用session
- 【C#】使用StreamWriter类写入文件
- C#冒泡排序--详解
- 【C#】打开并读取文件第1行内容
- 【C#】打开文件并写入内容
- C#系统缓存全解析
- C#反射
- C#设置WebBrowser默认浏览器