第一次接触win32api,刚开始的时候有点迷迷糊糊的。

Windows API 就是windows应用程序接口。 win api向上就是windows应用程序,向下就是windows操作系统核心。

刚开始的时候都是自己一步一步摸索,但是网上的东西都是一些

[DllImport("user32.dll")]

public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

诸如此类的,不知道怎么调用,这对于一个新手来说还是比较郁闷的。

今天花了2个小时总结了一些常用的操作窗口的win32 api的知识,当然不仅是只有函数的标明,包括怎么调用他,希望新手有帮助,我也是新手。

  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Linq;
  7. using System.Runtime.InteropServices;
  8. using System.Text;
  9. using System.Threading.Tasks;
  10. using System.Windows.Forms;
  11.  
  12. namespace WinformHandle
  13. {
  14. public partial class 句柄的获取 : Form
  15. {
  16. public 句柄的获取()
  17. {
  18. InitializeComponent();
  19. }
  20.  
  21. private void button1_Click(object sender, EventArgs e)
  22. {
  23. string str = string.Empty;
  24. IntPtr i = FindWindow("MozillaWindowClass", null);
  25. IntPtr i3 = FindWindow(null, "Teamviewer");
  26. textBox1.AppendText("根据Teamviewer的title获取句柄:" + i3.ToString("x2") + "\r\n");
  27. IntPtr i1 = FindWindow(null, "TeamViewer");
  28. textBox1.AppendText("火狐浏览器的句柄:" + i.ToString("x2") + "\r\n");
  29. textBox1.AppendText("Teamviewer的句柄:" + i1.ToString("x2") + "\r\n");
  30. IntPtr i2 = FindWindowEx(i1, IntPtr.Zero, "Button", "远程控制");
  31. StringBuilder sb = new StringBuilder();
  32. GetWindowText(i1, sb, sb.Capacity);
  33. textBox1.AppendText("TeamViewer的文本:" + sb.ToString() + "\r\n");
  34. textBox1.AppendText("Teamviewer下的子窗体的句柄:" + i2.ToString("x2") + "\r\n");
  35. List<WindowInfo> listInfo = GetAllDesktopWindows("MozillaWindowClass");
  36. for (int s = ; s < listInfo.Count; s++)
  37. {
  38. textBox1.AppendText("List<WindowInfo>[" + s + "]" + "句柄:" + listInfo[s].hWnd.ToString("x2") + "类名:" + listInfo[s].szClassName + "文本:" + listInfo[s].szWindowName + "\r\n");
  39. }
  40. WindowInfo vsInfo = GetIntPtrByWindowClName("HwndWrapper[DefaultDomain;;ec23c78e-745d-424c-a8d8-d108ad24c70f]");
  41. textBox1.AppendText("根据vs2013的类名获取qq窗体的信息:" + "句柄:" + vsInfo.hWnd.ToString("x2") + "文本:" + vsInfo.szWindowName + "类名:" + vsInfo.szClassName + "\r\n");
  42. WindowInfo mailInfo= GetIntPtrByWindowTitle("Foxmail");
  43. textBox1.AppendText("根据Foxmail的标题获取句柄信息:"+"句柄:"+mailInfo.hWnd.ToString("x2")+"文本:"+mailInfo.szWindowName+"类名:"+mailInfo.szClassName+"\r\n");
  44. //这一步将会打开i1的窗口
  45. SetForegroundWindow(i1);
  46. ShowWindow(i1, );
  47. }
  48.  
  49. public struct WindowInfo
  50. {
  51. public IntPtr hWnd;
  52. public string szWindowName;
  53. public string szClassName;
  54.  
  55. }
  56. /// <summary>
  57. /// 根据类名获取窗口信息
  58. /// </summary>
  59. /// <param name="className"></param>
  60. /// <param name="windowText"></param>
  61. /// <returns></returns>
  62. public static List<WindowInfo> GetAllDesktopWindows(string className = "", string windowText = "")
  63. {
  64. List<WindowInfo> wndList = new List<WindowInfo>();
  65. EnumWindows(delegate(IntPtr hWnd, int lParam)
  66. {
  67. WindowInfo wnd = new WindowInfo();
  68. StringBuilder sb = new StringBuilder();
  69.  
  70. wnd.hWnd = hWnd;
  71.  
  72. GetWindowText(hWnd, sb, sb.Capacity);
  73. wnd.szWindowName = sb.ToString();
  74.  
  75. GetClassName(hWnd, sb, sb.Capacity);
  76. wnd.szClassName = sb.ToString();
  77.  
  78. if ((className == "" || wnd.szClassName == className)
  79. && (windowText == "" || wnd.szWindowName == windowText))
  80. {
  81. wndList.Add(wnd);
  82. }
  83. return true;
  84. }, );
  85.  
  86. return wndList;
  87. }
  88. /// <summary>
  89. /// 显示窗体
  90. /// </summary>
  91. /// <param name="hWnd">窗体句柄</param>
  92. /// <param name="nCmdShow">指定的命令 0:关闭窗口 1:正常大小显示窗口 2:最小化窗口3:最大化窗口</param>
  93. /// <returns></returns>
  94. [DllImport("user32.dll")]
  95. public static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);
  96. public enum WindowShowStatus
  97. {
  98. /// <summary>
  99. /// 隐藏窗口
  100. /// </summary>
  101. SW_HIDE = ,
  102. /// <summary>
  103. /// 最大化窗口
  104. /// </summary>
  105. SW_MAXIMIZE = ,
  106. /// <summary>
  107. /// 最小化窗口
  108. /// </summary>
  109. SW_MINIMIZE = ,
  110. /// <summary>
  111. /// 用原来的大小和位置显示一个窗口,同时令其进入活动状态
  112. /// </summary>
  113. SW_RESTORE = ,
  114. /// <summary>
  115. /// 用当前的大小和位置显示一个窗口,同时令其进入活动状态
  116. /// </summary>
  117. SW_SHOW = ,
  118. /// <summary>
  119. /// 最大化窗口,并将其激活
  120. /// </summary>
  121. SW_SHOWMAXIMIZED = ,
  122. /// <summary>
  123. /// 最小化窗口,并将其激活
  124. /// </summary>
  125. SW_SHOWMINIMIZED = ,
  126. /// <summary>
  127. /// 最小化一个窗口,同时不改变活动窗口
  128. /// </summary>
  129. SW_SHOWMINNOACTIVE = ,
  130. /// <summary>
  131. /// 用当前的大小和位置显示一个窗口,不改变活动窗口
  132. /// </summary>
  133. SW_SHOWNA = ,
  134. /// <summary>
  135. /// 用最近的大小和位置显示一个窗口,同时不改变活动窗口
  136. /// </summary>
  137. SW_SHOWNOACTIVATE = ,
  138. /// <summary>
  139. /// 用原来的大小和位置显示一个窗口,同时令其进入活动状态,与SW_RESTORE 相同
  140. /// </summary>
  141. SW_SHOWNORMAL = ,
  142. /// <summary>
  143. /// 关闭窗体
  144. /// </summary>
  145. WM_CLOSE = 0x10
  146. }
  147. /// <summary>
  148. /// 设置系统的前台窗体
  149. /// </summary>
  150. /// <param name="hWnd">窗体句柄</param>
  151. /// <returns></returns>
  152. [DllImport("user32.dll")]
  153. public static extern bool SetForegroundWindow(IntPtr hWnd);
  154. [DllImport("user32.dll")]
  155. public static extern int GetWindowText(IntPtr hWnd, StringBuilder lpWindowText, int nMaxCount);
  156. [DllImport("user32.dll")]
  157. public static extern void GetClassName(IntPtr hWnd, StringBuilder lpClassName, int nMaxCount);
  158.  
  159. [DllImport("user32.dll")]
  160. public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
  161. /// <summary>
  162. /// 获取子窗口句柄
  163. /// </summary>
  164. /// <param name="hwndParent">主窗体句柄</param>
  165. /// <param name="hwndChildAfter">子窗体句柄</param>
  166. /// <param name="lpszClass">搜索的类名</param>
  167. /// <param name="lpszWindow"></param>
  168. /// <returns></returns>
  169. [DllImport("user32.dll")]//,EntryPoint="FindWindowEx"
  170. public static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, String lpszClass, String lpszWindow);
  171. public delegate bool CallBack(IntPtr hwnd, int lParam);
  172. [DllImport("user32.dll")]
  173. public static extern int EnumWindows(CallBack x, int y);
  174. /// <summary>
  175. /// 功能:更具窗体类名获取窗体的信息
  176. /// </summary>
  177. /// <param name="strWinClassName"></param>
  178. /// <returns></returns>
  179. public static WindowInfo GetIntPtrByWindowClName(string strWinClassName)
  180. {
  181. WindowInfo windowInfo = new WindowInfo();
  182.  
  183. EnumWindows(delegate(IntPtr hWnd, int lParam)
  184. {
  185. WindowInfo wnd = new WindowInfo();
  186. StringBuilder sb = new StringBuilder();
  187.  
  188. wnd.hWnd = hWnd;
  189.  
  190. GetWindowText(hWnd, sb, sb.Capacity);
  191. wnd.szWindowName = sb.ToString();
  192.  
  193. GetClassName(hWnd, sb, sb.Capacity);
  194. wnd.szClassName = sb.ToString();
  195.  
  196. if (wnd.szClassName == strWinClassName)
  197. {
  198. windowInfo = wnd;
  199. }
  200. return true;
  201. }, );
  202.  
  203. return windowInfo;
  204. }
  205. /// <summary>
  206. /// 功能:更具窗体标题获取窗体的信息
  207. /// </summary>
  208. /// <param name="strWinClassName"></param>
  209. /// <returns></returns>
  210. public static WindowInfo GetIntPtrByWindowTitle(string strWinHeadName)
  211. {
  212. WindowInfo windowInfo = new WindowInfo();
  213.  
  214. EnumWindows(delegate(IntPtr hWnd, int lParam)
  215. {
  216. WindowInfo wnd = new WindowInfo();
  217. StringBuilder sb = new StringBuilder();
  218.  
  219. wnd.hWnd = hWnd;
  220.  
  221. GetWindowText(hWnd, sb, sb.Capacity);
  222. wnd.szWindowName = sb.ToString();
  223.  
  224. GetClassName(hWnd, sb, sb.Capacity);
  225. wnd.szClassName = sb.ToString();
  226.  
  227. if (wnd.szWindowName == strWinHeadName)
  228. {
  229. windowInfo = wnd;
  230. }
  231. return true;
  232. }, );
  233.  
  234. return windowInfo;
  235. }
  236. /// <summary>
  237. /// 指定句柄的窗口发送消息
  238. /// </summary>
  239. /// <param name="hWnd">接收消息窗体的句柄</param>
  240. /// <param name="Msg">消息标示符</param>
  241. /// <param name="wParam">消息</param>
  242. /// <param name="lParam"></param>
  243. /// <returns></returns>
  244. [DllImport("user32.dll")]
  245. public static extern int SendMessage(IntPtr hWnd, int Msg, int wParam, string lParam);
  246.  
  247. }
  248. }

