您的位置:首页 > 其它

善于 调用Windows API

2015-09-30 12:53 405 查看
前一段时间看见别人做的一个自动填写信息并且点击登录的程序,觉得很有意思。

其实就是在程序中调用Windows的API,那么如何调用,下面就做个简单的介绍。

写的简单粗暴, 不喜轻喷。

0、首先引入名称空间System.Runtime.InteropServices用来导入Windows DLL.

1、下面是函数原型:

  1.1、这是模拟鼠标按下的方法

[DllImport("user32.dll", EntryPoint = "mouse_event")]
public static extern void mouse_event(
int dwFlags,
int dx,
int dy,
int cButtons,
int dwExtraInfo
);


  1.2、这是模拟按键 按下的方法

[DllImport("user32.dll", EntryPoint = "keybd_event")]
public static extern void keybd_event(
byte bVk,         // 虚拟键码

byte bScan,       // 该键的硬件扫描码(一般为0 )

dword dwFlags,    // 函数操作的各个方面的一个标志位集

dword dwExtralnfo // 与击键相关的附加的32位值

);

      

       PS: 其中第三个参数有三种取值:


    0:按下;

    1:扩展键;

    2:弹起。



3.相关实例

     const int MOUSEEVENTF_MOVE = 0x0001;      //移动鼠标
const int MOUSEEVENTF_LEFTDOWN = 0x0002; //模拟鼠标左键按下
const int MOUSEEVENTF_LEFTUP = 0x0004; //模拟鼠标左键抬起
const int MOUSEEVENTF_RIGHTDOWN = 0x0008; //模拟鼠标右键按下
const int MOUSEEVENTF_RIGHTUP = 0x0010; //模拟鼠标右键抬起
const int MOUSEEVENTF_MIDDLEDOWN = 0x0020; //模拟鼠标中键按下
const int MOUSEEVENTF_MIDDLEUP = 0x0040;// 模拟鼠标中键抬起
const int MOUSEEVENTF_ABSOLUTE = 0x8000; //标示是否采用绝对坐标

       


public Form1()
{
InitializeComponent();

int X = 100;
int Y = 100;

mouse_event( MOUSEEVENTF_RIGHTDOWN, X , Y , 0, 0);
mouse_event(MOUSEEVENTF_RIGHTUP, X , Y, 0, 0);

X += 10;
Y += 65;
mouse_event(MOUSEEVENTF_MOVE, X, Y , 0, 0);
mouse_event(MOUSEEVENTF_LEFTDOWN, X, Y , 0, 0);
mouse_event(MOUSEEVENTF_LEFTUP, X, Y , 0, 0);

keybd_event(65, 0, 0, 0);//a
keybd_event(66, 0, 1, 0);//b
keybd_event(13, 0, 0, 0);//回车

}


4、一个很实用的例子(实现了粘贴复制的功能)

//相当于按下 Ctrl+C
keybd_event(Convert.ToInt32(System.Windows.Forms.Keys.ControlKey), 0, 0, 0);  //按下Ctrl
keybd_event(Convert.ToInt32(System.Windows.Forms.Keys.C), 0, 0, 0);
keybd_event(Convert.ToInt32(System.Windows.Forms.Keys.ControlKey), 0, 0x2, 0);//弹起Ctrl,*******很重要,不然Ctrl会一直处于按下状态,键盘就是失灵,我自己的亲身经历。。

//相当于按下 Ctrl+V
keybd_event(Convert.ToInt32(System.Windows.Forms.Keys.ControlKey), 0, 0, 0);  //按下Ctrl
keybd_event(Convert.ToInt32(System.Windows.Forms.Keys.V), 0, 0, 0);
keybd_event(Convert.ToInt32(System.Windows.Forms.Keys.ControlKey), 0, 0x2, 0);//弹起Ctrl


5、其实Windows API还有很多,这里只说到了两种,下面这些也挺常见

[DllImport("user32.dll")]private static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);
 [DllImport("user32.dll")]private static extern bool SetForegroundWindow(IntPtr hWnd);
 [DllImport("user32.dll")]private static extern IntPtr FindWindow(string lpClassName,string lpWindowName);
 [DllImport("user32.dll")]private static extern int SendMessage(IntPtr hWnd,int Msg,int wParam,int lParam);
 [DllImport("user32.dll")]private static extern bool SetCursorPos(int X, int Y);
[DllImport("user32.dll")]private static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndlnsertAfter, int X, int Y, int cx, int cy, uint Flags);


6、补充一些没有说到的

  用C#调用Windows API向指定窗口发送按键消息

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: