Fix tray icon behaviour

This commit is contained in:
Noraa Junker
2025-11-16 23:21:52 +01:00
parent 77a8555fd4
commit 6fea4d9c5d
4 changed files with 51 additions and 18 deletions

View File

@@ -18,9 +18,9 @@ namespace RunnerV2.Helpers
{
internal static class SettingsHelper
{
private static readonly SettingsUtils _settingsUtils = new();
private static Process? _process;
private static TwoWayPipeMessageIPCManaged? _ipc;
private static SettingsUtils _settingsUtils = new();
public static void OpenSettingsWindow(bool showOobeWindow = false, bool showScoobeWindow = false, bool showFlyout = false, Point? flyoutPosition = null, string? additionalArguments = null)
{

View File

@@ -32,6 +32,18 @@ namespace RunnerV2.Helpers
Shell_NotifyIcon(NIMADD, ref notifyicondata);
}
internal static void StopTrayIcon()
{
NOTIFYICONDATA notifyicondata = new()
{
CbSize = (uint)Marshal.SizeOf<NOTIFYICONDATA>(),
HWnd = Runner.RunnerHwnd,
UId = 1,
};
Shell_NotifyIcon(NIMDELETE, ref notifyicondata);
}
private enum TrayButton : uint
{
Settings = 1,

View File

@@ -63,6 +63,7 @@ namespace RunnerV2
internal static partial bool EnableMenuItem(IntPtr hMenu, uint uIDEnableItem, uint uEnable);
internal const uint NIMADD = 0x00000000;
internal const uint NIMDELETE = 0x00000002;
internal struct NOTIFYICONDATA
{
@@ -130,6 +131,8 @@ namespace RunnerV2
COMMAND = 0x0111,
HOTKEY = 0x0312,
ICON_NOTIFY = 0x0800,
WINDOWPOSCHANGING = 0x0046,
DESTROY = 0x0002,
}
[DllImport("user32.dll")]
@@ -138,6 +141,9 @@ namespace RunnerV2
[LibraryImport("user32.dll", SetLastError = false)]
internal static partial IntPtr DefWindowProcW(IntPtr hWnd, uint msg, IntPtr wParam, IntPtr lParam);
[LibraryImport("user32.dll", SetLastError = true)]
internal static partial uint RegisterWindowMessageW([MarshalAs(UnmanagedType.LPWStr)] string lpString);
[LibraryImport("user32.dll", SetLastError = true, StringMarshalling = StringMarshalling.Utf16)]
internal static partial nint CreateWindowExW(
uint dwExStyle,

View File

@@ -68,11 +68,14 @@ namespace RunnerV2
}
afterInitializationAction();
MessageLoop();
return true;
}
private static readonly uint _taskbarCreatedMessage = RegisterWindowMessageW("TaskbarCreated");
private static void MessageLoop()
{
while (true)
@@ -82,20 +85,7 @@ namespace RunnerV2
TranslateMessage(ref msg);
DispatchMessageW(ref msg);
switch (msg.Message)
{
case (uint)WindowMessages.HOTKEY:
HotkeyManager.ProcessHotkey(msg.WParam);
break;
case (uint)WindowMessages.ICON_NOTIFY:
TrayIconManager.ProcessTrayIconMessage(msg.LParam);
break;
case (uint)WindowMessages.COMMAND:
TrayIconManager.ProcessTrayMenuCommand(msg.WParam);
break;
default:
break;
}
HandleMessage(msg.HWnd, msg.Message, (nint)msg.WParam, (nint)msg.LParam);
}
}
}
@@ -172,7 +162,7 @@ namespace RunnerV2
HInstance = hInstance,
LpszClassName = TrayWindowClassName,
Style = CSHREDRAW | CSVREDRAW,
LpfnWndProc = TrayIconWindowProc,
LpfnWndProc = HandleMessage,
HIcon = hIcon,
HbrBackground = IntPtr.Zero,
LpszMenuName = string.Empty,
@@ -203,9 +193,34 @@ namespace RunnerV2
}
}
private static IntPtr TrayIconWindowProc(IntPtr hWnd, uint msg, IntPtr wParam, IntPtr lParam)
private static IntPtr HandleMessage(IntPtr hWnd, uint msg, IntPtr wParam, IntPtr lParam)
{
TrayIconManager.ProcessTrayIconMessage(lParam.ToInt64());
switch (msg)
{
case (uint)WindowMessages.HOTKEY:
HotkeyManager.ProcessHotkey((nuint)wParam);
break;
case (uint)WindowMessages.ICON_NOTIFY:
TrayIconManager.ProcessTrayIconMessage(lParam);
break;
case (uint)WindowMessages.COMMAND:
TrayIconManager.ProcessTrayMenuCommand((nuint)wParam);
break;
case (uint)WindowMessages.WINDOWPOSCHANGING:
TrayIconManager.StartTrayIcon();
break;
case (uint)WindowMessages.DESTROY:
TrayIconManager.StopTrayIcon();
break;
default:
if (msg == _taskbarCreatedMessage)
{
TrayIconManager.StartTrayIcon();
}
break;
}
return DefWindowProcW(hWnd, msg, wParam, lParam);
}
}