初次认识 C# win32 api的更多相关文章

  1. Serial Port Programming using Win32 API(转载)

    In this tutorial we will learn How to communicate with an external device like a microcontroller boa ...

  2. 从.NET平台调用Win32 API

    MSDN文章<Microsoft Win32 to Microsoft .NET Framework API Map> 介绍了.net 类库对win32的封装 从.NET平台调用Win32 ...

  3. 【温故Delphi】GAEA用到Win32 API目录

    Delphi是Windows平台下著名的快速应用程序开发工具,它在VCL中封装并使用了大量的Win32 API. GAEA基于VCL开发的工具类产品,在程序中使用了大量的Win32 API,将经常用到 ...

  4. 【C#】分享基于Win32 API的服务操作类(解决ManagedInstallerClass.InstallHelper不能带参数安装的问题)

    注:这里的服务是指Windows 服务. ------------------201508250915更新------------------ 刚刚得知TransactedInstaller类是支持带 ...

  5. C#中导入Win32 API函数

    C#中导入Win32 API的方法: 1.引用命名空间 using System.Net.Security; using System.Runtime.InteropServices; 2. [Dll ...

  6. MSIL 教程(二):数组、分支、循环、使用不安全代码和如何调用Win32 API(转)

    转自:http://www.cnblogs.com/Yahong111/archive/2007/08/16/857574.html 续上文[翻译]MSIL 教程(一) ,本文继续讲解数组.分支.循环 ...

  7. C#调用Win32 api学习总结

    从.NET平台调用Win32 API Win32 API可以直接控制Microsoft Windows的核心,因为API(Application Programming Interface)本来就是微 ...

  8. win32 api ShouCursor 根据内部计数器 是否>= 0 决定是否 显示光标,每true时计数器+1,每false-1

    win32 api ShouCursor 根据内部计数器 是否>= 0 决定是否 显示光标,每true时计数器+1,每false-1,编程时true 和 false 的次数容易产生bug.

  9. 通过 WIN32 API 实现嵌入程序窗体

    写了一个不使用 COM, 而是通过 WIN32 API 实现的示例, 它把写字板程序嵌在了自己的一个面板中. 这么做可能没有实际意义, 因为两个程序之前没有进行有价值的交互, 这里仅仅是为了演示这么做 ...

