首页 技术 正文
技术 2022年11月17日
0 收藏 492 点赞 3,410 浏览 2988 个字

  C#本身是没有FindWindow这个函数的,

  为什么没有呢?

  很简单,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);
相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:8,909
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,434
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,249
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,060
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,692
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,730