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

  为什么没有呢?

  很简单,C#毕竟是微软自家开发出来的。而WIN API中本来封装了很多对窗口的操作,所以当然能重用的就要重用,这些封装好的函数一般在系统dll中。

  那应该要怎么在C#中调用封装好的DLL呢?

  这就要用到C#中的一个属性类  DllImport,DllImport位于命名空间System.Runtime.InteropServices;

  1.     using System.Runtime.InteropServices;

  顾名思义,DllImport就是用来导入dll的,使用方法如下:

  

  1.       [DllImport("user32.dll", EntryPoint = "FindWindow", CharSet = CharSet.Auto)]
  2. private extern private static IntPtr FindWindow(string classname, string captionName);
  3.  
  4. [DllImport("user32.dll", EntryPoint = "FindWindowEx", CharSet = CharSet.Auto)]
  5. private extern static IntPtr FindWindowEx(IntPtr parent, IntPtr child, string classname, string captionName);
  6.  
  7. [DllImport("user32.dll")]
  8. static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, IntPtr wParam, [MarshalAs(UnmanagedType.LPStr)] string lParam);
  9.  
  10. [DllImport("user32.dll", EntryPoint = "SendMessageA")]
  11. private static extern int SendMessage(IntPtr hwnd, int wMsg, int wParam, StringBuilder lParam);
  12.  
  13.     [DllImport("user32.dll", EntryPoint = "SendMessage", SetLastError = true, CharSet = CharSet.Auto)]
  14.     private static extern int SendMessage(IntPtr hwnd, uint wMsg, int wParam, int lParam);
  15.     [DllImport("user32.dll")]
  16.     static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, IntPtr wParam, [MarshalAs(UnmanagedType.LPStr)] string lParam);
  17.     [DllImport("user32.dll", EntryPoint = "SendMessageA")]
  18.     private static extern int SendMessage(IntPtr hwnd, int wMsg, int wParam, StringBuilder lParam);

  虽然样子看着有点吃藕,但还是非常实用的;

  从引用的结构可以看出,引入的函数类似于声明,所以我们只要把上面那段代码添加到类中定义成员变量的地方即可;

  

  1.     //这就是用来查找要控制的应用程序窗口的
  2.     //className就是要查找窗口的类,一般设置为null即可
  3.     //captionName就是要查找的窗口的名称
  4.     FindWindow(string className, string captionName);
  5.  
  6.     //这是用来查找窗口中的控件的
  7.     //parent就是父窗口句柄,就是调用FindWindow的返回值
  8.     //child就是子窗口句柄(因为如果根据className进行查找的话,会找到很多结果,可以根据子句柄精确定位)
  9.     //classname就是要查找的窗口的类,如果根据captionName进行查找的话则设置为null即可
  10.     //captionName为查找的控件的标题(如果是按钮则是按钮上的文字)
  11.     FindWindowEx(IntPtr parent, IntPtr child, string className, string captionName);

  调用了上面的两个函数之后,我们已经可以找到受控的应用程序窗口了;

   接下来就是要进行最重要的一步了;

   就是通过SendMessage给受控方发送消息:

  1.      //三个函数的卖相都是差不多的,除了第四个函数
         //第一个参数为FindWindowEx找到的控件的句柄
         //第二个参数为要传递的消息类型
         //第三个参数如果你引入时引入类型为uint或int,如果不获取则设为0即可
         //如果引入时为IntPtr则设为IntPtr.Zero,两者并没有什么区别
         [DllImport("user32.dll", EntryPoint = "SendMessage", SetLastError = true, CharSet = CharSet.Auto)]
  2. private static extern int SendMessage(IntPtr hwnd, uint wMsg, int wParam, int lParam);
  3. [DllImport("user32.dll")]
  4. private static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, IntPtr wParam, [MarshalAs(UnmanagedType.LPStr)] string lParam);
  5. [DllImport("user32.dll", EntryPoint = "SendMessageA")]
  6. private static extern int SendMessage(IntPtr hwnd, int wMsg, int wParam, StringBuilder lParam);

  关键是第四个参数,那么他们有什么不同呢:

  1.   
    //第四个看着就和第三个参数差不多
    //所以这参数不用看也知道肯定是0的
    //它一般是用于模拟点击按钮的
    SendMessage(IntPtr hwnd, uint wMsg, int wParam, int lParam);
  1. //[MarshalAs(UnmanagedType.LPStr)]看着有点吓人
    //但其实他只是把string强制转换为字符串指针
    //方便用于在程序间传递数据
    //而我们使用时只要传入string即可
    SendMessage(IntPtr hWnd, UInt32 Msg, IntPtr wParam, [MarshalAs(UnmanagedType.LPStr)] string lParam);
  1. //StringBuilder就是可变字符串
    //这个重载函数与前两个不相同的地方除了最后一个参数还有第三个参数
    //第三个参数不再设为0
    //而是要读取的字符串的长度
    SendMessage(IntPtr hwnd, int wMsg, int wParam, StringBuilder lParam);

