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 |