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 }