随机推荐

  1. Linux应用程序基础

    文件位置:     系统命令:/bin和sbin目录,或shell内部指令:     应用程序:/usr/bin和/usr/sbin目录.         /usr/bin:普通执行程序文件:     ...

  2. Js: Extensible Calendar Examples

    http://ext.ensible.comhttps://github.com/bmoeskau/Extensiblehttps://github.com/TeamupCom/extensibleh ...

  3. O365(世纪互联)SharePoint 之使用Designer报错

    前言 在SharePoint Online中使用Designer报错,错误为:This Feature has been disabled by your administrator.找了好久发现原因 ...

  4. ViewPager轮播图

    LoopViewPagerLayout无限轮播 项目地址:https://github.com/why168/LoopViewPagerLayout 支持三种动画: 支持修改轮播的速度: 支持修改滑动 ...

  5. 【译】Spring 4 基于TaskScheduler实现定时任务(注解)

    前言 译文链接:http://websystique.com/spring/spring-job-scheduling-with-scheduled-enablescheduling-annotati ...

  6. 简历生成平台项目开发-STEP4第二次项目例会讨论

    时间:2016.7.15周五7点半 地点:图书馆 讨论主题:交流各自手头项目进展,确定下一步任务 内容:按照之前的讨论的任务大家各自汇报进度. 汇报人:谭卓.尹忠诚 内容:1.基于富文本编辑器的模板, ...

  7. 【推荐】CentOS安装Subversion-1.8.11+HTTP协议支持配置

    注:以下所有操作均在CentOS 6.5 x86_64位系统下完成. 我们需要搭建一个自己的SVN服务器. 此外,搭建好的SVN服务器除了需要支持svn协议外,最好还需要支持HTTP协议和HTTPS协 ...

  8. 使用EditText的addTextChangedListener(new TextWatcher())方法

    (转:http://www.apkbus.com/android-5257-1-14.html) 在使用EditText的addTextChangedListener(new TextWatcher( ...

  9. WPF 开发 WebBrowser

    WebBrowser WebBrowser 报错如何屏蔽 CEF(Chromium Embedded Framework)       参考 WPF, Chrome Embedded and WebA ...

  10. Android快乐贪吃蛇游戏实战项目开发教程-02虚拟方向键(一)自定义控件概述

    该系列教程概述与目录:http://www.cnblogs.com/chengyujia/p/5787111.html 一.自定义控件简介 在本项目中,无论是游戏主区域还是虚拟方向键都是通过自定义控件 ...