t1 / TFDContents / Assets / KinectScripts / Samples / MouseControl.cs @ 3
이력 | 보기 | 이력해설 | 다운로드 (7.49 KB)
| 1 | 3 | KTH | // This script can be used to control the system mouse - position of the mouse cursor and clicks |
|---|---|---|---|
| 2 | // Author: Akhmad Makhsadov |
||
| 3 | // |
||
| 4 | |||
| 5 | using UnityEngine; |
||
| 6 | using System.Collections; |
||
| 7 | using System.Runtime.InteropServices; |
||
| 8 | using System; |
||
| 9 | |||
| 10 | public class MouseControl |
||
| 11 | {
|
||
| 12 | // Import function mouse_event() from WinApi |
||
| 13 | [DllImport("User32.dll")]
|
||
| 14 | private static extern void mouse_event(MouseFlags dwFlags, int dx, int dy, int dwData, System.UIntPtr dwExtraInfo); |
||
| 15 | |||
| 16 | // Flags needed to specify the mouse action |
||
| 17 | [System.Flags] |
||
| 18 | private enum MouseFlags |
||
| 19 | {
|
||
| 20 | Move = 0x0001, |
||
| 21 | LeftDown = 0x0002, |
||
| 22 | LeftUp = 0x0004, |
||
| 23 | RightDown = 0x0008, |
||
| 24 | RightUp = 0x0010, |
||
| 25 | Absolute = 0x8000, |
||
| 26 | } |
||
| 27 | |||
| 28 | // public static int MouseXSpeedCoef = 45000; // Cursor rate in Х direction |
||
| 29 | // public static int MouseYSpeedCoef = 45000; // Cursor rate in Y direction |
||
| 30 | |||
| 31 | [StructLayout(LayoutKind.Sequential)] |
||
| 32 | public struct RECT |
||
| 33 | {
|
||
| 34 | public int Left; // x position of upper-left corner |
||
| 35 | public int Top; // y position of upper-left corner |
||
| 36 | public int Right; // x position of lower-right corner |
||
| 37 | public int Bottom; // y position of lower-right corner |
||
| 38 | } |
||
| 39 | |||
| 40 | [DllImport("user32.dll")]
|
||
| 41 | //[return: MarshalAs(UnmanagedType.Bool)] |
||
| 42 | static extern bool GetWindowRect(IntPtr hWnd, out RECT lpRect); |
||
| 43 | |||
| 44 | [DllImport("user32.dll")]
|
||
| 45 | static extern IntPtr GetActiveWindow(); |
||
| 46 | |||
| 47 | enum GetWindow_Cmd : uint |
||
| 48 | {
|
||
| 49 | GW_HWNDFIRST = 0, |
||
| 50 | GW_HWNDLAST = 1, |
||
| 51 | GW_HWNDNEXT = 2, |
||
| 52 | GW_HWNDPREV = 3, |
||
| 53 | GW_OWNER = 4, |
||
| 54 | GW_CHILD = 5, |
||
| 55 | GW_ENABLEDPOPUP = 6 |
||
| 56 | } |
||
| 57 | |||
| 58 | [DllImport("user32.dll", SetLastError = true)]
|
||
| 59 | static extern IntPtr GetWindow(IntPtr hWnd, GetWindow_Cmd uCmd); |
||
| 60 | |||
| 61 | const int MONITOR_DEFAULTTONULL = 0; |
||
| 62 | const int MONITOR_DEFAULTTOPRIMARY = 1; |
||
| 63 | const int MONITOR_DEFAULTTONEAREST = 2; |
||
| 64 | |||
| 65 | [DllImport("user32.dll")]
|
||
| 66 | static extern IntPtr MonitorFromWindow(IntPtr hwnd, uint dwFlags); |
||
| 67 | |||
| 68 | [StructLayout(LayoutKind.Sequential)] |
||
| 69 | private struct MONITORINFO |
||
| 70 | {
|
||
| 71 | public int cbSize; |
||
| 72 | public RECT rcMonitor; |
||
| 73 | public RECT rcWork; |
||
| 74 | public uint dwFlags; |
||
| 75 | } |
||
| 76 | |||
| 77 | [DllImport("user32.dll")]
|
||
| 78 | static extern bool GetMonitorInfo(IntPtr hMonitor, ref MONITORINFO lpmi); |
||
| 79 | |||
| 80 | |||
| 81 | // private static int windowX = 0; |
||
| 82 | // private static int windowY = 0; |
||
| 83 | // private static int winSizeX = 0; |
||
| 84 | // private static int winSizeY = 0; |
||
| 85 | |||
| 86 | private static Vector2 monitorSize = Vector2.zero; |
||
| 87 | private static MONITORINFO monitorInfo = new MONITORINFO(); |
||
| 88 | private static bool winRectPrinted = false; |
||
| 89 | |||
| 90 | |||
| 91 | // Public function to move the mouse cursor to the specified position |
||
| 92 | public static void MouseMove(Vector3 screenCoordinates, GUIText debugText) |
||
| 93 | {
|
||
| 94 | int windowX = 0; |
||
| 95 | int windowY = 0; |
||
| 96 | int winSizeX = 0; |
||
| 97 | int winSizeY = 0; |
||
| 98 | |||
| 99 | bool isConvertToFullScreen = Screen.fullScreen; |
||
| 100 | |||
| 101 | IntPtr hWnd = GetActiveWindow(); |
||
| 102 | hWnd = GetClosestWindow(hWnd, Screen.width, Screen.height); |
||
| 103 | |||
| 104 | if (hWnd != IntPtr.Zero) |
||
| 105 | {
|
||
| 106 | RECT winRect; |
||
| 107 | |||
| 108 | if (GetWindowRect(hWnd, out winRect)) |
||
| 109 | {
|
||
| 110 | winSizeX = winRect.Right - winRect.Left; |
||
| 111 | winSizeY = winRect.Bottom - winRect.Top; |
||
| 112 | |||
| 113 | windowX = winRect.Left + (winSizeX - (int)Screen.width) / 2; |
||
| 114 | |||
| 115 | if (!isConvertToFullScreen) |
||
| 116 | {
|
||
| 117 | windowY = winRect.Top + (winSizeY - (int)Screen.height + 36) / 2; |
||
| 118 | } |
||
| 119 | else |
||
| 120 | {
|
||
| 121 | windowY = winRect.Top + (winSizeY - (int)Screen.height) / 2; |
||
| 122 | } |
||
| 123 | |||
| 124 | // get display resolution |
||
| 125 | if (monitorSize == Vector2.zero) |
||
| 126 | {
|
||
| 127 | monitorInfo.cbSize = Marshal.SizeOf (monitorInfo); |
||
| 128 | |||
| 129 | IntPtr hMonitoŕ = MonitorFromWindow (hWnd, MONITOR_DEFAULTTONEAREST); |
||
| 130 | if (!GetMonitorInfo (hMonitoŕ, ref monitorInfo)) |
||
| 131 | {
|
||
| 132 | monitorInfo.rcMonitor.Left = monitorInfo.rcMonitor.Top = 0; |
||
| 133 | monitorInfo.rcMonitor.Right = Screen.currentResolution.width - 1; |
||
| 134 | monitorInfo.rcMonitor.Bottom = Screen.currentResolution.height - 1; |
||
| 135 | |||
| 136 | monitorInfo.rcWork.Left = monitorInfo.rcWork.Top = 0; |
||
| 137 | monitorInfo.rcWork.Right = Screen.currentResolution.width - 1; |
||
| 138 | monitorInfo.rcWork.Bottom = Screen.currentResolution.height - 1; |
||
| 139 | } |
||
| 140 | |||
| 141 | monitorSize.x = monitorInfo.rcMonitor.Right - monitorInfo.rcMonitor.Left + 1; |
||
| 142 | monitorSize.y = monitorInfo.rcMonitor.Bottom - monitorInfo.rcMonitor.Top + 1; |
||
| 143 | } |
||
| 144 | |||
| 145 | if (!winRectPrinted) |
||
| 146 | {
|
||
| 147 | Debug.Log (string.Format ("monSize: ({0}, {1})", monitorSize.x, monitorSize.y));
|
||
| 148 | Debug.Log (string.Format ("scrSize: ({0}, {1})", Screen.width, Screen.height));
|
||
| 149 | Debug.Log (string.Format ("winRect: ({0}, {1}, {2}, {3})", winRect.Left, winRect.Top, winRect.Right, winRect.Bottom));
|
||
| 150 | Debug.Log (string.Format ("winPos: ({0}, {1})", windowX, windowY));
|
||
| 151 | winRectPrinted = true; |
||
| 152 | } |
||
| 153 | } |
||
| 154 | } |
||
| 155 | else |
||
| 156 | {
|
||
| 157 | if (monitorSize == Vector2.zero) |
||
| 158 | {
|
||
| 159 | monitorSize.x = Screen.currentResolution.width; |
||
| 160 | monitorSize.y = Screen.currentResolution.height; |
||
| 161 | } |
||
| 162 | } |
||
| 163 | |||
| 164 | int mouseX = 0; |
||
| 165 | int mouseY = 0; |
||
| 166 | |||
| 167 | if(!isConvertToFullScreen) |
||
| 168 | {
|
||
| 169 | float screenX = windowX + screenCoordinates.x * Screen.width; |
||
| 170 | float screenY = windowY + (1f - screenCoordinates.y) * Screen.height; |
||
| 171 | |||
| 172 | float screenRelX = screenX / monitorSize.x; |
||
| 173 | float screenRelY = screenY / monitorSize.y; |
||
| 174 | |||
| 175 | // if(debugText) |
||
| 176 | // {
|
||
| 177 | // if(!debugText.text.Contains("ScrPos"))
|
||
| 178 | // {
|
||
| 179 | // string sDebug = string.Format("\nScrPos: ({0:F0}, {1:F0})", screenX, screenY);
|
||
| 180 | // debugText.text += sDebug; |
||
| 181 | // //Debug.Log (sDebug); |
||
| 182 | // } |
||
| 183 | // } |
||
| 184 | |||
| 185 | mouseX = (int)(screenRelX * 65535); |
||
| 186 | mouseY = (int)(screenRelY * 65535); |
||
| 187 | } |
||
| 188 | else |
||
| 189 | {
|
||
| 190 | mouseX = (int)(screenCoordinates.x * 65535); |
||
| 191 | mouseY = (int)((1f - screenCoordinates.y) * 65535); |
||
| 192 | } |
||
| 193 | |||
| 194 | mouse_event(MouseFlags.Absolute | MouseFlags.Move, mouseX, mouseY, 0, System.UIntPtr.Zero); |
||
| 195 | } |
||
| 196 | |||
| 197 | // find the closest matching child window to the screen size |
||
| 198 | private static IntPtr GetClosestWindow(IntPtr hWndMain, int scrWidth, int scrHeight) |
||
| 199 | {
|
||
| 200 | if(hWndMain == IntPtr.Zero) |
||
| 201 | return hWndMain; |
||
| 202 | |||
| 203 | IntPtr hWnd = hWndMain; |
||
| 204 | RECT winRect; |
||
| 205 | |||
| 206 | if(GetWindowRect(hWndMain, out winRect)) |
||
| 207 | {
|
||
| 208 | int winSizeX = winRect.Right - winRect.Left; |
||
| 209 | int winSizeY = winRect.Bottom - winRect.Top; |
||
| 210 | int winDiff = Math.Abs(winSizeX - scrWidth) + Math.Abs(winSizeY - scrHeight); |
||
| 211 | |||
| 212 | IntPtr hWndChild = GetWindow(hWndMain, GetWindow_Cmd.GW_CHILD); |
||
| 213 | int winDiffMin = winDiff; |
||
| 214 | |||
| 215 | while(hWndChild != IntPtr.Zero) |
||
| 216 | {
|
||
| 217 | if(GetWindowRect(hWndChild, out winRect)) |
||
| 218 | {
|
||
| 219 | winSizeX = winRect.Right - winRect.Left; |
||
| 220 | winSizeY = winRect.Bottom - winRect.Top; |
||
| 221 | winDiff = Math.Abs(winSizeX - scrWidth) + Math.Abs(winSizeY - scrHeight - 36); |
||
| 222 | |||
| 223 | if(scrWidth <= winSizeX && scrHeight <= winSizeY && winDiff <= winDiffMin) |
||
| 224 | {
|
||
| 225 | hWnd = hWndChild; |
||
| 226 | winDiffMin = winDiff; |
||
| 227 | } |
||
| 228 | } |
||
| 229 | |||
| 230 | hWndChild = GetWindow(hWndChild, GetWindow_Cmd.GW_HWNDNEXT); |
||
| 231 | } |
||
| 232 | } |
||
| 233 | |||
| 234 | return hWnd; |
||
| 235 | } |
||
| 236 | |||
| 237 | // Public function to emulate a mouse button click (left button) |
||
| 238 | public static void MouseClick() |
||
| 239 | {
|
||
| 240 | mouse_event(MouseFlags.LeftDown, 0, 0, 0, System.UIntPtr.Zero); |
||
| 241 | mouse_event(MouseFlags.LeftUp, 0, 0, 0, System.UIntPtr.Zero); |
||
| 242 | } |
||
| 243 | |||
| 244 | // Public function to emulate a mouse drag event (left button) |
||
| 245 | public static void MouseDrag() |
||
| 246 | {
|
||
| 247 | mouse_event(MouseFlags.LeftDown, 0, 0, 0, System.UIntPtr.Zero); |
||
| 248 | } |
||
| 249 | |||
| 250 | // Public function to emulate a mouse release event (left button) |
||
| 251 | public static void MouseRelease() |
||
| 252 | {
|
||
| 253 | mouse_event(MouseFlags.LeftUp, 0, 0, 0, System.UIntPtr.Zero); |
||
| 254 | } |
||
| 255 | |||
| 256 | } |
||
| 257 |