From be223909d3a04ac965597c21806c10852a62c5ee Mon Sep 17 00:00:00 2001 From: Lightczx <1686188646@qq.com> Date: Thu, 9 May 2024 17:32:21 +0800 Subject: [PATCH] shell --- .../Snap.Hutao/Win32/Foundation/HANDLE.cs | 2 + .../Snap.Hutao/Win32/Foundation/HINSTANCE.cs | 11 ++++++ .../Snap.Hutao/Win32/Foundation/HMODULE.cs | 2 + .../Snap.Hutao/Win32/Graphics/Gdi/HDC.cs | 1 + .../Snap.Hutao/Win32/Graphics/Gdi/HMONITOR.cs | 1 + .../Snap.Hutao/Win32/Registry/HKEY.cs | 2 + src/Snap.Hutao/Snap.Hutao/Win32/Shell32.cs | 13 +++++++ .../Snap.Hutao/Win32/System/WinRT/HSTRING.cs | 1 + .../Win32/UI/Shell/NOTIFYICONDATAW.cs | 38 +++++++++++++++++++ .../Win32/UI/Shell/NOTIFY_ICON_DATA_FLAGS.cs | 17 +++++++++ .../UI/Shell/NOTIFY_ICON_INFOTIP_FLAGS.cs | 18 +++++++++ .../Win32/UI/Shell/NOTIFY_ICON_MESSAGE.cs | 13 +++++++ .../Win32/UI/Shell/NOTIFY_ICON_STATE.cs | 11 ++++++ .../Win32/UI/WindowsAndMessaging/HBRUSH.cs | 11 ++++++ .../Win32/UI/WindowsAndMessaging/HCURSOR.cs | 11 ++++++ .../Win32/UI/WindowsAndMessaging/HICON.cs | 11 ++++++ .../Win32/UI/WindowsAndMessaging/WNDCLASSW.cs | 24 ++++++++++++ .../UI/WindowsAndMessaging/WNDCLASS_STYLES.cs | 22 +++++++++++ .../Win32/UI/WindowsAndMessaging/WNDPROC.cs | 10 +++++ src/Snap.Hutao/Snap.Hutao/Win32/User32.cs | 12 ++++++ 20 files changed, 231 insertions(+) create mode 100644 src/Snap.Hutao/Snap.Hutao/Win32/Foundation/HINSTANCE.cs create mode 100644 src/Snap.Hutao/Snap.Hutao/Win32/UI/Shell/NOTIFYICONDATAW.cs create mode 100644 src/Snap.Hutao/Snap.Hutao/Win32/UI/Shell/NOTIFY_ICON_DATA_FLAGS.cs create mode 100644 src/Snap.Hutao/Snap.Hutao/Win32/UI/Shell/NOTIFY_ICON_INFOTIP_FLAGS.cs create mode 100644 src/Snap.Hutao/Snap.Hutao/Win32/UI/Shell/NOTIFY_ICON_MESSAGE.cs create mode 100644 src/Snap.Hutao/Snap.Hutao/Win32/UI/Shell/NOTIFY_ICON_STATE.cs create mode 100644 src/Snap.Hutao/Snap.Hutao/Win32/UI/WindowsAndMessaging/HBRUSH.cs create mode 100644 src/Snap.Hutao/Snap.Hutao/Win32/UI/WindowsAndMessaging/HCURSOR.cs create mode 100644 src/Snap.Hutao/Snap.Hutao/Win32/UI/WindowsAndMessaging/HICON.cs create mode 100644 src/Snap.Hutao/Snap.Hutao/Win32/UI/WindowsAndMessaging/WNDCLASSW.cs create mode 100644 src/Snap.Hutao/Snap.Hutao/Win32/UI/WindowsAndMessaging/WNDCLASS_STYLES.cs create mode 100644 src/Snap.Hutao/Snap.Hutao/Win32/UI/WindowsAndMessaging/WNDPROC.cs diff --git a/src/Snap.Hutao/Snap.Hutao/Win32/Foundation/HANDLE.cs b/src/Snap.Hutao/Snap.Hutao/Win32/Foundation/HANDLE.cs index 0dd00b85..60ff614a 100644 --- a/src/Snap.Hutao/Snap.Hutao/Win32/Foundation/HANDLE.cs +++ b/src/Snap.Hutao/Snap.Hutao/Win32/Foundation/HANDLE.cs @@ -3,6 +3,8 @@ namespace Snap.Hutao.Win32.Foundation; +// RAIIFree: CloseHandle +// InvalidHandleValue: -1, 0 internal readonly struct HANDLE { public readonly nint Value; diff --git a/src/Snap.Hutao/Snap.Hutao/Win32/Foundation/HINSTANCE.cs b/src/Snap.Hutao/Snap.Hutao/Win32/Foundation/HINSTANCE.cs new file mode 100644 index 00000000..b1f88795 --- /dev/null +++ b/src/Snap.Hutao/Snap.Hutao/Win32/Foundation/HINSTANCE.cs @@ -0,0 +1,11 @@ +// Copyright (c) DGP Studio. All rights reserved. +// Licensed under the MIT license. + +namespace Snap.Hutao.Win32.Foundation; + +// RAIIFree: FreeLibrary +// InvalidHandleValue: 0 +internal readonly struct HINSTANCE +{ + public readonly nint Value; +} \ No newline at end of file diff --git a/src/Snap.Hutao/Snap.Hutao/Win32/Foundation/HMODULE.cs b/src/Snap.Hutao/Snap.Hutao/Win32/Foundation/HMODULE.cs index f27d4d48..5fb3a172 100644 --- a/src/Snap.Hutao/Snap.Hutao/Win32/Foundation/HMODULE.cs +++ b/src/Snap.Hutao/Snap.Hutao/Win32/Foundation/HMODULE.cs @@ -3,6 +3,8 @@ namespace Snap.Hutao.Win32.Foundation; +// RAIIFree: FreeLibrary +// InvalidHandleValue: 0 internal readonly struct HMODULE { public readonly nint Value; diff --git a/src/Snap.Hutao/Snap.Hutao/Win32/Graphics/Gdi/HDC.cs b/src/Snap.Hutao/Snap.Hutao/Win32/Graphics/Gdi/HDC.cs index 4ba4a673..01ccd9b1 100644 --- a/src/Snap.Hutao/Snap.Hutao/Win32/Graphics/Gdi/HDC.cs +++ b/src/Snap.Hutao/Snap.Hutao/Win32/Graphics/Gdi/HDC.cs @@ -3,6 +3,7 @@ namespace Snap.Hutao.Win32.Graphics.Gdi; +// InvalidHandleValue: -1, 0 internal readonly struct HDC { public static readonly HDC NULL = 0; diff --git a/src/Snap.Hutao/Snap.Hutao/Win32/Graphics/Gdi/HMONITOR.cs b/src/Snap.Hutao/Snap.Hutao/Win32/Graphics/Gdi/HMONITOR.cs index a5b0e711..90ffa7a0 100644 --- a/src/Snap.Hutao/Snap.Hutao/Win32/Graphics/Gdi/HMONITOR.cs +++ b/src/Snap.Hutao/Snap.Hutao/Win32/Graphics/Gdi/HMONITOR.cs @@ -3,6 +3,7 @@ namespace Snap.Hutao.Win32.Graphics.Gdi; +// InvalidHandleValue: -1, 0 internal readonly struct HMONITOR { public readonly nint Value; diff --git a/src/Snap.Hutao/Snap.Hutao/Win32/Registry/HKEY.cs b/src/Snap.Hutao/Snap.Hutao/Win32/Registry/HKEY.cs index 00d35c79..c7bb03f1 100644 --- a/src/Snap.Hutao/Snap.Hutao/Win32/Registry/HKEY.cs +++ b/src/Snap.Hutao/Snap.Hutao/Win32/Registry/HKEY.cs @@ -3,6 +3,8 @@ namespace Snap.Hutao.Win32.Registry; +// RAIIFree: RegCloseKey +// InvalidHandleValue: -1, 0 [SuppressMessage("", "SA1310")] internal readonly struct HKEY { diff --git a/src/Snap.Hutao/Snap.Hutao/Win32/Shell32.cs b/src/Snap.Hutao/Snap.Hutao/Win32/Shell32.cs index d527265c..16d20e04 100644 --- a/src/Snap.Hutao/Snap.Hutao/Win32/Shell32.cs +++ b/src/Snap.Hutao/Snap.Hutao/Win32/Shell32.cs @@ -3,6 +3,7 @@ using Snap.Hutao.Win32.Foundation; using Snap.Hutao.Win32.System.Com; +using Snap.Hutao.Win32.UI.Shell; using System.Diagnostics; using System.Runtime.InteropServices; using System.Runtime.Versioning; @@ -32,4 +33,16 @@ internal static class Shell32 } } } + + [DllImport("SHELL32.dll", CallingConvention = CallingConvention.Winapi, ExactSpelling = true)] + [SupportedOSPlatform("windows5.1.2600")] + public static unsafe extern BOOL Shell_NotifyIconW(NOTIFY_ICON_MESSAGE dwMessage, NOTIFYICONDATAW* lpData); + + public static unsafe BOOL Shell_NotifyIconW(NOTIFY_ICON_MESSAGE dwMessage, ref readonly NOTIFYICONDATAW data) + { + fixed (NOTIFYICONDATAW* p = &data) + { + return Shell_NotifyIconW(dwMessage, p); + } + } } \ No newline at end of file diff --git a/src/Snap.Hutao/Snap.Hutao/Win32/System/WinRT/HSTRING.cs b/src/Snap.Hutao/Snap.Hutao/Win32/System/WinRT/HSTRING.cs index a2ca8442..ffe1afd7 100644 --- a/src/Snap.Hutao/Snap.Hutao/Win32/System/WinRT/HSTRING.cs +++ b/src/Snap.Hutao/Snap.Hutao/Win32/System/WinRT/HSTRING.cs @@ -3,6 +3,7 @@ namespace Snap.Hutao.Win32.System.WinRT; +// RAIIFree: WindowsDeleteString internal readonly struct HSTRING { public readonly nint Value; diff --git a/src/Snap.Hutao/Snap.Hutao/Win32/UI/Shell/NOTIFYICONDATAW.cs b/src/Snap.Hutao/Snap.Hutao/Win32/UI/Shell/NOTIFYICONDATAW.cs new file mode 100644 index 00000000..a2c4a305 --- /dev/null +++ b/src/Snap.Hutao/Snap.Hutao/Win32/UI/Shell/NOTIFYICONDATAW.cs @@ -0,0 +1,38 @@ +// Copyright (c) DGP Studio. All rights reserved. +// Licensed under the MIT license. + +using Snap.Hutao.Win32.Foundation; +using Snap.Hutao.Win32.UI.WindowsAndMessaging; +using System.Runtime.InteropServices; + +namespace Snap.Hutao.Win32.UI.Shell; + +[SuppressMessage("", "SA1307")] +internal struct NOTIFYICONDATAW +{ + public uint cbSize; + public HWND hWnd; + public uint uID; + public NOTIFY_ICON_DATA_FLAGS uFlags; + public uint uCallbackMessage; + public HICON hIcon; + public unsafe fixed char szTip[128]; + public NOTIFY_ICON_STATE dwState; + public NOTIFY_ICON_STATE dwStateMask; + public unsafe fixed char szInfo[256]; + public Union Anonymous; + public unsafe fixed char szInfoTitle[64]; + public NOTIFY_ICON_INFOTIP_FLAGS dwInfoFlags; + public Guid guidItem; + public HICON hBalloonIcon; + + [StructLayout(LayoutKind.Explicit)] + internal struct Union + { + [FieldOffset(0)] + public uint uTimeout; + + [FieldOffset(0)] + public uint uVersion; + } +} \ No newline at end of file diff --git a/src/Snap.Hutao/Snap.Hutao/Win32/UI/Shell/NOTIFY_ICON_DATA_FLAGS.cs b/src/Snap.Hutao/Snap.Hutao/Win32/UI/Shell/NOTIFY_ICON_DATA_FLAGS.cs new file mode 100644 index 00000000..c5935754 --- /dev/null +++ b/src/Snap.Hutao/Snap.Hutao/Win32/UI/Shell/NOTIFY_ICON_DATA_FLAGS.cs @@ -0,0 +1,17 @@ +// Copyright (c) DGP Studio. All rights reserved. +// Licensed under the MIT license. + +namespace Snap.Hutao.Win32.UI.Shell; + +[Flags] +internal enum NOTIFY_ICON_DATA_FLAGS : uint +{ + NIF_MESSAGE = 0x1U, + NIF_ICON = 0x2U, + NIF_TIP = 0x4U, + NIF_STATE = 0x8U, + NIF_INFO = 0x10U, + NIF_GUID = 0x20U, + NIF_REALTIME = 0x40U, + NIF_SHOWTIP = 0x80U, +} \ No newline at end of file diff --git a/src/Snap.Hutao/Snap.Hutao/Win32/UI/Shell/NOTIFY_ICON_INFOTIP_FLAGS.cs b/src/Snap.Hutao/Snap.Hutao/Win32/UI/Shell/NOTIFY_ICON_INFOTIP_FLAGS.cs new file mode 100644 index 00000000..f7134097 --- /dev/null +++ b/src/Snap.Hutao/Snap.Hutao/Win32/UI/Shell/NOTIFY_ICON_INFOTIP_FLAGS.cs @@ -0,0 +1,18 @@ +// Copyright (c) DGP Studio. All rights reserved. +// Licensed under the MIT license. + +namespace Snap.Hutao.Win32.UI.Shell; + +[Flags] +internal enum NOTIFY_ICON_INFOTIP_FLAGS : uint +{ + NIIF_NONE = 0U, + NIIF_INFO = 1U, + NIIF_WARNING = 2U, + NIIF_ERROR = 3U, + NIIF_USER = 4U, + NIIF_ICON_MASK = 0xFU, + NIIF_NOSOUND = 0x10U, + NIIF_LARGE_ICON = 0x20U, + NIIF_RESPECT_QUIET_TIME = 0x80U, +} \ No newline at end of file diff --git a/src/Snap.Hutao/Snap.Hutao/Win32/UI/Shell/NOTIFY_ICON_MESSAGE.cs b/src/Snap.Hutao/Snap.Hutao/Win32/UI/Shell/NOTIFY_ICON_MESSAGE.cs new file mode 100644 index 00000000..8d69268c --- /dev/null +++ b/src/Snap.Hutao/Snap.Hutao/Win32/UI/Shell/NOTIFY_ICON_MESSAGE.cs @@ -0,0 +1,13 @@ +// Copyright (c) DGP Studio. All rights reserved. +// Licensed under the MIT license. + +namespace Snap.Hutao.Win32.UI.Shell; + +internal enum NOTIFY_ICON_MESSAGE : uint +{ + NIM_ADD = 0U, + NIM_MODIFY = 1U, + NIM_DELETE = 2U, + NIM_SETFOCUS = 3U, + NIM_SETVERSION = 4U, +} \ No newline at end of file diff --git a/src/Snap.Hutao/Snap.Hutao/Win32/UI/Shell/NOTIFY_ICON_STATE.cs b/src/Snap.Hutao/Snap.Hutao/Win32/UI/Shell/NOTIFY_ICON_STATE.cs new file mode 100644 index 00000000..36b4d629 --- /dev/null +++ b/src/Snap.Hutao/Snap.Hutao/Win32/UI/Shell/NOTIFY_ICON_STATE.cs @@ -0,0 +1,11 @@ +// Copyright (c) DGP Studio. All rights reserved. +// Licensed under the MIT license. + +namespace Snap.Hutao.Win32.UI.Shell; + +[Flags] +internal enum NOTIFY_ICON_STATE : uint +{ + NIS_HIDDEN = 1U, + NIS_SHAREDICON = 2U, +} \ No newline at end of file diff --git a/src/Snap.Hutao/Snap.Hutao/Win32/UI/WindowsAndMessaging/HBRUSH.cs b/src/Snap.Hutao/Snap.Hutao/Win32/UI/WindowsAndMessaging/HBRUSH.cs new file mode 100644 index 00000000..67d1338b --- /dev/null +++ b/src/Snap.Hutao/Snap.Hutao/Win32/UI/WindowsAndMessaging/HBRUSH.cs @@ -0,0 +1,11 @@ +// Copyright (c) DGP Studio. All rights reserved. +// Licensed under the MIT license. + +namespace Snap.Hutao.Win32.UI.WindowsAndMessaging; + +// RAIIFree: DeleteObject +// InvalidHandleValue: -1, 0 +internal readonly struct HBRUSH +{ + public readonly nint Value; +} \ No newline at end of file diff --git a/src/Snap.Hutao/Snap.Hutao/Win32/UI/WindowsAndMessaging/HCURSOR.cs b/src/Snap.Hutao/Snap.Hutao/Win32/UI/WindowsAndMessaging/HCURSOR.cs new file mode 100644 index 00000000..f7584d37 --- /dev/null +++ b/src/Snap.Hutao/Snap.Hutao/Win32/UI/WindowsAndMessaging/HCURSOR.cs @@ -0,0 +1,11 @@ +// Copyright (c) DGP Studio. All rights reserved. +// Licensed under the MIT license. + +namespace Snap.Hutao.Win32.UI.WindowsAndMessaging; + +// RAIIFree: DestroyCursor +// InvalidHandleValue: -1, 0 +internal readonly struct HCURSOR +{ + public readonly nint Value; +} \ No newline at end of file diff --git a/src/Snap.Hutao/Snap.Hutao/Win32/UI/WindowsAndMessaging/HICON.cs b/src/Snap.Hutao/Snap.Hutao/Win32/UI/WindowsAndMessaging/HICON.cs new file mode 100644 index 00000000..bf04663f --- /dev/null +++ b/src/Snap.Hutao/Snap.Hutao/Win32/UI/WindowsAndMessaging/HICON.cs @@ -0,0 +1,11 @@ +// Copyright (c) DGP Studio. All rights reserved. +// Licensed under the MIT license. + +namespace Snap.Hutao.Win32.UI.WindowsAndMessaging; + +// RAIIFree: DestroyIcon +// InvalidHandleValue: -1, 0 +internal readonly struct HICON +{ + public readonly nint Value; +} \ No newline at end of file diff --git a/src/Snap.Hutao/Snap.Hutao/Win32/UI/WindowsAndMessaging/WNDCLASSW.cs b/src/Snap.Hutao/Snap.Hutao/Win32/UI/WindowsAndMessaging/WNDCLASSW.cs new file mode 100644 index 00000000..c0a7b863 --- /dev/null +++ b/src/Snap.Hutao/Snap.Hutao/Win32/UI/WindowsAndMessaging/WNDCLASSW.cs @@ -0,0 +1,24 @@ +// Copyright (c) DGP Studio. All rights reserved. +// Licensed under the MIT license. + +using Snap.Hutao.Win32.Foundation; +using System.Runtime.InteropServices; + +namespace Snap.Hutao.Win32.UI.WindowsAndMessaging; + +[SuppressMessage("", "SA1307")] +internal struct WNDCLASSW +{ + public WNDCLASS_STYLES style; + + [MarshalAs(UnmanagedType.FunctionPtr)] + public WNDPROC lpfnWndProc; + public int cbClsExtra; + public int cbWndExtra; + public HINSTANCE hInstance; + public HICON hIcon; + public HCURSOR hCursor; + public HBRUSH hbrBackground; + public PCWSTR lpszMenuName; + public PCWSTR lpszClassName; +} \ No newline at end of file diff --git a/src/Snap.Hutao/Snap.Hutao/Win32/UI/WindowsAndMessaging/WNDCLASS_STYLES.cs b/src/Snap.Hutao/Snap.Hutao/Win32/UI/WindowsAndMessaging/WNDCLASS_STYLES.cs new file mode 100644 index 00000000..decaa11b --- /dev/null +++ b/src/Snap.Hutao/Snap.Hutao/Win32/UI/WindowsAndMessaging/WNDCLASS_STYLES.cs @@ -0,0 +1,22 @@ +// Copyright (c) DGP Studio. All rights reserved. +// Licensed under the MIT license. + +namespace Snap.Hutao.Win32.UI.WindowsAndMessaging; + +[Flags] +internal enum WNDCLASS_STYLES : uint +{ + CS_VREDRAW = 0x1U, + CS_HREDRAW = 0x2U, + CS_DBLCLKS = 0x8U, + CS_OWNDC = 0x20U, + CS_CLASSDC = 0x40U, + CS_PARENTDC = 0x80U, + CS_NOCLOSE = 0x200U, + CS_SAVEBITS = 0x800U, + CS_BYTEALIGNCLIENT = 0x1000U, + CS_BYTEALIGNWINDOW = 0x2000U, + CS_GLOBALCLASS = 0x4000U, + CS_IME = 0x10000U, + CS_DROPSHADOW = 0x20000U, +} \ No newline at end of file diff --git a/src/Snap.Hutao/Snap.Hutao/Win32/UI/WindowsAndMessaging/WNDPROC.cs b/src/Snap.Hutao/Snap.Hutao/Win32/UI/WindowsAndMessaging/WNDPROC.cs new file mode 100644 index 00000000..5a696bbe --- /dev/null +++ b/src/Snap.Hutao/Snap.Hutao/Win32/UI/WindowsAndMessaging/WNDPROC.cs @@ -0,0 +1,10 @@ +// Copyright (c) DGP Studio. All rights reserved. +// Licensed under the MIT license. + +using Snap.Hutao.Win32.Foundation; +using System.Runtime.InteropServices; + +namespace Snap.Hutao.Win32.UI.WindowsAndMessaging; + +[UnmanagedFunctionPointer(CallingConvention.Winapi)] +internal delegate LRESULT WNDPROC(HWND param0, uint param1, WPARAM param2, LPARAM param3); \ No newline at end of file diff --git a/src/Snap.Hutao/Snap.Hutao/Win32/User32.cs b/src/Snap.Hutao/Snap.Hutao/Win32/User32.cs index 5b10a02e..a74f1ed8 100644 --- a/src/Snap.Hutao/Snap.Hutao/Win32/User32.cs +++ b/src/Snap.Hutao/Snap.Hutao/Win32/User32.cs @@ -77,6 +77,18 @@ internal static class User32 } } + [DllImport("USER32.dll", CallingConvention = CallingConvention.Winapi, ExactSpelling = true, SetLastError = true)] + [SupportedOSPlatform("windows5.0")] + public static unsafe extern ushort RegisterClassW(WNDCLASSW* lpWndClass); + + public static unsafe ushort RegisterClassW(ref readonly WNDCLASSW lpWndClass) + { + fixed (WNDCLASSW* pWndClass = &lpWndClass) + { + return RegisterClassW(pWndClass); + } + } + [DllImport("USER32.dll", CallingConvention = CallingConvention.Winapi, ExactSpelling = true)] [SupportedOSPlatform("windows6.0.6000")] public static extern BOOL RegisterHotKey([AllowNull] HWND hWnd, int id, HOT_KEY_MODIFIERS fsModifiers, uint vk);