如何使用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 模拟鼠标定位和单机左键的操作:


namespace TestWinAPI1
{
public struct Point
{
int x;
int y;
}
class Program
{
static void Main(string[] args)
{
Point point = new Point();
bool getResult = GetCursorPos(ref point);
int setRight = SetCursorPos(27, 881);
MouseClick("left");
}

[DllImport("user32.dll", CharSet = CharSet.Auto)]
public static extern bool GetCursorPos(ref Point point);

[DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]
public static extern IntPtr GetCursor();

[DllImport("user32")]
public static extern int SetCursorPos(int x, int y);

[DllImport("user32.dll")]
static extern void mouse_event(uint dwFlags, uint dx, uint dy, uint dwData, int dwExtraInfo);

[Flags]
public enum MouseEventFlags:uint
{
LEFTDOWN = 0x00000002,
LEFTUP = 0x00000004,
MIDDLEDOWN = 0x00000020,
MIDDLEUP = 0x00000040,
MOVE = 0x00000001,
ABSOLUTE = 0x00008000,
RIGHTDOWN = 0x00000008,
RIGHTUP = 0x00000010
}

/// <summary>
/// checks for the currently active window then simulates a mouseclick
/// </summary>
/// <param name="button">which button to press (left middle up)</param>
/// <param name="windowName">the window to send to</param>
public static void MouseClick(string button, string windowName)
{
if (WindowActive(windowName))
MouseClick(button);
}

/// <summary>
/// simulates a mouse click see http://pinvoke.net/default.aspx/user32/mouse_event.html?diff=y
/// </summary>
/// <param name="button">which button to press (left middle up)</param>
public static void MouseClick(string button)
{
switch (button)
{
case "left":
mouse_event((uint)MouseEventFlags.LEFTDOWN|(uint)MouseEventFlags.LEFTUP, 0, 0, 0, 0);
break;
case "right":
mouse_event((uint)MouseEventFlags.RIGHTDOWN, 0, 0, 0, 0);
mouse_event((uint)MouseEventFlags.RIGHTUP, 0, 0, 0, 0);
break;
case "middle":
mouse_event((uint)MouseEventFlags.MIDDLEDOWN, 0, 0, 0, 0);
mouse_event((uint)MouseEventFlags.MIDDLEUP, 0, 0, 0, 0);
break;
}
}
}
}

 

简要描述:

使用了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可以做一些游戏的小外挂,比如模拟鼠标,键盘的操作...嘿嘿

时间: 2024-10-28 09:22:33

如何使用C#操作WinAPI的相关文章

c# 模拟window 操作鼠标|winapi

  View Code         [DllImport("user32.dll", EntryPoint = "mouse_event", SetLastError = true)]         private static extern int mouse_event(int dwFlags, int dx, int dy, int cButtons, int dwExtraInfo);                 const int MOUSEEV

XP以后Windows版本Delphi操作注册表的办法

手头的程序需要修改注册表, 以让当前程序成为某格式的默认打开程序并关联图标; Vista 之后需要管理 员权限才能操作注册表, 很麻烦, 所以有了下面的尝试. unit Unit1; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdC

Windows服务操作技巧

伴随着研究Windows服务,逐渐掌握了一些小技巧,现在与大家分享一下. 将Windows服务转变为控制台程序 由于默认的Windows服务程序,编译后为Win32的窗口程序.我们在程序启动或运行过程中,如果想看到一些调试信息,那么就只能通过DebugView或者输出到日志的方式了.因为如果我们通过printf或者std::cout输出调试信息的话,Win32窗口程序是无法显示的. 此时,我们是多么怀念我们的经典的控制台程序啊,它可以很方便的将我们的调试信息输出出来,简直是太方便了.既然如此,那

C++BUILDER的文件操作

在编程的过程中,文件的操作是一个经常用到的问题,在C++Builder中,可以使用多种方法对文件操作,下面我就按以下几个部分对此作详细介绍,就是: 1.基于C的文件操作: 2.基于C++的文件操作: 3.基于WINAPI的文件操作: 4.基于BCB库的文件操作: 5.特殊文件的操作. 壹.基于C的文件操作 在ANSI C中,对文件的操作分为两种方式,即流式文件操作和I/O文件操作,下面就分别介绍之. 一.流式文件操作 这种方式的文件操作有一个重要的结构FILE,FILE在stdio.h中定义如下

什么是WinAPI

视窗操作系统应用程序接口(Windows API),有非正式的简称法为WinAPI,是微软对于Windows操作系统中可用的内核应用程序编程接口的称法.它设计为由C/C++程序调用,而且它也是应用软件与Windows系统最直接的交互方式.而大多数驱动程序所需要的对Windows系统的更底层次访问接口,由所用版本的Windows的Native API来提供接口. Windows有一个软件开发包(SDK, software development kit)提供相应的文档和工具,以使程序员开发使用Wi

c语言-VC++6.0开发工具,打开串口,重叠IO操作,提示有访问冲突,求大神指点

问题描述 VC++6.0开发工具,打开串口,重叠IO操作,提示有访问冲突,求大神指点 #include #include LRESULT CALLBACK WndProc (HWND hwnd UINT msg WPARAM wParam LPARAM lParam); #define WM_TRANSFINISHED (WM_USER + 1) typedef struct{ HWND hwnd; HANDLE hComm;}PARAMS *PPARAMS; int WINAPI WinMai

c++-急求 C++ 网吧开机登陆验证的代码或调WinAPI的思路,谢谢各位大神!!!

问题描述 急求 C++ 网吧开机登陆验证的代码或调WinAPI的思路,谢谢各位大神!!! 要求电脑开机或待机时,屏幕显示用户输入账号和密码验证的界面(注:类似网吧管理系统,谢谢各位大神帮忙) 解决方案 http://blog.csdn.net/zhihu008/article/details/8488000 解决方案二: http://download.csdn.net/detail/beau_lily/9410436 这个是我上传的资源 不知道能不能满足你的需求 C#写的你想要显示账号和密码验

winapi-C# winfrom项目,怎么样实现通过WINAPI 关闭对象的句柄窗口后,还能再次获取该句柄窗口

问题描述 C# winfrom项目,怎么样实现通过WINAPI 关闭对象的句柄窗口后,还能再次获取该句柄窗口 在C# Winfrom项目中,from窗体中,有一个Panel控件. 目前已经实现将对象的窗口通过winAPI获取到句柄窗口放到了Panel控件中. 请问怎么样实现关闭from窗体后,下次再进入from窗体后,还通过winAPI获取到句柄窗口放到了Panel控件中. 关闭from窗体的事情需要怎么样写,才能实现通过winAPI获取到句柄窗口放到了Panel控件中. 附上代码(通过winA

C#使用WinAPI 修改电源设置,临时禁止笔记本合上盖子时睡眠

原文 http://www.cnblogs.com/h46incon/archive/2013/09/03/3299138.html 在 阻止系统自动睡眠的小软件,附C#制作过程 ,弄了一个防止系统睡眠的工具.然后马上发现,新的需求来了:为了保护环境(省钱),在系统设置中,合上盖子时会自动睡眠.那因下载之类的原因,需要临时禁止睡眠的话,又懒得去改设置,而且下次还得改回来.所以没事也是折腾,就研究了怎么用软件实现了.   最开始的思路就是进行Hook,以截断睡眠消息.但是木有找到方法. 然后发现当