在C#中简单调用FindWindow控制其他程序的更多相关文章

  1. C#中简单调用MD5方法以及MD5简介

    MD5简介:          MD5的全称是Message-Digest Algorithm 5,在90年代初由MIT的计算机科学实验室和RSA Data Security Inc发明,经MD2.M ...

  2. SEXTANTE中调用任意C++控制台程序的简单例子

    在sextante中单纯利用python或者调用sextante已有算法进行自定义开发,很多情况下速度不咋给力,同样的操作调用QGIS的C++插件比用sextante里的算法要快,有时候快的 还不止一 ...

  3. 经测试稳定可用的蓝牙链接通信Demo,记录过程中遇到的问题的思考和解决办法,并整理后给出一个Utils类可以简单调用来实现蓝牙功能

    说明:这是本人在蓝牙开发过程中遇到过的问题记录和分析,以及解决办法. 在研究过程中,许多的前人给出的解决方案和思路指导对我相当有帮助,但并非都是可采取的解决方法, 经过本人对这些方法的测试和使用过后, ...

  4. ? 原创: 铲子哥 搜狗测试 今天 shell编程的时候,往往不会把所有功能都写在一个脚本中,这样不太好维护,需要多个脚本文件协同工作。那么问题来了,在一个脚本中怎么调用其他的脚本呢?有三种方式,分别是fork、source和exec。 1. fork 即通过sh 脚本名进行执行脚本的方式。下面通过一个简单的例子来讲解下它的特性。 创建father.sh,内容如下: #!/bin/bas

    ? 原创: 铲子哥 搜狗测试 今天 shell编程的时候,往往不会把所有功能都写在一个脚本中,这样不太好维护,需要多个脚本文件协同工作.那么问题来了,在一个脚本中怎么调用其他的脚本呢?有三种方式,分别 ...

  5. 简单记录下RestTemplate 中postForObject调用例子

    学无止境! 今天无意中做了下RestTemplate调用demo,简单的尝试了下一个项目调用另一个项目接口示例 在A项目中创建可访问controller 然后在B项目中进行调用 调用成功

  6. 在浏览器中简单输入一个网址,解密其后发生的一切(http请求的详细过程)

    在浏览器中简单输入一个网址,解密其后发生的一切(http请求的详细过程) 原文链接:http://www.360doc.com/content/14/1117/10/16948208_42571794 ...

  7. jQuery懒加载插件 – jquery.lazyload.js简单调用

    Lazy Load 是一个用 JavaScript 编写的 jQuery 插件. 它可以延迟加载长页面中的图片. 在浏览器可视区域外的图片不会被载入, 直到用户将页面滚动到它们所在的位置. 这与图片预 ...

  8. Unity在Android和iOS中如何调用Native API

    本文主要是对unity中如何在Android和iOS中调用Native API进行介绍. 首先unity支持在C#中调用C++ dll,这样可以在Android和iOS中提供C++接口在unity中调 ...

  9. (转)浅析Java中的访问权限控制

    原文地址: http://www.cnblogs.com/dolphin0520/p/3734915.html 今天我们来一起了解一下Java语言中的访问权限控制.在讨论访问权限控制之前,先来讨论一下 ...

随机推荐

  1. java程序故障排查脚本之——CPU占用高

    root@ubuntu-B85M-D3H:~/tmp# cat java_Analy.sh #!/bin/bash T=`ps -mp $1 -o THREAD,tid,time|sort -k 2 ...

  2. NGUI界面动画

    玩游戏的时候,点击一个按钮,可能会看到UI从某个位置飞进来,关闭之后又往该位置飞出!又或者一些更加复杂的运动轨迹. 我们的项目现在就是使用Animation/Animator来制作界面动画. 流程:由 ...

  3. 'autocomplete="off"'在Chrome 中不起作用

    大家都知道autocomplete属性是表单字段中的HTML5新属性,该属性有两种状态值,分别为"on" 和 "off",该属性可省略:省略属性值后默认值为&q ...

  4. [go语言学习指南]

    内部分享,根据自己的经验,收集汇总的go语言学习指南. 适合新手入门. 可以通过这里进行下载.

  5. 去空格 whitespaceAndNewlineCharacterSet和过滤字符串

    一.过滤字符串 可以使用stringByTrimmingCharactersInSet函数过滤字符串中的特殊符号 首先自己定义一个NSCharacterSet, 包含需要去除的特殊符号 NSChara ...

  6. Java的二维数组的应用及杨辉三角的编写

    (1) 编写一个程序,生成一个10*10的二维随机整数数组,并将该数组的每行最大值保存于一个一维数组中,将每列平均值保存于另外一个一维数组中并分别输出. (2) 编程输出杨辉三角的前10行. 找出一个 ...

  7. swoole 使用 1

    在很长的一段时间里,我不太看好swoole,发现它的文档太少,社区也不够活跃等,但是最近在学习 Hprose时,发现swoole在rpc方面做得更加完善,于是决定看看. 在简单的使用swoole扩展后 ...

  8. Error:SSL peer shut down incorrectly

    从别的地方拷贝过来的项目有时会报这个错误,解决方法 File -> Project Structure -> project 对比本地项目和拷贝项目并修改至与本地项目一致

  9. winfrom 捕获是否点击关闭按钮关闭的窗体

    const int WM_SYSCOMMAND = 0x0112; const int SC_CLOSE = 0xF060; protected override void WndProc(ref M ...

  10. <form>属性

    当form表单中action没有值时,默认当前页方法.