Files
FlaxEngine/Source/Tools/Flax.Build/Utilities/WinAPI.cs
2024-02-19 14:59:02 +01:00

174 lines
6.3 KiB
C#

// Copyright (c) 2012-2023 Wojciech Figat. All rights reserved.
using System;
using System.Runtime.InteropServices;
namespace Flax.Build
{
static class WinAPI
{
public static class dbghelp
{
[DllImport("dbghelp.dll", SetLastError = true, CharSet = CharSet.Unicode)]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool SymInitialize(IntPtr hProcess, string UserSearchPath, [MarshalAs(UnmanagedType.Bool)] bool fInvadeProcess);
[DllImport("dbghelp.dll", SetLastError = true, CharSet = CharSet.Unicode)]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool SymCleanup(IntPtr hProcess);
[DllImport("dbghelp.dll", SetLastError = true, CharSet = CharSet.Unicode)]
public static extern ulong SymLoadModuleEx(IntPtr hProcess, IntPtr hFile, string ImageName, string ModuleName, long BaseOfDll, int DllSize, IntPtr Data, int Flags);
[DllImport("dbghelp.dll", SetLastError = true, CharSet = CharSet.Unicode)]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool SymEnumerateSymbols64(IntPtr hProcess, ulong BaseOfDll, SymEnumerateSymbolsProc64 EnumSymbolsCallback, IntPtr UserContext);
public delegate bool SymEnumerateSymbolsProc64(string SymbolName, ulong SymbolAddress, uint SymbolSize, IntPtr UserContext);
}
public static class kernel32
{
[DllImport("kernel32.dll", SetLastError = true)]
public static extern IntPtr GlobalLock(IntPtr hMem);
[DllImport("kernel32.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool GlobalUnlock(IntPtr hMem);
}
public static class user32
{
[DllImport("user32.dll")]
public static extern bool EmptyClipboard();
[DllImport("user32.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool OpenClipboard(IntPtr hWndNewOwner);
[DllImport("user32.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool CloseClipboard();
[DllImport("user32.dll", SetLastError = true)]
public static extern IntPtr SetClipboardData(uint uFormat, IntPtr data);
[DllImport("user32.dll")]
public static extern int MessageBoxA(IntPtr hWnd, string lpText, string lpCaption, uint uType);
}
// https://github.com/CopyText/TextCopy/blob/main/src/TextCopy/WindowsClipboard.cs
public static void SetClipboard(string text)
{
user32.OpenClipboard(IntPtr.Zero);
user32.EmptyClipboard();
IntPtr hGlobal = default;
try
{
var bytes = (text.Length + 1) * 2;
hGlobal = Marshal.AllocHGlobal(bytes);
var target = kernel32.GlobalLock(hGlobal);
try
{
Marshal.Copy(text.ToCharArray(), 0, target, text.Length);
}
finally
{
kernel32.GlobalUnlock(target);
}
user32.SetClipboardData(13, hGlobal);
hGlobal = default;
}
finally
{
if (hGlobal != default)
{
Marshal.FreeHGlobal(hGlobal);
}
user32.CloseClipboard();
}
}
// https://gist.github.com/nathan130200/53dec19cdcd895281fb568ec63e1275b
public static class MessageBox
{
public enum Buttons
{
AbortRetryIgnore = 0x00000002,
CancelTryIgnore = 0x00000006,
Help = 0x00004000,
Ok = 0x00000000,
OkCancel = 0x00000001,
RetryCancel = 0x00000005,
YesNo = 0x00000004,
YesNoCancel = 0x00000003,
}
public enum Result
{
Abort = 3,
Cancel = 2,
Continue = 11,
Ignore = 5,
No = 7,
Ok = 1,
Retry = 10,
Yes = 6,
}
public enum DefaultButton : uint
{
Button1 = 0x00000000,
Button2 = 0x00000100,
Button3 = 0x00000200,
Button4 = 0x00000300,
}
public enum Modal : uint
{
Application = 0x00000000,
System = 0x00001000,
Task = 0x00002000
}
public enum Icon : uint
{
Warning = 0x00000030,
Information = 0x00000040,
Question = 0x00000020,
Error = 0x00000010
}
public static Result Show(string text)
{
return (Result)user32.MessageBoxA(IntPtr.Zero, text, "\0", (uint)Buttons.Ok);
}
public static Result Show(string text, string caption)
{
return (Result)user32.MessageBoxA(IntPtr.Zero, text, caption, (uint)Buttons.Ok);
}
public static Result Show(string text, string caption, Buttons buttons)
{
return (Result)user32.MessageBoxA(IntPtr.Zero, text, caption, (uint)buttons);
}
public static Result Show(string text, string caption, Buttons buttons, Icon icon)
{
return (Result)user32.MessageBoxA(IntPtr.Zero, text, caption, ((uint)buttons) | ((uint)icon));
}
public static Result Show(string text, string caption, Buttons buttons, Icon icon, DefaultButton button)
{
return (Result)user32.MessageBoxA(IntPtr.Zero, text, caption, ((uint)buttons) | ((uint)icon) | ((uint)button));
}
public static Result Show(string text, string caption, Buttons buttons, Icon icon, DefaultButton button, Modal modal)
{
return (Result)user32.MessageBoxA(IntPtr.Zero, text, caption, ((uint)buttons) | ((uint)icon) | ((uint)button) | ((uint)modal));
}
}
}
}