Windows API 调用示例
Ø 简介
本文主要记录 Windows API 的调用示例,因为这项技术并不常用,属于 C# 中比较孤僻或接触底层的技术,并不常用。但是有时候也可以借助他完成一些 C# 本身不能完成的功能,例如:通过句柄获取其他程序数据,或者向操作系统发出指定的消息等等。
提示:关于 Windows API 的函数有很多,不需要将所有的函数都非常了解,笔者也只是将用到过的函数记录下来,方便以后需要时可以快速编写。
1. 鼠标事件 API
1) 函数原型:void mouse_event(
long dwFlags, long dx, long dy, long cButtons, long dwExtraInfo)
2) 函数说明:该函数合成鼠标的移动和点击事件,并将其插入到事件队列中。
3) 参数:
cButtons, 正数表示向上滚动,负数表示向下滚动。
其他:参考【Windows API 函数参考手册】
4) 典型示例:
1. 模拟鼠标(滚轮)滚动事件(C# Code)
1) 函数声明
[DllImport("user32.dll")]
private static extern int mouse_event(int dwFlags, int dx, int dy, int cButtons, int dwExtraInfo);
2) 调用代码
const int MOUSEEVENTF_WHEEL = 0x0800;
var timer = new System.Threading.Timer(new TimerCallback(o =>
{
mouse_event(MOUSEEVENTF_WHEEL, 0, 0, 500, 0);
WriteLine(string.Format("鼠标已滚动,线程:{0}", GetThreadId()));
}), null, 0, 50);
3) 运行结果

2. 钩子(Hook) API
1) 什么是钩子:钩子实际是一个处理消息的程序段,通过系统调用,把它挂入系统。每当特定的消息发出,在没有到达目的窗口前,钩子程序就先捕获该消息,亦即钩子函数先得到控制权。这时钩子函数即可以加工处理(改变)该消息,也可以不作处理而继续传递该消息,还可以强制结束消息的传递。
2) 典型示例
1. 使用鼠标钩子,获取其他窗体句柄中的文本
注意:钩子只能运行在 Winform(窗体应用程序)中,不能运行在 ConsoleApplication(控制台应用程序)中!
1) 函数声明
/// <summary>
/// 钩子委托声明。
/// </summary>
public delegate int HookProc(int nCode, IntPtr wParam, IntPtr lParam);
/// <summary>
/// 安装钩子。
/// </summary>
[DllImport("user32.dll", CallingConvention = CallingConvention.StdCall)]
public static extern IntPtr SetWindowsHookEx(IntPtr idHook, HookProc lpfn, IntPtr pInstance, uint threadId);
/// <summary>
/// 卸载钩子。
/// </summary>
[DllImport("user32.dll", CallingConvention = CallingConvention.StdCall)]
public static extern bool UnhookWindowsHookEx(IntPtr pHookHandle);
/// <summary>
/// 传递钩子(用于把拦截的消息继续传递下去,不然其他程序可能会得不到相应的消息)。
/// </summary>
[DllImport("user32.dll", CallingConvention = CallingConvention.StdCall)]
public static extern int CallNextHookEx(IntPtr pHookHandle, int nCode, IntPtr wParam, IntPtr lParam);
/// <summary>
/// 获取光标位置,以屏幕坐标表示。
/// </summary>
[DllImport("user32.dll", EntryPoint = "GetCursorPos")]
public static extern bool GetCursorPos(ref Point point);
/// <summary>
/// 获得包含指定点的窗口的句柄。
/// </summary>
[DllImport("user32.dll", EntryPoint = "WindowFromPoint")]
public static extern IntPtr WindowFromPoint(Point p);
/// <summary>
/// 将指定的消息发送到一个或多个窗口。此函数为指定的窗口调用窗口程序,直到窗口程序处理完消息再返回。
/// </summary>
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern bool SendMessage(IntPtr hWnd, int msg, int wParam, [MarshalAs(UnmanagedType.LPTStr)]StringBuilder lParam);
2) 调用代码
/// <summary>
/// 鼠标钩子测试。
/// </summary>
public void MouseHookTest()
{
IntPtr hookId = new IntPtr(14); //14代表鼠标钩子
System.Diagnostics.Process currentProcess = System.Diagnostics.Process.GetCurrentProcess();
//1. 安装钩子
const int WM_RBUTTONUP = 0x205; //右键释放(517)
const int WM_GETTEXT = 0x000D;
IntPtr hHook = IntPtr.Zero;
hHook = SetWindowsHookEx(hookId, delegate(int nCode, IntPtr wParam, IntPtr lParam)
{
if ((int)wParam == WM_RBUTTONUP)
{
Point point = new Point();
//获取光标位置
GetCursorPos(ref point);
//获取光标控件句柄
IntPtr pointHwnd = WindowFromPoint(point);
//获取光标控件Text属性值
StringBuilder sbStr = new StringBuilder(256);
SendMessage(pointHwnd, WM_GETTEXT, 100, sbStr);
ShowMessageBox("获取光标句柄文本:{0}", sbStr);
}
return CallNextHookEx(hHook, nCode, wParam, lParam); //将消息向下传递
}, currentProcess.MainModule.BaseAddress, 0);
//2. 卸载钩子
if (hHook != IntPtr.Zero)
{
ShowMessageBox("钩子安装成功,60秒后将卸载钩子。");
var timer = new System.Threading.Timer(o =>
{
if (UnhookWindowsHookEx(hHook))
ShowMessageBox("钩子卸载成功。");
else
ShowMessageBox("钩子卸载失败!");
}, null, 60000, 0);
}
else
ShowMessageBox("钩子安装失败!");
}
3) 运行结果

