Skip to content

Commit 6fea4d9

Browse files
committed
Fix tray icon behaviour
1 parent 77a8555 commit 6fea4d9

File tree

4 files changed

+51
-18
lines changed

4 files changed

+51
-18
lines changed

src/RunnerV2/RunnerV2/Helpers/SettingsHelper.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,9 @@ namespace RunnerV2.Helpers
1818
{
1919
internal static class SettingsHelper
2020
{
21+
private static readonly SettingsUtils _settingsUtils = new();
2122
private static Process? _process;
2223
private static TwoWayPipeMessageIPCManaged? _ipc;
23-
private static SettingsUtils _settingsUtils = new();
2424

2525
public static void OpenSettingsWindow(bool showOobeWindow = false, bool showScoobeWindow = false, bool showFlyout = false, Point? flyoutPosition = null, string? additionalArguments = null)
2626
{

src/RunnerV2/RunnerV2/Helpers/TrayIconManager.cs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,18 @@ internal static void StartTrayIcon()
3232
Shell_NotifyIcon(NIMADD, ref notifyicondata);
3333
}
3434

35+
internal static void StopTrayIcon()
36+
{
37+
NOTIFYICONDATA notifyicondata = new()
38+
{
39+
CbSize = (uint)Marshal.SizeOf<NOTIFYICONDATA>(),
40+
HWnd = Runner.RunnerHwnd,
41+
UId = 1,
42+
};
43+
44+
Shell_NotifyIcon(NIMDELETE, ref notifyicondata);
45+
}
46+
3547
private enum TrayButton : uint
3648
{
3749
Settings = 1,

src/RunnerV2/RunnerV2/NativeMethods.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ internal struct TokenElevation
6363
internal static partial bool EnableMenuItem(IntPtr hMenu, uint uIDEnableItem, uint uEnable);
6464

6565
internal const uint NIMADD = 0x00000000;
66+
internal const uint NIMDELETE = 0x00000002;
6667

6768
internal struct NOTIFYICONDATA
6869
{
@@ -130,6 +131,8 @@ internal enum WindowMessages : uint
130131
COMMAND = 0x0111,
131132
HOTKEY = 0x0312,
132133
ICON_NOTIFY = 0x0800,
134+
WINDOWPOSCHANGING = 0x0046,
135+
DESTROY = 0x0002,
133136
}
134137

135138
[DllImport("user32.dll")]
@@ -138,6 +141,9 @@ internal enum WindowMessages : uint
138141
[LibraryImport("user32.dll", SetLastError = false)]
139142
internal static partial IntPtr DefWindowProcW(IntPtr hWnd, uint msg, IntPtr wParam, IntPtr lParam);
140143

144+
[LibraryImport("user32.dll", SetLastError = true)]
145+
internal static partial uint RegisterWindowMessageW([MarshalAs(UnmanagedType.LPWStr)] string lpString);
146+
141147
[LibraryImport("user32.dll", SetLastError = true, StringMarshalling = StringMarshalling.Utf16)]
142148
internal static partial nint CreateWindowExW(
143149
uint dwExStyle,

src/RunnerV2/RunnerV2/Runner.cs

Lines changed: 32 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -68,11 +68,14 @@ internal static bool Run(Action afterInitializationAction)
6868
}
6969

7070
afterInitializationAction();
71+
7172
MessageLoop();
7273

7374
return true;
7475
}
7576

77+
private static readonly uint _taskbarCreatedMessage = RegisterWindowMessageW("TaskbarCreated");
78+
7679
private static void MessageLoop()
7780
{
7881
while (true)
@@ -82,20 +85,7 @@ private static void MessageLoop()
8285
TranslateMessage(ref msg);
8386
DispatchMessageW(ref msg);
8487

85-
switch (msg.Message)
86-
{
87-
case (uint)WindowMessages.HOTKEY:
88-
HotkeyManager.ProcessHotkey(msg.WParam);
89-
break;
90-
case (uint)WindowMessages.ICON_NOTIFY:
91-
TrayIconManager.ProcessTrayIconMessage(msg.LParam);
92-
break;
93-
case (uint)WindowMessages.COMMAND:
94-
TrayIconManager.ProcessTrayMenuCommand(msg.WParam);
95-
break;
96-
default:
97-
break;
98-
}
88+
HandleMessage(msg.HWnd, msg.Message, (nint)msg.WParam, (nint)msg.LParam);
9989
}
10090
}
10191
}
@@ -172,7 +162,7 @@ private static void InitializeTrayWindow()
172162
HInstance = hInstance,
173163
LpszClassName = TrayWindowClassName,
174164
Style = CSHREDRAW | CSVREDRAW,
175-
LpfnWndProc = TrayIconWindowProc,
165+
LpfnWndProc = HandleMessage,
176166
HIcon = hIcon,
177167
HbrBackground = IntPtr.Zero,
178168
LpszMenuName = string.Empty,
@@ -203,9 +193,34 @@ private static void InitializeTrayWindow()
203193
}
204194
}
205195

206-
private static IntPtr TrayIconWindowProc(IntPtr hWnd, uint msg, IntPtr wParam, IntPtr lParam)
196+
private static IntPtr HandleMessage(IntPtr hWnd, uint msg, IntPtr wParam, IntPtr lParam)
207197
{
208-
TrayIconManager.ProcessTrayIconMessage(lParam.ToInt64());
198+
switch (msg)
199+
{
200+
case (uint)WindowMessages.HOTKEY:
201+
HotkeyManager.ProcessHotkey((nuint)wParam);
202+
break;
203+
case (uint)WindowMessages.ICON_NOTIFY:
204+
TrayIconManager.ProcessTrayIconMessage(lParam);
205+
break;
206+
case (uint)WindowMessages.COMMAND:
207+
TrayIconManager.ProcessTrayMenuCommand((nuint)wParam);
208+
break;
209+
case (uint)WindowMessages.WINDOWPOSCHANGING:
210+
TrayIconManager.StartTrayIcon();
211+
break;
212+
case (uint)WindowMessages.DESTROY:
213+
TrayIconManager.StopTrayIcon();
214+
break;
215+
default:
216+
if (msg == _taskbarCreatedMessage)
217+
{
218+
TrayIconManager.StartTrayIcon();
219+
}
220+
221+
break;
222+
}
223+
209224
return DefWindowProcW(hWnd, msg, wParam, lParam);
210225
}
211226
}

0 commit comments

Comments
 (0)