/ src / Ryujinx / UI / Helpers / Win32NativeInterop.cs
Win32NativeInterop.cs
  1  using System;
  2  using System.Diagnostics.CodeAnalysis;
  3  using System.Runtime.InteropServices;
  4  using System.Runtime.Versioning;
  5  
  6  namespace Ryujinx.Ava.UI.Helpers
  7  {
  8      [SupportedOSPlatform("windows")]
  9      internal partial class Win32NativeInterop
 10      {
 11          internal const int GWLP_WNDPROC = -4;
 12  
 13          [Flags]
 14          public enum ClassStyles : uint
 15          {
 16              CsClassdc = 0x40,
 17              CsOwndc = 0x20,
 18          }
 19  
 20          [Flags]
 21          public enum WindowStyles : uint
 22          {
 23              WsChild = 0x40000000,
 24          }
 25  
 26          public enum Cursors : uint
 27          {
 28              IdcArrow = 32512,
 29          }
 30  
 31          [SuppressMessage("Design", "CA1069: Enums values should not be duplicated")]
 32          public enum WindowsMessages : uint
 33          {
 34              NcHitTest = 0x0084,
 35          }
 36  
 37          [UnmanagedFunctionPointer(CallingConvention.Winapi)]
 38          internal delegate IntPtr WindowProc(IntPtr hWnd, WindowsMessages msg, IntPtr wParam, IntPtr lParam);
 39  
 40          [StructLayout(LayoutKind.Sequential)]
 41          public struct WndClassEx
 42          {
 43              public int cbSize;
 44              public ClassStyles style;
 45              public IntPtr lpfnWndProc; // not WndProc
 46              public int cbClsExtra;
 47              public int cbWndExtra;
 48              public IntPtr hInstance;
 49              public IntPtr hIcon;
 50              public IntPtr hCursor;
 51              public IntPtr hbrBackground;
 52              public IntPtr lpszMenuName;
 53              public IntPtr lpszClassName;
 54              public IntPtr hIconSm;
 55  
 56              public WndClassEx()
 57              {
 58                  cbSize = Marshal.SizeOf<WndClassEx>();
 59              }
 60          }
 61  
 62          public static IntPtr CreateEmptyCursor()
 63          {
 64              return CreateCursor(IntPtr.Zero, 0, 0, 1, 1, new byte[] { 0xFF }, new byte[] { 0x00 });
 65          }
 66  
 67          public static IntPtr CreateArrowCursor()
 68          {
 69              return LoadCursor(IntPtr.Zero, (IntPtr)Cursors.IdcArrow);
 70          }
 71  
 72          [LibraryImport("user32.dll")]
 73          public static partial IntPtr SetCursor(IntPtr handle);
 74  
 75          [LibraryImport("user32.dll")]
 76          public static partial IntPtr CreateCursor(IntPtr hInst, int xHotSpot, int yHotSpot, int nWidth, int nHeight, [In] byte[] pvAndPlane, [In] byte[] pvXorPlane);
 77  
 78          [LibraryImport("user32.dll", SetLastError = true, EntryPoint = "RegisterClassExW")]
 79          public static partial ushort RegisterClassEx(ref WndClassEx param);
 80  
 81          [LibraryImport("user32.dll", SetLastError = true, EntryPoint = "UnregisterClassW")]
 82          public static partial short UnregisterClass([MarshalAs(UnmanagedType.LPWStr)] string lpClassName, IntPtr instance);
 83  
 84          [LibraryImport("user32.dll", EntryPoint = "DefWindowProcW")]
 85          public static partial IntPtr DefWindowProc(IntPtr hWnd, WindowsMessages msg, IntPtr wParam, IntPtr lParam);
 86  
 87          [LibraryImport("kernel32.dll", EntryPoint = "GetModuleHandleA")]
 88          public static partial IntPtr GetModuleHandle([MarshalAs(UnmanagedType.LPStr)] string lpModuleName);
 89  
 90          [LibraryImport("user32.dll", SetLastError = true)]
 91          [return: MarshalAs(UnmanagedType.Bool)]
 92          public static partial bool DestroyWindow(IntPtr hwnd);
 93  
 94          [LibraryImport("user32.dll", SetLastError = true, EntryPoint = "LoadCursorA")]
 95          public static partial IntPtr LoadCursor(IntPtr hInstance, IntPtr lpCursorName);
 96  
 97          [LibraryImport("user32.dll", SetLastError = true, EntryPoint = "CreateWindowExW")]
 98          public static partial IntPtr CreateWindowEx(
 99             uint dwExStyle,
100             [MarshalAs(UnmanagedType.LPWStr)] string lpClassName,
101             [MarshalAs(UnmanagedType.LPWStr)] string lpWindowName,
102             WindowStyles dwStyle,
103             int x,
104             int y,
105             int nWidth,
106             int nHeight,
107             IntPtr hWndParent,
108             IntPtr hMenu,
109             IntPtr hInstance,
110             IntPtr lpParam);
111  
112          [LibraryImport("user32.dll", SetLastError = true)]
113          public static partial IntPtr SetWindowLongPtrW(IntPtr hWnd, int nIndex, IntPtr value);
114      }
115  }