HeavenStudio/Assets/Plugins/Starpelly/OperatingSystem/Windows.cs

142 lines
4.9 KiB
C#

#if UNITY_STANDALONE_WIN || UNITY_EDITOR_WIN
using System;
using System.Runtime.InteropServices;
using Starpelly.Enums.Windows;
using System.Text;
namespace Starpelly.OperatingSystem
{
public class Windows : IOperatingSystem
{
/// <summary>
/// Gets the current title of the game window.
/// </summary>
/// <returns>The current title the window is, will probably only be used for changing the window in ChangeWindowTitle()</returns>
private static string GetActiveWindowTitle()
{
const int nChars = 256;
StringBuilder Buff = new StringBuilder(nChars);
IntPtr handle = User32.GetForegroundWindow();
if (User32.GetWindowText(handle, Buff, nChars) > 0)
{
return Buff.ToString();
}
return null;
}
/// <summary>
/// Changes the game's window title.
/// </summary>
/// <param name="newTitle">The title the window will be changed to.</param>
public void ChangeWindowTitle(string newTitle)
{
var windowPtr = User32.FindWindow(null, GetActiveWindowTitle());
User32.SetWindowText(windowPtr, newTitle);
}
#region Input
/// <summary>
/// Simulates a real key press passed in.
/// </summary>
public static void KeyPress(KeyCodeWin keyCode)
{
INPUT input = new INPUT
{
type = SendInputEventType.InputKeyboard,
mkhi = new MOUSEANDKEYBOARDINPUT
{
ki = new KEYBOARDINPUT
{
wVk = (ushort)keyCode,
wScan = 0,
dwFlags = 0, // if nothing, key down
time = 0,
dwExtraInfo = IntPtr.Zero,
}
}
};
INPUT input2 = new INPUT
{
type = SendInputEventType.InputKeyboard,
mkhi = new MOUSEANDKEYBOARDINPUT
{
ki = new KEYBOARDINPUT
{
wVk = (ushort)keyCode,
wScan = 0,
dwFlags = 2, // key up
time = 0,
dwExtraInfo = IntPtr.Zero,
}
}
};
INPUT[] inputs = new INPUT[] { input, input2 }; // Combined, it's a keystroke
User32.SendInput((uint)inputs.Length, inputs, Marshal.SizeOf(typeof(INPUT)));
}
/// <summary>
/// Sets your mouse pointer.
/// </summary>
public static void ChangeCursor(WindowsCursor cursor)
{
User32.SetCursor(User32.LoadCursor(IntPtr.Zero, (int)cursor));
}
/// <summary>
/// Immediately clicks the left mouse button.
/// </summary>
public static void ClickLeftMouseButton()
{
INPUT mouseDownInput = new INPUT();
mouseDownInput.type = SendInputEventType.InputMouse;
mouseDownInput.mkhi.mi.dwFlags = MouseEventFlags.MOUSEEVENT_LEFTDOWN;
User32.SendInput(1, ref mouseDownInput, Marshal.SizeOf(new INPUT()));
INPUT mouseUpInput = new INPUT();
mouseUpInput.type = SendInputEventType.InputMouse;
mouseUpInput.mkhi.mi.dwFlags = MouseEventFlags.MOUSEEVENT_LEFTUP;
User32.SendInput(1, ref mouseUpInput, Marshal.SizeOf(new INPUT()));
}
/// <summary>
/// Immediately clicks the right mouse button.
/// </summary>
public static void ClickRightMouseButton()
{
INPUT mouseDownInput = new INPUT();
mouseDownInput.type = SendInputEventType.InputMouse;
mouseDownInput.mkhi.mi.dwFlags = MouseEventFlags.MOUSEEVENT_RIGHTDOWN;
User32.SendInput(1, ref mouseDownInput, Marshal.SizeOf(new INPUT()));
INPUT mouseUpInput = new INPUT();
mouseUpInput.type = SendInputEventType.InputMouse;
mouseUpInput.mkhi.mi.dwFlags = MouseEventFlags.MOUSEEVENT_RIGHTUP;
User32.SendInput(1, ref mouseUpInput, Marshal.SizeOf(new INPUT()));
}
/// <summary>
/// Moves your cursor in the x and y params implemented, plus the current mouse pos.
/// </summary>
/// <param name="dx">Direction X</param>
/// <param name="dy">Direction Y</param>
public static void MouseMove(int dx, int dy)
{
INPUT mouseMove = new INPUT();
mouseMove.type = SendInputEventType.InputMouse;
mouseMove.mkhi.mi.dwFlags = MouseEventFlags.MOUSEEVENT_MOVE;
mouseMove.mkhi.mi.dx = dx;
mouseMove.mkhi.mi.dy = dy;
User32.SendInput(1, ref mouseMove, Marshal.SizeOf(new INPUT()));
}
#endregion
}
}
#endif