Ø  简介

本文主要记录 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 调用示例的更多相关文章

  1. FormatMessage与GetLastError配合使用,排查windows api调用过程中的错误

    前一段时间在学习windows api调用过程中,遇到过一些调用错误或者程序没能显示预期的结果,或者直接出现vc运行时错误. 这对新手来说是司空见惯的事,因为不太熟悉难免会出错,出错的信息如果能显示很 ...

  2. HTML 百度地图API调用示例源码

    <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...

  3. 浅议Delphi中的Windows API调用(举的两个例子分别是String和API,都不错,挺具有代表性)

    浅议Delphi中的Windows API调用http://tech.163.com/school • 2005-08-15 10:57:41 • 来源: 天极网为了能在Windows下快速开发应用程 ...

  4. 百度地图Javascript API 调用示例

    调用示例 !<!DOCTYPE html> <html> <head> <title>百度地图DEMO</title> </head& ...

  5. 图灵机器人(问答机器人)API调用示例

    问答机器人API文档:https://www.juhe.cn/docs/api/id/112 先上图: 说下大致实现的步骤: 1.首先使用了聚合数据的sdk,这样免费使用的数目可以多一些 2.使用gs ...

  6. Windows API调用外部程序

    要在应用程序中启动其他的应用程序,有3个函数可以使用,下面我一一说说他们(我以打开D:\Program Files\zeecalls\目录下的zeecalls.exe应用程序为例): 1.Winexe ...

  7. Zookeeper 客户端API调用示例(基本使用,增删改查znode数据,监听znode,其它案例,其它网络参考资料)

    9.1 基本使用 org.apache.zookeeper.Zookeeper是客户端入口主类,负责建立与server的会话 它提供以下几类主要方法  : 功能 描述 create 在本地目录树中创建 ...

  8. 项目笔记---Windows Service调用Windows API问题

    概要 此文来自于最近一个“诡异”的Windows API调用发现Windows Service在调用某些Windows API的过程中失效,在经过漫长的Baidu,之后终于在StackOverFlow ...

  9. 搭建coreseek(sphinx+mmseg3)详细安装配置+php之sphinx扩展安装+php调用示例(转)

    一个文档包含了安装.增量备份.扩展.api调用示例,省去了查找大量文章的时间. 搭建coreseek(sphinx+mmseg3)安装 [第一步] 先安装mmseg3 cd /var/install ...

随机推荐

  1. 测试报告_HTMLTestRunner.py

    (1)模板1下载路径: 链接:https://pan.baidu.com/s/1SydXpWwQd5vDpGlzzhXLfA提取码:3ifp (2)模板二下载路径: 链接:https://pan.ba ...

  2. Linux(CentOS7)设置开放端口

    查看已经开放的端口:firewall-cmd --list-ports 开启端口: firewall-cmd --zone=public --add-port=端口号/tcp --permanent ...

  3. vue使用npm run build命令打包

    vue使用npm run build命令打包项目   当我们使用vue-cli脚手架完成一个项目的时候,下一步肯定会想要怎么把这个项目放到互联网上或者本地直接打开呢,我们在本地调试的时候只要命令行执行 ...

  4. Mybatis 批量添加,批量更新

    此篇适合有一定的mybatis使用经验的人阅读. 一.批量更新 为了提升操作数据的效率,第一想到的是做批量操作,直接上批量更新代码: <update id="updateBatchMe ...

  5. ansible_playbook 一键搭建集群架构

    目录 基础优化 SSH.Ansible,批量管理服务项目 剧本开始-----.10分钟左右 mail.yaml base.yaml rsync.yaml nfs.yaml web.yaml tweb. ...

  6. MyCP.java蓝墨云班课

    题目要求: 编写MyCP.java 实现类似Linux下cp XXX1 XXX2的功能,要求MyCP支持两个参数: java MyCP -tx XXX1.txt XXX2.bin 用来把文本文件(内容 ...

  7. zcu102 hdmi example(一)

    1,概述 有一个计划是打算做一个摄像头的驱动与显示. 但是实际上手上只有一个zcu102开发板,没有摄像头,也没有上位机,自己也不会写.所以就将方案阉割成将录制好的视频放在SD卡里面,然后从SD卡里面 ...

  8. ModuleNotFoundError: No module named 'redis'

    在安装过Redis后,通过Python程序导入redis时,遇到一个“ModuleNotFoundError: No module named redis”错误,网上查了下原因,解决办法如下: Pyt ...

  9. C++购书系统

    C++购书系统——来自班里某位同学的小学期作业 这是一个购书系统,模拟网上购书的流程.用户可以在这个小程序里输入对应的数字进行浏览书籍信息,查看用户信息,查找书籍,购买书籍以及查询个人订单的操作. 以 ...

  10. foreman容器化部署

    一.前言 最近公司要求对一批GPU服务器安装操作系统,之前同事一直采用cobbler安装系统,一旦服务器设置为pxe优先启动,会出现重复安装系统的问题,并且如果线上服务器忘记修改第一启动项为硬盘启动, ...