ContextMenu (windows only)

This commit is contained in:
2022-05-28 21:59:43 +02:00
parent 6e7742a08a
commit fbf36b890b
12 changed files with 508 additions and 30 deletions

View File

@@ -0,0 +1,71 @@
using System.Drawing;
using System.Runtime.InteropServices;
using System.Text;
namespace FileTime.GuiApp.Helper;
public static class WindowsNativeMethods
{
[DllImport("kernel32.dll", CharSet = CharSet.Unicode, SetLastError = true, BestFitMapping = false, ThrowOnUnmappableChar = true)]
internal static extern IntPtr LoadLibrary(string lpLibFileName);
[DllImport("user32.dll", CharSet = CharSet.Unicode, SetLastError = true, BestFitMapping = false, ThrowOnUnmappableChar = true)]
internal static extern int LoadString(IntPtr hInstance, uint wID, StringBuilder lpBuffer, int nBufferMax);
[DllImport("user32.dll")]
public static extern IntPtr LoadIcon(IntPtr hInstance, IntPtr lpIconName);
[DllImport("kernel32.dll")]
public static extern int FreeLibrary(IntPtr hLibModule);
[DllImport("shell32.dll")]
public static extern IntPtr ExtractAssociatedIcon(IntPtr hInst, StringBuilder lpIconPath, out ushort lpiIcon);
}
public static class NativeMethodHelpers
{
public static string GetStringResource(string fileName, uint resourceId)
{
IntPtr? handle = null;
try
{
handle = WindowsNativeMethods.LoadLibrary(fileName);
StringBuilder buffer = new(8192); //Buffer for output from LoadString()
int length = WindowsNativeMethods.LoadString(handle.Value, resourceId, buffer, buffer.Capacity);
return buffer.ToString(0, length); //Return the part of the buffer that was used.
}
finally
{
if (handle is IntPtr validHandle)
{
WindowsNativeMethods.FreeLibrary(validHandle);
}
}
}
public static Icon GetIconResource(string fileName, uint resourceId)
{
IntPtr? handle = null;
try
{
handle = WindowsNativeMethods.LoadLibrary(fileName);
IntPtr handle2 = WindowsNativeMethods.LoadIcon(handle.Value, new IntPtr(resourceId));
return Icon.FromHandle(handle2);
}
finally
{
if (handle is IntPtr validHandle)
{
WindowsNativeMethods.FreeLibrary(validHandle);
}
}
}
/*public static Icon GetAssociatedIcon()
{
ushort uicon;
StringBuilder strB = new StringBuilder(fileName);
IntPtr handle = WindowsNativeMethods.ExtractAssociatedIcon(this.Handle, strB, out uicon);
return Icon.FromHandle(handle);
}*/
}