Windows API 调用示例的更多相关文章
- FormatMessage与GetLastError配合使用,排查windows api调用过程中的错误
前一段时间在学习windows api调用过程中,遇到过一些调用错误或者程序没能显示预期的结果,或者直接出现vc运行时错误. 这对新手来说是司空见惯的事,因为不太熟悉难免会出错,出错的信息如果能显示很 ...
- HTML 百度地图API调用示例源码
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...
- 浅议Delphi中的Windows API调用(举的两个例子分别是String和API,都不错,挺具有代表性)
浅议Delphi中的Windows API调用http://tech.163.com/school • 2005-08-15 10:57:41 • 来源: 天极网为了能在Windows下快速开发应用程 ...
- 百度地图Javascript API 调用示例
调用示例 !<!DOCTYPE html> <html> <head> <title>百度地图DEMO</title> </head& ...
- 图灵机器人(问答机器人)API调用示例
问答机器人API文档:https://www.juhe.cn/docs/api/id/112 先上图: 说下大致实现的步骤: 1.首先使用了聚合数据的sdk,这样免费使用的数目可以多一些 2.使用gs ...
- Windows API调用外部程序
要在应用程序中启动其他的应用程序,有3个函数可以使用,下面我一一说说他们(我以打开D:\Program Files\zeecalls\目录下的zeecalls.exe应用程序为例): 1.Winexe ...
- Zookeeper 客户端API调用示例(基本使用,增删改查znode数据,监听znode,其它案例,其它网络参考资料)
9.1 基本使用 org.apache.zookeeper.Zookeeper是客户端入口主类,负责建立与server的会话 它提供以下几类主要方法 : 功能 描述 create 在本地目录树中创建 ...
- 项目笔记---Windows Service调用Windows API问题
概要 此文来自于最近一个“诡异”的Windows API调用发现Windows Service在调用某些Windows API的过程中失效,在经过漫长的Baidu,之后终于在StackOverFlow ...
- 搭建coreseek(sphinx+mmseg3)详细安装配置+php之sphinx扩展安装+php调用示例(转)
一个文档包含了安装.增量备份.扩展.api调用示例,省去了查找大量文章的时间. 搭建coreseek(sphinx+mmseg3)安装 [第一步] 先安装mmseg3 cd /var/install ...
随机推荐
- c#核心基础 - 浅谈 c# 中的特性 Attribute)
特性(Attribute)是用于在运行时传递程序中各种元素(比如类.方法.结构.枚举.组件等)的行为信息的声明性标签.可以通过使用特性向程序添加声明性信息.一个声明性标签是通过放置在它所应用的元素前面 ...
- 想知道谁是你的最佳用户?基于Redis实现排行榜周期榜与最近N期榜
本文由云+社区发表 前言 业务已基于Redis实现了一个高可用的排行榜服务,长期以来相安无事.有一天,产品说:我要一个按周排名的排行榜,以反映本周内用户的活跃情况.于是周榜(按周重置更新的榜单)诞生了 ...
- AngularJS学习之旅—AngularJS 事件(十四)
1.AngularJS 事件 ng-click ( 适用标签 :所有,触发事件:单击): ng-dblclick( 适用标签 :所有,触发事件:双击): ng-blur(适用标签 : a,input, ...
- Windows苹果安卓手机远程桌面客户端推荐
适用于:Windows 10.Windows 8.1.Windows Server 2012 R2.Windows Server 2016 最近公司电脑从Windows7升级到了Windows10,然 ...
- XMind 8 Pro 破解
1.补丁下载地址 链接:https://pan.baidu.com/s/146qcwkvOGCAneIXabSZSUA 提取码:wygs 2.安装 XMind 8 Pro, 运行 3. 去除检查 ...
- MyCP
一.作业要求 编写MyCP.java 实现类似Linux下cp XXX1 XXX2的功能,要求MyCP支持两个参数:- java MyCP -tx XXX1.txt XXX2.bin 用来把文本文 ...
- PHP程序员的成长路线
作为一名PHP程序员,从你入门到现在我相信也学了很多东西,但是有的PHP程序员却是还在第一阶段,那么作为初级PHP程序员我们应该如何弥补自己的不足往中级阶段或者高级阶段发展呢?下面小编就为大家梳理了一 ...
- 鼠标拖动DOM
自己收藏,使用angualrjs的directive些的鼠标拖动DOM.... <!DOCTYPE html> <html lang="en"> <h ...
- 了解Vue.js
一.了解Vue (1)Vue.js在设计上采用MVVM(Model-View-ViewModel)模式 当View变化时,会自动更新到ViewModel,反之亦然.View与ViewModel通过双向 ...
- 高斯消元part2
今天整一整高斯消元的模板,正经的 高斯消元主要用于解n元一次线性方程组与判断是否有解 主要思想? 就是高斯消元啊 主要思想是理想状态下消为每行除最后一项外只有一个1,并且每行位置互异,具体看下面. 这 ...