Files
uDesktopDuplication/Assets/uDesktopDuplication/Runtime/Scripts/Lib.cs
T

252 lines
7.9 KiB
C#

using UnityEngine;
using System;
using System.Text;
using System.Runtime.InteropServices;
#pragma warning disable 114, 465
namespace uDesktopDuplication
{
public enum Message
{
None = -1,
Reinitialized = 0,
TextureSizeChanged = 1,
}
public enum CursorShapeType
{
Unspecified = 0,
MonoChrome = 1,
Color = 2,
MaskedColor = 4,
}
public enum MonitorRotation
{
Unspecified = 0,
Identity = 1,
Rotate90 = 2,
Rotate180 = 3,
Rotate270 = 4
}
public enum DuplicatorState
{
NotSet = -1,
Ready = 0,
Running = 1,
InvalidArg = 2,
AccessDenied = 3,
Unsupported = 4,
CurrentlyNotAvailable = 5,
SessionDisconnected = 6,
AccessLost = 7,
TextureSizeInconsistent = 8,
Unknown = 999,
}
public enum DebugMode
{
None = 0,
File = 1,
UnityLog = 2, /* currently has bug when app exits. */
}
[StructLayout(LayoutKind.Sequential)]
public struct RECT
{
[MarshalAs(UnmanagedType.I4)]
public int left;
[MarshalAs(UnmanagedType.I4)]
public int top;
[MarshalAs(UnmanagedType.I4)]
public int right;
[MarshalAs(UnmanagedType.I4)]
public int bottom;
}
[StructLayout(LayoutKind.Sequential)]
public struct DXGI_OUTDUPL_MOVE_RECT
{
public RECT source;
public RECT destination;
}
public static class Lib
{
const string dllName = "uDesktopDuplication";
public delegate void MessageHandler(Message message);
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
public delegate void DebugLogDelegate(string str);
[DllImport(dllName)]
public static extern bool IsInitialized();
[DllImport(dllName)]
public static extern void Initialize();
[DllImport(dllName)]
public static extern void Finalize();
[DllImport(dllName)]
public static extern void Reinitialize();
[DllImport(dllName)]
public static extern void Update();
[DllImport(dllName)]
public static extern Message PopMessage();
[DllImport(dllName)]
public static extern void EnableDebug();
[DllImport(dllName)]
public static extern void DisableDebug();
[DllImport(dllName)]
public static extern void SetDebugMode(DebugMode mode);
[DllImport(dllName)]
public static extern void SetLogFunc(DebugLogDelegate func);
[DllImport(dllName)]
public static extern void SetErrorFunc(DebugLogDelegate func);
[DllImport(dllName)]
public static extern int GetMonitorCount();
[DllImport(dllName)]
public static extern bool HasMonitorCountChanged();
[DllImport(dllName)]
public static extern int GetCursorMonitorId();
[DllImport(dllName)]
public static extern int GetTotalWidth();
[DllImport(dllName)]
public static extern int GetTotalHeight();
[DllImport(dllName)]
public static extern IntPtr GetRenderEventFunc();
[DllImport(dllName)]
public static extern int GetId(int id);
[DllImport(dllName)]
public static extern DuplicatorState GetState(int id);
[DllImport(dllName)]
public static extern void GetName(int id, StringBuilder buf, int len);
[DllImport(dllName)]
public static extern int GetLeft(int id);
[DllImport(dllName)]
public static extern int GetRight(int id);
[DllImport(dllName)]
public static extern int GetTop(int id);
[DllImport(dllName)]
public static extern int GetBottom(int id);
[DllImport(dllName)]
public static extern int GetWidth(int id);
[DllImport(dllName)]
public static extern int GetHeight(int id);
[DllImport(dllName)]
public static extern int GetDpiX(int id);
[DllImport(dllName)]
public static extern int GetDpiY(int id);
[DllImport(dllName)]
public static extern bool IsHDR(int id);
[DllImport(dllName)]
public static extern MonitorRotation GetRotation(int id);
[DllImport(dllName)]
public static extern bool IsPrimary(int id);
[DllImport(dllName)]
public static extern bool IsCursorVisible();
[DllImport(dllName)]
public static extern int GetCursorX();
[DllImport(dllName)]
public static extern int GetCursorY();
[DllImport(dllName)]
public static extern int GetCursorShapeWidth();
[DllImport(dllName)]
public static extern int GetCursorShapeHeight();
[DllImport(dllName)]
public static extern int GetCursorShapePitch();
[DllImport(dllName)]
public static extern CursorShapeType GetCursorShapeType();
[DllImport(dllName)]
public static extern void GetCursorTexture(IntPtr ptr);
[DllImport(dllName)]
public static extern int GetCursorHotSpotX();
[DllImport(dllName)]
public static extern int GetCursorHotSpotY();
[DllImport(dllName)]
public static extern int SetTexturePtr(int id, IntPtr ptr);
[DllImport(dllName)]
public static extern IntPtr GetSharedTextureHandle(int id);
[DllImport(dllName)]
public static extern int GetMoveRectCount(int id);
[DllImport(dllName, EntryPoint = "GetMoveRects")]
private static extern IntPtr GetMoveRects_Internal(int id);
[DllImport(dllName)]
public static extern int GetDirtyRectCount(int id);
[DllImport(dllName, EntryPoint = "GetDirtyRects")]
private static extern IntPtr GetDirtyRects_Internal(int id);
[DllImport(dllName, EntryPoint = "GetPixels")]
private static extern bool GetPixels_Internal(int id, IntPtr ptr, int x, int y, int width, int height);
[DllImport(dllName)]
public static extern IntPtr GetBuffer(int id);
[DllImport(dllName)]
public static extern bool HasBeenUpdated(int id);
[DllImport(dllName)]
public static extern bool UseGetPixels(int id, bool use);
[DllImport(dllName)]
public static extern void SetFrameRate(uint frameRate);
public static string GetName(int id)
{
var buf = new StringBuilder(32);
GetName(id, buf, buf.Capacity);
return buf.ToString();
}
public static DXGI_OUTDUPL_MOVE_RECT[] GetMoveRects(int id)
{
var count = GetMoveRectCount(id);
var rects = new DXGI_OUTDUPL_MOVE_RECT[count];
var ptr = GetMoveRects_Internal(id);
var size = Marshal.SizeOf(typeof(DXGI_OUTDUPL_MOVE_RECT));
for (int i = 0; i < count; ++i) {
var data = new IntPtr(ptr.ToInt64() + size * i);
rects[i] = (DXGI_OUTDUPL_MOVE_RECT)Marshal.PtrToStructure(data, typeof(DXGI_OUTDUPL_MOVE_RECT));
}
return rects;
}
public static RECT[] GetDirtyRects(int id)
{
var count = GetDirtyRectCount(id);
var rects = new RECT[count];
var ptr = GetDirtyRects_Internal(id);
var size = Marshal.SizeOf(typeof(RECT));
for (int i = 0; i < count; ++i) {
var data = new IntPtr(ptr.ToInt64() + size * i);
rects[i] = (RECT)Marshal.PtrToStructure(data, typeof(RECT));
}
return rects;
}
public static Color32[] GetPixels(int id, int x, int y, int width, int height)
{
var color = new Color32[width * height];
GetPixels(id, color, x, y, width, height);
return color;
}
public static bool GetPixels(int id, Color32[] colors, int x, int y, int width, int height)
{
if (colors.Length < width * height) {
Debug.LogErrorFormat("colors is small.", id, x, y, width, height);
return false;
}
var handle = GCHandle.Alloc(colors, GCHandleType.Pinned);
var ptr = handle.AddrOfPinnedObject();
if (!GetPixels_Internal(id, ptr, x, y, width, height)) {
Debug.LogErrorFormat("GetPixels({0}, {1}, {2}, {3}, {4}) failed.", id, x, y, width, height);
return false;
}
handle.Free();
return true;
}
public static Color32 GetPixel(int id, int x, int y)
{
return GetPixels(id, x, y, 1, 1)[0];
}
}
}