初次认识 C# win32 api
第一次接触win32api,刚开始的时候有点迷迷糊糊的。
Windows API 就是windows应用程序接口。 win api向上就是windows应用程序,向下就是windows操作系统核心。
刚开始的时候都是自己一步一步摸索,但是网上的东西都是一些
[DllImport("user32.dll")]
public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
诸如此类的,不知道怎么调用,这对于一个新手来说还是比较郁闷的。
今天花了2个小时总结了一些常用的操作窗口的win32 api的知识,当然不仅是只有函数的标明,包括怎么调用他,希望新手有帮助,我也是新手。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms; namespace WinformHandle
{
public partial class 句柄的获取 : Form
{
public 句柄的获取()
{
InitializeComponent();
} private void button1_Click(object sender, EventArgs e)
{
string str = string.Empty;
IntPtr i = FindWindow("MozillaWindowClass", null);
IntPtr i3 = FindWindow(null, "Teamviewer");
textBox1.AppendText("根据Teamviewer的title获取句柄:" + i3.ToString("x2") + "\r\n");
IntPtr i1 = FindWindow(null, "TeamViewer");
textBox1.AppendText("火狐浏览器的句柄:" + i.ToString("x2") + "\r\n");
textBox1.AppendText("Teamviewer的句柄:" + i1.ToString("x2") + "\r\n");
IntPtr i2 = FindWindowEx(i1, IntPtr.Zero, "Button", "远程控制");
StringBuilder sb = new StringBuilder();
GetWindowText(i1, sb, sb.Capacity);
textBox1.AppendText("TeamViewer的文本:" + sb.ToString() + "\r\n");
textBox1.AppendText("Teamviewer下的子窗体的句柄:" + i2.ToString("x2") + "\r\n");
List<WindowInfo> listInfo = GetAllDesktopWindows("MozillaWindowClass");
for (int s = ; s < listInfo.Count; s++)
{
textBox1.AppendText("List<WindowInfo>[" + s + "]" + "句柄:" + listInfo[s].hWnd.ToString("x2") + "类名:" + listInfo[s].szClassName + "文本:" + listInfo[s].szWindowName + "\r\n");
}
WindowInfo vsInfo = GetIntPtrByWindowClName("HwndWrapper[DefaultDomain;;ec23c78e-745d-424c-a8d8-d108ad24c70f]");
textBox1.AppendText("根据vs2013的类名获取qq窗体的信息:" + "句柄:" + vsInfo.hWnd.ToString("x2") + "文本:" + vsInfo.szWindowName + "类名:" + vsInfo.szClassName + "\r\n");
WindowInfo mailInfo= GetIntPtrByWindowTitle("Foxmail");
textBox1.AppendText("根据Foxmail的标题获取句柄信息:"+"句柄:"+mailInfo.hWnd.ToString("x2")+"文本:"+mailInfo.szWindowName+"类名:"+mailInfo.szClassName+"\r\n");
//这一步将会打开i1的窗口
SetForegroundWindow(i1);
ShowWindow(i1, );
} public struct WindowInfo
{
public IntPtr hWnd;
public string szWindowName;
public string szClassName; }
/// <summary>
/// 根据类名获取窗口信息
/// </summary>
/// <param name="className"></param>
/// <param name="windowText"></param>
/// <returns></returns>
public static List<WindowInfo> GetAllDesktopWindows(string className = "", string windowText = "")
{
List<WindowInfo> wndList = new List<WindowInfo>();
EnumWindows(delegate(IntPtr hWnd, int lParam)
{
WindowInfo wnd = new WindowInfo();
StringBuilder sb = new StringBuilder(); wnd.hWnd = hWnd; GetWindowText(hWnd, sb, sb.Capacity);
wnd.szWindowName = sb.ToString(); GetClassName(hWnd, sb, sb.Capacity);
wnd.szClassName = sb.ToString(); if ((className == "" || wnd.szClassName == className)
&& (windowText == "" || wnd.szWindowName == windowText))
{
wndList.Add(wnd);
}
return true;
}, ); return wndList;
}
/// <summary>
/// 显示窗体
/// </summary>
/// <param name="hWnd">窗体句柄</param>
/// <param name="nCmdShow">指定的命令 0:关闭窗口 1:正常大小显示窗口 2:最小化窗口3:最大化窗口</param>
/// <returns></returns>
[DllImport("user32.dll")]
public static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);
public enum WindowShowStatus
{
/// <summary>
/// 隐藏窗口
/// </summary>
SW_HIDE = ,
/// <summary>
/// 最大化窗口
/// </summary>
SW_MAXIMIZE = ,
/// <summary>
/// 最小化窗口
/// </summary>
SW_MINIMIZE = ,
/// <summary>
/// 用原来的大小和位置显示一个窗口,同时令其进入活动状态
/// </summary>
SW_RESTORE = ,
/// <summary>
/// 用当前的大小和位置显示一个窗口,同时令其进入活动状态
/// </summary>
SW_SHOW = ,
/// <summary>
/// 最大化窗口,并将其激活
/// </summary>
SW_SHOWMAXIMIZED = ,
/// <summary>
/// 最小化窗口,并将其激活
/// </summary>
SW_SHOWMINIMIZED = ,
/// <summary>
/// 最小化一个窗口,同时不改变活动窗口
/// </summary>
SW_SHOWMINNOACTIVE = ,
/// <summary>
/// 用当前的大小和位置显示一个窗口,不改变活动窗口
/// </summary>
SW_SHOWNA = ,
/// <summary>
/// 用最近的大小和位置显示一个窗口,同时不改变活动窗口
/// </summary>
SW_SHOWNOACTIVATE = ,
/// <summary>
/// 用原来的大小和位置显示一个窗口,同时令其进入活动状态,与SW_RESTORE 相同
/// </summary>
SW_SHOWNORMAL = ,
/// <summary>
/// 关闭窗体
/// </summary>
WM_CLOSE = 0x10
}
/// <summary>
/// 设置系统的前台窗体
/// </summary>
/// <param name="hWnd">窗体句柄</param>
/// <returns></returns>
[DllImport("user32.dll")]
public static extern bool SetForegroundWindow(IntPtr hWnd);
[DllImport("user32.dll")]
public static extern int GetWindowText(IntPtr hWnd, StringBuilder lpWindowText, int nMaxCount);
[DllImport("user32.dll")]
public static extern void GetClassName(IntPtr hWnd, StringBuilder lpClassName, int nMaxCount); [DllImport("user32.dll")]
public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
/// <summary>
/// 获取子窗口句柄
/// </summary>
/// <param name="hwndParent">主窗体句柄</param>
/// <param name="hwndChildAfter">子窗体句柄</param>
/// <param name="lpszClass">搜索的类名</param>
/// <param name="lpszWindow"></param>
/// <returns></returns>
[DllImport("user32.dll")]//,EntryPoint="FindWindowEx"
public static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, String lpszClass, String lpszWindow);
public delegate bool CallBack(IntPtr hwnd, int lParam);
[DllImport("user32.dll")]
public static extern int EnumWindows(CallBack x, int y);
/// <summary>
/// 功能:更具窗体类名获取窗体的信息
/// </summary>
/// <param name="strWinClassName"></param>
/// <returns></returns>
public static WindowInfo GetIntPtrByWindowClName(string strWinClassName)
{
WindowInfo windowInfo = new WindowInfo(); EnumWindows(delegate(IntPtr hWnd, int lParam)
{
WindowInfo wnd = new WindowInfo();
StringBuilder sb = new StringBuilder(); wnd.hWnd = hWnd; GetWindowText(hWnd, sb, sb.Capacity);
wnd.szWindowName = sb.ToString(); GetClassName(hWnd, sb, sb.Capacity);
wnd.szClassName = sb.ToString(); if (wnd.szClassName == strWinClassName)
{
windowInfo = wnd;
}
return true;
}, ); return windowInfo;
}
/// <summary>
/// 功能:更具窗体标题获取窗体的信息
/// </summary>
/// <param name="strWinClassName"></param>
/// <returns></returns>
public static WindowInfo GetIntPtrByWindowTitle(string strWinHeadName)
{
WindowInfo windowInfo = new WindowInfo(); EnumWindows(delegate(IntPtr hWnd, int lParam)
{
WindowInfo wnd = new WindowInfo();
StringBuilder sb = new StringBuilder(); wnd.hWnd = hWnd; GetWindowText(hWnd, sb, sb.Capacity);
wnd.szWindowName = sb.ToString(); GetClassName(hWnd, sb, sb.Capacity);
wnd.szClassName = sb.ToString(); if (wnd.szWindowName == strWinHeadName)
{
windowInfo = wnd;
}
return true;
}, ); return windowInfo;
}
/// <summary>
/// 指定句柄的窗口发送消息
/// </summary>
/// <param name="hWnd">接收消息窗体的句柄</param>
/// <param name="Msg">消息标示符</param>
/// <param name="wParam">消息</param>
/// <param name="lParam"></param>
/// <returns></returns>
[DllImport("user32.dll")]
public static extern int SendMessage(IntPtr hWnd, int Msg, int wParam, string lParam); }
}
初次认识 C# win32 api的更多相关文章
- Serial Port Programming using Win32 API(转载)
In this tutorial we will learn How to communicate with an external device like a microcontroller boa ...
- 从.NET平台调用Win32 API
MSDN文章<Microsoft Win32 to Microsoft .NET Framework API Map> 介绍了.net 类库对win32的封装 从.NET平台调用Win32 ...
- 【温故Delphi】GAEA用到Win32 API目录
Delphi是Windows平台下著名的快速应用程序开发工具,它在VCL中封装并使用了大量的Win32 API. GAEA基于VCL开发的工具类产品,在程序中使用了大量的Win32 API,将经常用到 ...
- 【C#】分享基于Win32 API的服务操作类(解决ManagedInstallerClass.InstallHelper不能带参数安装的问题)
注:这里的服务是指Windows 服务. ------------------201508250915更新------------------ 刚刚得知TransactedInstaller类是支持带 ...
- C#中导入Win32 API函数
C#中导入Win32 API的方法: 1.引用命名空间 using System.Net.Security; using System.Runtime.InteropServices; 2. [Dll ...
- MSIL 教程(二):数组、分支、循环、使用不安全代码和如何调用Win32 API(转)
转自:http://www.cnblogs.com/Yahong111/archive/2007/08/16/857574.html 续上文[翻译]MSIL 教程(一) ,本文继续讲解数组.分支.循环 ...
- C#调用Win32 api学习总结
从.NET平台调用Win32 API Win32 API可以直接控制Microsoft Windows的核心,因为API(Application Programming Interface)本来就是微 ...
- win32 api ShouCursor 根据内部计数器 是否>= 0 决定是否 显示光标,每true时计数器+1,每false-1
win32 api ShouCursor 根据内部计数器 是否>= 0 决定是否 显示光标,每true时计数器+1,每false-1,编程时true 和 false 的次数容易产生bug.
- 通过 WIN32 API 实现嵌入程序窗体
写了一个不使用 COM, 而是通过 WIN32 API 实现的示例, 它把写字板程序嵌在了自己的一个面板中. 这么做可能没有实际意义, 因为两个程序之前没有进行有价值的交互, 这里仅仅是为了演示这么做 ...
随机推荐
- C - NP-Hard Problem(二分图判定-染色法)
C - NP-Hard Problem Crawling in process... Crawling failed Time Limit:2000MS Memory Limit:262144 ...
- [deviceone开发]-do_Album的简单示例
一.简介do_Album用来打开手机系统提供的相册,能选择一张或多张图片返回给开发者,通常相册的图片比较大,要经过缩放.有的时候用户也需要把别的地方获取到到图片收藏到系统相册.这个示例简单展示这个组件 ...
- [deviceone开发]-do_Webview的基本示例
一.简介 这个示例是webview的基础demo,加载了本地html文件,一个html做的登录的表单.这个示例也展示了webview里加载的html里的js代码怎么调用deviceone的SM,MM和 ...
- 几款Git GUI客户端工具
工欲善其事,必先利其器. 作为一名开发人员,你不可能不知道git,无论你是开发自己的开源项目还是和团队一起进行大规模产品的开发,git都已经是源代码管理工具的首选.当然,那些hardcore deve ...
- Linux常见查看硬件信息指令
CPUlscpu 查看的是CPU的统计信息./proc/cpuinfo 查看每个cpu信息,如每个CPU的型号,主频等. 内存free -m 概要查看内存情况cat /proc/meminfo 查看内 ...
- js动态获取子复选项并设计全选及提交
在做项目的时候,会遇到根据父选项,动态的获取子选项,并列出多个复选框,提交时,把选中的合并成一个字符提交后台 本章将讲述如何通过js控制实现该操作: 1:设计父类别为radio,为每一个radio都加 ...
- Java 条形码 二维码 的生成与解析
Barcode简介 Barcode是由一组按一定编码规则排列的条,空符号,用以表示一定的字符,数字及符号组成的,一种机器可读的数据表示方式. Barcode的形式多种多样,按照它们的外观分类: Lin ...
- 数据库设计范式2——BC范式和第四范式
我在很久之前的一篇文章中介绍了数据库模型设计中的基本三范式,今天,我来说一说更高级的BC范式和第四范式. 回顾 我用大白话来回顾一下什么是三范式: 第一范式:每个表应该有唯一标识每一行的主键. 第二范 ...
- 关于SQL Server镜像的一个小误区
昨天晚上突然接到客户的电话, 说在配置了镜像的生产环境数据库下修改 “已提交读快照” 选项的时候报错, 需要先取消镜像然后再重新搭建.悲催的是这是个近TB的数据库,问我有没有什么快速的方法.于是我就问 ...
- centos6.5无法访问网络
1.在network Adapter选中,右侧是否是选中为NAT 2.打开网络和共享中心-->更改适配器设置,VMnet8和VMnet1是否是自动获取了IP,自动获取ip连接上后 3.右击本地连 ...