Lua——模仿按键精灵

来源:互联网 发布:数控车床车盲孔编程 编辑:程序博客网 时间:2024/06/06 11:19

时间:2016.11.02

主要使用C导出库提供按键精灵功能库的模拟,Lua负责调用这些接口实现脚本功能


首先要模拟鼠标和按键功能需要用到下面两个函数:

// 模拟鼠标功能VOID mouse_event(    DWORD dwFlags,          // motion and click options    DWORD dx,               // horizontal position or change    DWORD dy,               // vertical position or change    DWORD dwData,           // wheel movement    ULONG_PTR dwExtraInfo   // application-defined information);// 模拟键盘功能VOID keybd_event(    BYTE bVk,             //虚拟按键码    BYTE bScan,           //定义该键的硬件扫描码    DWORD dwFlags,        //KEYEVENTF_KEYDOWN:0  KEYEVENTF_KEYUP    DWORD dwExtralnfo     //定义与击键相关的附加的32位值);   

主要是直接加载C的动态链接库,导出类似按键精灵里面使用的命令
Delay : 延时
MoveTo: 鼠标移动
LeftClick: 鼠标左键点击
LeftDClick: 鼠标左键双击
RigthClick: 鼠标右键点击
RightDClick: 鼠标右键双击
LeftDown: 鼠标左键按下
LeftUp: 鼠标左键抬起
RightDown: 鼠标右键按下
RightUp: 鼠标右键抬起

#include < Windows.h>extern "C"{   #include "lua.h"   #include "lualib.h"   #include "lauxlib.h"   #pragma comment( lib, "lua5.1.lib" )}/////////////////////////////////////////////////////////////////////////////////鼠标操作// MoveTo 鼠标移动extern "C" int __declspec(dllexport) MoveTo( lua_State* L ){   int Y = lua_tonumber( L, -1 );   int X = lua_tonumber( L, -2 );/* 当mouse_event的第一个参数附加上MOUSEEVENT_ABSOLUTE标志以后,后面两个参数表示标准化的绝对坐标值,取值范围为0到65535。(0,0)对应屏幕左上角位置,(65535,65535)对应右下角位置。固传递参数的时候,需要将传进来的参数进行格式化*/    int ScreenWidth = ::GetSystemMetrics( SM_CXSCREEN );    int ScreenHeight = ::GetSystemMetrics( SM_CYSCREEN );    X = X * 65535.00 / ScreenWidth;    Y = Y * 65535.00 / ScreenHeight;    ::mouse_event( MOUSEEVENT_MOVE | MOUSEEVENT_ABSOLUTE, X, Y, 0, NULL );    return 0;}// 左键按下extern "C" int __declspec(dllexport) LeftDown( lua_State* L ){    ::mouse_event( MOUSEEVENTF_LEFTDOWN, 0, 0, 0, NULL );    return 0;}// 左键抬起extern "C" int __declspec(dllexport) LeftUp( lua_State* L ){    ::mouse_event( MOUSEEVENTF_LEFTUP, 0, 0, 0, NULL );    return 0;}// 左键点击extern "C" int __declspec(dllexport) LeftClick( lua_State* L ){    ::mouse_event( MOUSEEVENTF_LEFTDOWN, 0, 0, 0, NULL );    ::mouse_event( MOUSEEVENTF_LEFTUP, 0, 0, 0, NULL );    return 0;}// 左键点击extern "C" int __declspec(dllexport) LeftClick( lua_State* L ){    ::mouse_event( MOUSEEVENTF_LEFTDOWN, 0, 0, 0, NULL );    ::mouse_event( MOUSEEVENTF_LEFTUP, 0, 0, 0, NULL );    return 0;}// 右键按下extern "C" int __declspec(dllexport) RightDown( lua_State* L ){    ::mouse_event( MOUSEEVENTF_RIGHTDOWN, 0, 0, 0, NULL );    return 0;}// 右键抬起extern "C" int __declspec(dllexport) RightUp( lua_State* L ){    ::mouse_event( MOUSEEVENTF_RIGHTUP, 0, 0, 0, NULL );    return 0;}// 右键点击extern "C" int __declspec(dllexport) RightClick( lua_State* L ){    ::mouse_event( MOUSEEVENTF_RIGHTDOWN, 0, 0, 0, NULL );    ::mouse_event( MOUSEEVENTF_RIGHTUP, 0, 0, 0, NULL );    return 0;}// 右键双击extern "C" int __declspec(dllexport) RightDClick( lua_State* L ){    ::mouse_event( MOUSEEVENTF_RIGHTDOWN, 0, 0, 0, NULL );    ::mouse_event( MOUSEEVENTF_RIGHTUP, 0, 0, 0, NULL );    ::mouse_event( MOUSEEVENTF_RIGHTDOWN, 0, 0, 0, NULL );    ::mouse_event( MOUSEEVENTF_RIGHTUP, 0, 0, 0, NULL );    return 0;}extern "C" int __declspec(dllexport) luaopen_add( lua_State* L ){    lua_register( L, "MoveTo", MoveTo );    lua_register( L, "Delay", Delay );    lua_register( L, "LeftDown", LeftDown );    lua_register( L, "LeftUp", LeftUp );    lua_register( L, "LeftClick", LeftClick );    lua_register( L, "LeftDClick", LeftDClick );    lua_register( L, "RightDown", LeftDown );    lua_register( L, "RightUp", LeftUp );    lua_register( L, "RightClick", LeftClick );    lua_register( L, "RightDClick", LeftDClick );    return 0;}

最后通过Lua文件来设置脚本:

MoveTo = package.loadlib( "VicAssist.dll", "MoveTo" )LeftClick = package.loadlib( "VicAssist.dll", "LeftClick" )Delay = package.loadlib( "VicAssist.dll", "Delay" )MoveTo( 34, 42 )Delay( 200 )LeftClick()

鼠标会移动到该位置然后点击一次

0 0