有個奇奇怪怪的BUG,需要定時模擬鼠標(biāo)點擊
就想到了這個騷操作。
C#本身帶的類庫中沒有關(guān)于鼠標(biāo)操作的函數(shù)庫,需要引用微軟的dll。
重點需要引入user32.dll,可以在C:\Windows\System32文件夾中找到,最好不要用網(wǎng)上下的,用本機的,我就吃了這個虧。
unity引入all
把dll放到unityAssets/Plugins文件夾下,
打包時系統(tǒng)自動把dll打包到
代碼
using System;
public class MouseSimulater
{
#region DLLs
[System.Runtime.InteropServices.DllImport("user32.dll")]
private static extern int SetCursorPos(int x, int y);
[System.Runtime.InteropServices.DllImport("user32.dll")]
private static extern void mouse_event(MouseEventFlag dwFlags, int dx, int dy, uint dwData, UIntPtr dwExtraInfo);
// 方法參數(shù)說明
// 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
// );
[Flags]
enum MouseEventFlag : uint
{
//移動鼠標(biāo)
Move = 0x0001,
//模擬鼠標(biāo)左鍵按下
LeftDown = 0x0002,
//模擬鼠標(biāo)左鍵抬起
LeftUp = 0x0004,
//模擬鼠標(biāo)右鍵按下
RightDown = 0x0008,
//模擬鼠標(biāo)右鍵抬起
RightUp = 0x0010,
//模擬鼠標(biāo)中鍵按下
MiddleDown = 0x0020,
//模擬鼠標(biāo)中鍵抬起
MiddleUp = 0x0040,
XDown = 0x0080,
XUp = 0x0100,
//標(biāo)示是否采用絕對坐標(biāo)
Wheel = 0x0800,
VirtualDesk = 0x4000,
Absolute = 0x8000
}
#endregion
// Unity屏幕坐標(biāo)從左下角開始,向右為X軸,向上為Y軸
// Windows屏幕坐標(biāo)從左上角開始,向右為X軸,向下為Y軸
/// <summary>
/// 移動鼠標(biāo)到指定位置(使用Unity屏幕坐標(biāo)而不是Windows屏幕坐標(biāo))
/// </summary>
public static bool MoveTo(float x, float y)
{
if (x < 0 || y < 0 || x > UnityEngine.Screen.width || y > UnityEngine.Screen.height)
return true;
if (!UnityEngine.Screen.fullScreen)
{
UnityEngine.Debug.LogError("只能在全屏狀態(tài)下使用!");
return false;
}
// SetCursorPos 函數(shù)
//把光標(biāo)移到屏幕的指定位置。(ps:是整個屏幕的坐標(biāo),相對于屏幕左上角的絕對位置)
//參數(shù)
//X 指定光標(biāo)的新的X坐標(biāo),以屏幕坐標(biāo)表示。
//Y 指定光標(biāo)的新的Y坐標(biāo),以屏幕坐標(biāo)表示。
//返回值
//如果成功,返回非0值
//如果失敗,返回值是0
SetCursorPos((int)x, (int)(UnityEngine.Screen.height - y));
return true;
}
// 左鍵單擊
public static void LeftClick(float x = -1, float y = -1)
{
if (MoveTo(x, y))
{
//mouse_event 函數(shù)
//綜合鼠標(biāo)移動和按鈕點擊。該方法包含鼠標(biāo)左右移動及點擊操作。
//dx
//指定鼠標(biāo)沿x軸的絕對位置或者從上次鼠標(biāo)事件產(chǎn)生以來移動的數(shù)量,依賴于MOUSEEVENTF_ABSOLUTE的設(shè)置。給出的絕對數(shù)據(jù)作為鼠標(biāo) 的實際X坐標(biāo);給出的相對數(shù)據(jù)作為移動的mickeys數(shù)。一個mickey表示鼠標(biāo)移動的數(shù)量,表明鼠標(biāo)已經(jīng)移動。
//dy
//指定鼠標(biāo)沿y軸的絕對位置或者從上次鼠標(biāo)事件產(chǎn)生以來移動的數(shù)量,依賴于MOUSEEVENTF_ABSOLUTE的設(shè)置。給出的絕對數(shù)據(jù)作為鼠標(biāo)的實際y坐標(biāo),給出的相對數(shù)據(jù)作為移動的mickeys數(shù)。
//dwData
//如果dwFlags為MOUSEEVENTF_WHEEL,則dwData指定鼠標(biāo)輪移動的數(shù)量。正值表明鼠標(biāo)輪向前轉(zhuǎn)動,即遠(yuǎn)離用戶的方向;負(fù)值表明鼠標(biāo)輪向后轉(zhuǎn)動,即朝向用戶。一個輪擊定義為WHEEL_DELTA,即120。如果dwFlagsS不是MOUSEEVENTF_WHEEL,則dWData應(yīng)為零。
//dwExtraInfo
//指定與鼠標(biāo)事件相關(guān)的附加32位值。應(yīng)用程序調(diào)用函數(shù)GetMessageExtraInfo來獲得此附加信息
mouse_event(MouseEventFlag.LeftDown, 0, 0, 0, UIntPtr.Zero);
mouse_event(MouseEventFlag.LeftUp, 0, 0, 0, UIntPtr.Zero);
}
}
// 右鍵單擊
public static void RightClick(float x = -1, float y = -1)
{
if (MoveTo(x, y))
{
mouse_event(MouseEventFlag.RightDown, 0, 0, 0, UIntPtr.Zero);
mouse_event(MouseEventFlag.RightUp, 0, 0, 0, UIntPtr.Zero);
}
}
// 中鍵單擊
public static void MiddleClick(float x = -1, float y = -1)
{
if (MoveTo(x, y))
{
mouse_event(MouseEventFlag.MiddleDown, 0, 0, 0, UIntPtr.Zero);
mouse_event(MouseEventFlag.MiddleUp, 0, 0, 0, UIntPtr.Zero);
}
}
// 左鍵按下
public static void LeftDown(float x = -1, float y = -1)
{
if (MoveTo(x, y))
{
mouse_event(MouseEventFlag.LeftDown, 0, 0, 0, UIntPtr.Zero);
}
}
// 左鍵抬起
public static void LeftUp(float x = -1, float y = -1)
{
if (MoveTo(x, y))
{
mouse_event(MouseEventFlag.LeftUp, 0, 0, 0, UIntPtr.Zero);
}
}
// 右鍵按下
public static void RightDown(float x = -1, float y = -1)
{
if (MoveTo(x, y))
{
mouse_event(MouseEventFlag.RightDown, 0, 0, 0, UIntPtr.Zero);
}
}
// 右鍵抬起
public static void RightUp(float x = -1, float y = -1)
{
if (MoveTo(x, y))
{
mouse_event(MouseEventFlag.RightUp, 0, 0, 0, UIntPtr.Zero);
}
}
// 中鍵按下
public static void MiddleDown(float x = -1, float y = -1)
{
if (MoveTo(x, y))
{
mouse_event(MouseEventFlag.MiddleDown, 0, 0, 0, UIntPtr.Zero);
}
}
// 中鍵抬起
public static void MiddleUp(float x = -1, float y = -1)
{
if (MoveTo(x, y))
{
mouse_event(MouseEventFlag.MiddleUp, 0, 0, 0, UIntPtr.Zero);
}
}
// 滾輪滾動
public static void ScrollWheel(float value)
{
mouse_event(MouseEventFlag.Wheel, 0, 0, (uint)value, UIntPtr.Zero);
}
}
Unity簡單調(diào)用
// 模擬鼠標(biāo)左鍵按下
MouseSimulater.LeftClick(450,850);
參數(shù)釋義
文章來源:http://www.zghlxwxcb.cn/news/detail-755159.html
參考
https://www.cnblogs.com/falcon-fei/p/11396740.html
https://blog.csdn.net/keneyr/article/details/98079695
https://blog.csdn.net/qq_21397217/article/details/78488072文章來源地址http://www.zghlxwxcb.cn/news/detail-755159.html
到了這里,關(guān)于Unity 模擬鼠標(biāo)點擊操作的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!