如何使用C#操作WinAPI

简介:

Windows API是对Windows操作系统的API函数,在C#中调用Windows API的实质是托管代码对非托管代码的调用。

主要使用的格式就是:

 

复制代码
 
 
using System.Runtime.InteropServices;

namespace TestWinAPI1
{
class Program
{
static void Main( string [] args)
{
Beep(
100 , 100 );
}


[DllImport(
" kernel32 " , CharSet = CharSet.Ansi)]
public static extern bool Beep( int frequery, int duration);
}
}
复制代码

 

其中的Beep就是Win API的调用,使用[DllImport("kernel32")]属性进行调用。

这个函数在MSDN中的原本定义是:

 

 
 
C ++
BOOL WINAPI Beep(
__in DWORD dwFreq,
__in DWORD dwDuration
);

 

我们想要调用BeepAPI,就必须:

1.将DWORD对应为C#中的int,相应的参数个数和位置设置正确

2.调用的函数名和WinAPI中的函数名一致

这样,我们在C#中就可以使用Win API对Windows进行操作。

 

这里几个资源是使用WindowsAPI不可或缺的:

MSDN:http://msdn.microsoft.com/en-us/library/ee663300(VS.85).aspx

推荐的入门教程:http://www.docin.com/p-4510006.html

 

 

使用WINAPI的难点:

 

1.C++中的各个数据类型如何对应到C#中?

使用C#中的那个数据类型对应那个C++的数据类型没有唯一的规定,但是应该站在内存使用的角度,选择内存占用大小一致。

当C++中存在指针的时候,我们可以使用ref来传递指针

 

2.如果C++中定义了数据结构如何操作?

我们也应该在C#中定义与之存储结构一致的数据结构

 

以下是用WinAPI 模拟鼠标定位和单机左键的操作:

 

ContractedBlock.gif 代码

 

简要描述:

使用了mouse_event,GetCursorPos,SetCursorPos三个API

mouse_event((uint)MouseEventFlags.LEFTDOWN|(uint)MouseEventFlags.LEFTUP, 0, 0, 0, 0);

代表了单击左键的动作

int setRight = SetCursorPos(27, 881); 中的27,881是屏幕上的绝对位置

 

 

PS:使用API可以做一些游戏的小外挂,比如模拟鼠标,键盘的操作...嘿嘿




本文转自轩脉刃博客园博客,原文链接:http://www.cnblogs.com/yjf512/archive/2010/06/25/1765186.html,如需转载请自行联系原作者

相关文章
|
2月前
|
编译器 Linux API
Qt之Q_OBJECT 宏的神奇之旅(二)
Qt之Q_OBJECT 宏的神奇之旅
33 0
|
2月前
|
安全 Java 编译器
Qt之Q_OBJECT 宏的神奇之旅(一)
Qt之Q_OBJECT 宏的神奇之旅
34 0
|
API C# Windows
C#实现操作Windows窗口句柄:常用窗口句柄相关API、Winform中句柄属性和Process的MainWindowHandle问题【窗口句柄总结之三】
本篇主要介绍一些与窗口句柄相关的一些API,比如设置窗口状态、当前激活的窗口、窗口客户区的大小、鼠标位置、禁用控件等,以及介绍Winform中的句柄属性,便于直接获取控件或窗体句柄,以及不推荐...
1753 0
C#实现操作Windows窗口句柄:常用窗口句柄相关API、Winform中句柄属性和Process的MainWindowHandle问题【窗口句柄总结之三】
|
12月前
|
开发者
零基础VB教程064期:自定义数据类型,type使用方法以及异常捕获
零基础VB教程064期:自定义数据类型,type使用方法以及异常捕获
151 0
驱动开发:Win10枚举完整SSDT地址表
在前面的博文`《驱动开发:Win10内核枚举SSDT表基址》`中已经教大家如何寻找`SSDT`表基地址了,找到后我们可根据序号获取到指定`SSDT`函数的原始地址,而如果需要输出所有`SSDT`表信息,则可以定义字符串列表,以此循环调用`GetSSDTFunctionAddress()`函数得到,当然在此之间也可以调用系统提供的`MmGetSystemRoutineAddress()`函数顺便把当前地址拿到,并通过循环方式得到完整的SSDT列表。
339 0
驱动开发:Win10枚举完整SSDT地址表
|
API vr&ar 图形学
【100个 Unity小知识点】☀️ | Unity中使用代码查询Draw call、Tris和Verts等信息
Unity 小科普 老规矩,先介绍一下 Unity 的科普小知识: Unity是 实时3D互动内容创作和运营平台 。 包括游戏开发、美术、建筑、汽车设计、影视在内的所有创作者,借助 Unity 将创意变成现实。 Unity 平台提供一整套完善的软件解决方案,可用于创作、运营和变现任何实时互动的2D和3D内容,支持平台包括手机、平板电脑、PC、游戏主机、增强现实和虚拟现实设备。 也可以简单把 Unity 理解为一个游戏引擎,可以用来专业制作游戏!
【100个 Unity小知识点】☀️ | Unity中使用代码查询Draw call、Tris和Verts等信息