2021-10-22 13:30:18 +01:00
|
|
|
|
// Copyright (c) Microsoft Corporation
|
|
|
|
|
|
// The Microsoft Corporation licenses this file to you under the MIT license.
|
|
|
|
|
|
// See the LICENSE file in the project root for more information.
|
|
|
|
|
|
|
|
|
|
|
|
using System;
|
2025-08-20 09:31:52 +08:00
|
|
|
|
using System.Collections.Generic;
|
2023-04-24 16:15:07 +01:00
|
|
|
|
using System.ComponentModel;
|
2021-10-25 19:39:48 +01:00
|
|
|
|
using System.Runtime.CompilerServices;
|
2022-10-26 14:02:31 +01:00
|
|
|
|
using global::PowerToys.GPOWrapper;
|
2025-08-20 09:31:52 +08:00
|
|
|
|
using Microsoft.PowerToys.Settings.UI.Helpers;
|
2022-10-26 14:02:31 +01:00
|
|
|
|
using Microsoft.PowerToys.Settings.UI.Library;
|
2021-10-22 13:30:18 +01:00
|
|
|
|
using Microsoft.PowerToys.Settings.UI.Library.Helpers;
|
|
|
|
|
|
using Microsoft.PowerToys.Settings.UI.Library.Interfaces;
|
2023-09-05 15:25:24 +02:00
|
|
|
|
using Microsoft.PowerToys.Settings.Utilities;
|
2021-10-22 13:30:18 +01:00
|
|
|
|
|
2022-10-26 14:02:31 +01:00
|
|
|
|
namespace Microsoft.PowerToys.Settings.UI.ViewModels
|
2021-10-22 13:30:18 +01:00
|
|
|
|
{
|
2025-08-20 09:31:52 +08:00
|
|
|
|
public partial class MouseUtilsViewModel : PageViewModelBase
|
2021-10-22 13:30:18 +01:00
|
|
|
|
{
|
2025-08-20 09:31:52 +08:00
|
|
|
|
protected override string ModuleName => "MouseUtils";
|
|
|
|
|
|
|
2021-10-25 19:39:48 +01:00
|
|
|
|
private ISettingsUtils SettingsUtils { get; set; }
|
|
|
|
|
|
|
2021-10-22 13:30:18 +01:00
|
|
|
|
private GeneralSettings GeneralSettingsConfig { get; set; }
|
|
|
|
|
|
|
2021-10-25 19:39:48 +01:00
|
|
|
|
private FindMyMouseSettings FindMyMouseSettingsConfig { get; set; }
|
|
|
|
|
|
|
2021-11-22 13:31:31 +00:00
|
|
|
|
private MouseHighlighterSettings MouseHighlighterSettingsConfig { get; set; }
|
|
|
|
|
|
|
2022-01-26 14:01:24 +00:00
|
|
|
|
private MousePointerCrosshairsSettings MousePointerCrosshairsSettingsConfig { get; set; }
|
2022-01-24 13:29:16 +00:00
|
|
|
|
|
2023-02-24 13:30:30 +00:00
|
|
|
|
public MouseUtilsViewModel(ISettingsUtils settingsUtils, ISettingsRepository<GeneralSettings> settingsRepository, ISettingsRepository<FindMyMouseSettings> findMyMouseSettingsRepository, ISettingsRepository<MouseHighlighterSettings> mouseHighlighterSettingsRepository, ISettingsRepository<MouseJumpSettings> mouseJumpSettingsRepository, ISettingsRepository<MousePointerCrosshairsSettings> mousePointerCrosshairsSettingsRepository, Func<string, int> ipcMSGCallBackFunc)
|
2021-10-22 13:30:18 +01:00
|
|
|
|
{
|
2021-10-25 19:39:48 +01:00
|
|
|
|
SettingsUtils = settingsUtils;
|
|
|
|
|
|
|
2021-10-22 13:30:18 +01:00
|
|
|
|
// To obtain the general settings configurations of PowerToys Settings.
|
2023-11-22 12:46:59 -05:00
|
|
|
|
ArgumentNullException.ThrowIfNull(settingsRepository);
|
2021-10-22 13:30:18 +01:00
|
|
|
|
|
|
|
|
|
|
GeneralSettingsConfig = settingsRepository.SettingsConfig;
|
|
|
|
|
|
|
2023-01-31 00:00:11 +01:00
|
|
|
|
InitializeEnabledValues();
|
2022-01-24 13:29:16 +00:00
|
|
|
|
|
2021-10-25 19:39:48 +01:00
|
|
|
|
// To obtain the find my mouse settings, if the file exists.
|
|
|
|
|
|
// If not, to create a file with the default settings and to return the default configurations.
|
2023-11-22 12:46:59 -05:00
|
|
|
|
ArgumentNullException.ThrowIfNull(findMyMouseSettingsRepository);
|
2021-10-25 19:39:48 +01:00
|
|
|
|
|
|
|
|
|
|
FindMyMouseSettingsConfig = findMyMouseSettingsRepository.SettingsConfig;
|
2023-09-04 17:58:37 +02:00
|
|
|
|
_findMyMouseActivationMethod = FindMyMouseSettingsConfig.Properties.ActivationMethod.Value < 4 ? FindMyMouseSettingsConfig.Properties.ActivationMethod.Value : 0;
|
2024-06-03 07:44:11 -04:00
|
|
|
|
_findMyMouseIncludeWinKey = FindMyMouseSettingsConfig.Properties.IncludeWinKey.Value;
|
2021-10-25 19:39:48 +01:00
|
|
|
|
_findMyMouseDoNotActivateOnGameMode = FindMyMouseSettingsConfig.Properties.DoNotActivateOnGameMode.Value;
|
|
|
|
|
|
|
2021-11-23 16:52:17 +00:00
|
|
|
|
string backgroundColor = FindMyMouseSettingsConfig.Properties.BackgroundColor.Value;
|
2025-10-08 02:08:24 +08:00
|
|
|
|
_findMyMouseBackgroundColor = !string.IsNullOrEmpty(backgroundColor) ? backgroundColor : "#80000000";
|
2021-11-23 16:52:17 +00:00
|
|
|
|
|
|
|
|
|
|
string spotlightColor = FindMyMouseSettingsConfig.Properties.SpotlightColor.Value;
|
2025-10-08 02:08:24 +08:00
|
|
|
|
_findMyMouseSpotlightColor = !string.IsNullOrEmpty(spotlightColor) ? spotlightColor : "#80FFFFFF";
|
2021-11-23 16:52:17 +00:00
|
|
|
|
|
|
|
|
|
|
_findMyMouseSpotlightRadius = FindMyMouseSettingsConfig.Properties.SpotlightRadius.Value;
|
|
|
|
|
|
_findMyMouseAnimationDurationMs = FindMyMouseSettingsConfig.Properties.AnimationDurationMs.Value;
|
|
|
|
|
|
_findMyMouseSpotlightInitialZoom = FindMyMouseSettingsConfig.Properties.SpotlightInitialZoom.Value;
|
2022-02-14 18:22:05 +00:00
|
|
|
|
_findMyMouseExcludedApps = FindMyMouseSettingsConfig.Properties.ExcludedApps.Value;
|
2022-03-04 12:28:11 +00:00
|
|
|
|
_findMyMouseShakingMinimumDistance = FindMyMouseSettingsConfig.Properties.ShakingMinimumDistance.Value;
|
2024-01-16 17:35:54 +00:00
|
|
|
|
_findMyMouseShakingIntervalMs = FindMyMouseSettingsConfig.Properties.ShakingIntervalMs.Value;
|
|
|
|
|
|
_findMyMouseShakingFactor = FindMyMouseSettingsConfig.Properties.ShakingFactor.Value;
|
2021-11-23 16:52:17 +00:00
|
|
|
|
|
2023-11-22 12:46:59 -05:00
|
|
|
|
ArgumentNullException.ThrowIfNull(mouseHighlighterSettingsRepository);
|
2021-11-22 13:31:31 +00:00
|
|
|
|
|
|
|
|
|
|
MouseHighlighterSettingsConfig = mouseHighlighterSettingsRepository.SettingsConfig;
|
|
|
|
|
|
string leftClickColor = MouseHighlighterSettingsConfig.Properties.LeftButtonClickColor.Value;
|
2023-07-26 23:48:00 +09:00
|
|
|
|
_highlighterLeftButtonClickColor = !string.IsNullOrEmpty(leftClickColor) ? leftClickColor : "#a6FFFF00";
|
2021-11-22 13:31:31 +00:00
|
|
|
|
|
|
|
|
|
|
string rightClickColor = MouseHighlighterSettingsConfig.Properties.RightButtonClickColor.Value;
|
2023-07-26 23:48:00 +09:00
|
|
|
|
_highlighterRightButtonClickColor = !string.IsNullOrEmpty(rightClickColor) ? rightClickColor : "#a60000FF";
|
|
|
|
|
|
|
|
|
|
|
|
string alwaysColor = MouseHighlighterSettingsConfig.Properties.AlwaysColor.Value;
|
|
|
|
|
|
_highlighterAlwaysColor = !string.IsNullOrEmpty(alwaysColor) ? alwaysColor : "#00FF0000";
|
2025-06-27 14:11:39 +08:00
|
|
|
|
_isSpotlightModeEnabled = MouseHighlighterSettingsConfig.Properties.SpotlightMode.Value;
|
2021-11-22 13:31:31 +00:00
|
|
|
|
|
|
|
|
|
|
_highlighterRadius = MouseHighlighterSettingsConfig.Properties.HighlightRadius.Value;
|
|
|
|
|
|
_highlightFadeDelayMs = MouseHighlighterSettingsConfig.Properties.HighlightFadeDelayMs.Value;
|
|
|
|
|
|
_highlightFadeDurationMs = MouseHighlighterSettingsConfig.Properties.HighlightFadeDurationMs.Value;
|
2023-08-08 18:01:23 +02:00
|
|
|
|
_highlighterAutoActivate = MouseHighlighterSettingsConfig.Properties.AutoActivate.Value;
|
2021-11-22 13:31:31 +00:00
|
|
|
|
|
2024-11-26 15:37:59 +00:00
|
|
|
|
this.InitializeMouseJumpSettings(mouseJumpSettingsRepository);
|
2023-02-24 13:30:30 +00:00
|
|
|
|
|
2023-11-22 12:46:59 -05:00
|
|
|
|
ArgumentNullException.ThrowIfNull(mousePointerCrosshairsSettingsRepository);
|
2022-01-24 13:29:16 +00:00
|
|
|
|
|
2022-01-26 14:01:24 +00:00
|
|
|
|
MousePointerCrosshairsSettingsConfig = mousePointerCrosshairsSettingsRepository.SettingsConfig;
|
2022-01-24 13:29:16 +00:00
|
|
|
|
|
2022-01-26 14:01:24 +00:00
|
|
|
|
string crosshairsColor = MousePointerCrosshairsSettingsConfig.Properties.CrosshairsColor.Value;
|
|
|
|
|
|
_mousePointerCrosshairsColor = !string.IsNullOrEmpty(crosshairsColor) ? crosshairsColor : "#FF0000";
|
2022-01-24 13:29:16 +00:00
|
|
|
|
|
2022-01-26 14:01:24 +00:00
|
|
|
|
string crosshairsBorderColor = MousePointerCrosshairsSettingsConfig.Properties.CrosshairsBorderColor.Value;
|
|
|
|
|
|
_mousePointerCrosshairsBorderColor = !string.IsNullOrEmpty(crosshairsBorderColor) ? crosshairsBorderColor : "#FFFFFF";
|
2022-01-24 13:29:16 +00:00
|
|
|
|
|
2022-01-26 14:01:24 +00:00
|
|
|
|
_mousePointerCrosshairsOpacity = MousePointerCrosshairsSettingsConfig.Properties.CrosshairsOpacity.Value;
|
|
|
|
|
|
_mousePointerCrosshairsRadius = MousePointerCrosshairsSettingsConfig.Properties.CrosshairsRadius.Value;
|
|
|
|
|
|
_mousePointerCrosshairsThickness = MousePointerCrosshairsSettingsConfig.Properties.CrosshairsThickness.Value;
|
|
|
|
|
|
_mousePointerCrosshairsBorderSize = MousePointerCrosshairsSettingsConfig.Properties.CrosshairsBorderSize.Value;
|
2023-07-18 14:33:32 +02:00
|
|
|
|
_mousePointerCrosshairsAutoHide = MousePointerCrosshairsSettingsConfig.Properties.CrosshairsAutoHide.Value;
|
2023-07-19 07:24:47 -07:00
|
|
|
|
_mousePointerCrosshairsIsFixedLengthEnabled = MousePointerCrosshairsSettingsConfig.Properties.CrosshairsIsFixedLengthEnabled.Value;
|
|
|
|
|
|
_mousePointerCrosshairsFixedLength = MousePointerCrosshairsSettingsConfig.Properties.CrosshairsFixedLength.Value;
|
2025-09-29 03:32:07 +01:00
|
|
|
|
_mousePointerCrosshairsOrientation = MousePointerCrosshairsSettingsConfig.Properties.CrosshairsOrientation.Value;
|
2023-08-08 18:01:23 +02:00
|
|
|
|
_mousePointerCrosshairsAutoActivate = MousePointerCrosshairsSettingsConfig.Properties.AutoActivate.Value;
|
2022-01-24 13:29:16 +00:00
|
|
|
|
|
2023-09-05 15:25:24 +02:00
|
|
|
|
int isEnabled = 0;
|
2025-08-20 09:31:52 +08:00
|
|
|
|
|
|
|
|
|
|
Utilities.NativeMethods.SystemParametersInfo(Utilities.NativeMethods.SPI_GETCLIENTAREAANIMATION, 0, ref isEnabled, 0);
|
2023-09-05 15:25:24 +02:00
|
|
|
|
_isAnimationEnabledBySystem = isEnabled != 0;
|
|
|
|
|
|
|
2021-10-25 19:39:48 +01:00
|
|
|
|
// set the callback functions value to handle outgoing IPC message.
|
2021-10-22 13:30:18 +01:00
|
|
|
|
SendConfigMSG = ipcMSGCallBackFunc;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2023-01-31 00:00:11 +01:00
|
|
|
|
private void InitializeEnabledValues()
|
|
|
|
|
|
{
|
|
|
|
|
|
_findMyMouseEnabledGpoRuleConfiguration = GPOWrapper.GetConfiguredFindMyMouseEnabledValue();
|
|
|
|
|
|
if (_findMyMouseEnabledGpoRuleConfiguration == GpoRuleConfigured.Disabled || _findMyMouseEnabledGpoRuleConfiguration == GpoRuleConfigured.Enabled)
|
|
|
|
|
|
{
|
|
|
|
|
|
// Get the enabled state from GPO.
|
|
|
|
|
|
_findMyMouseEnabledStateIsGPOConfigured = true;
|
|
|
|
|
|
_isFindMyMouseEnabled = _findMyMouseEnabledGpoRuleConfiguration == GpoRuleConfigured.Enabled;
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
_isFindMyMouseEnabled = GeneralSettingsConfig.Enabled.FindMyMouse;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
_highlighterEnabledGpoRuleConfiguration = GPOWrapper.GetConfiguredMouseHighlighterEnabledValue();
|
|
|
|
|
|
if (_highlighterEnabledGpoRuleConfiguration == GpoRuleConfigured.Disabled || _highlighterEnabledGpoRuleConfiguration == GpoRuleConfigured.Enabled)
|
|
|
|
|
|
{
|
|
|
|
|
|
// Get the enabled state from GPO.
|
|
|
|
|
|
_highlighterEnabledStateIsGPOConfigured = true;
|
|
|
|
|
|
_isMouseHighlighterEnabled = _highlighterEnabledGpoRuleConfiguration == GpoRuleConfigured.Enabled;
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
_isMouseHighlighterEnabled = GeneralSettingsConfig.Enabled.MouseHighlighter;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2024-11-26 15:37:59 +00:00
|
|
|
|
this.InitializeMouseJumpEnabledValues();
|
2023-02-24 13:30:30 +00:00
|
|
|
|
|
2023-01-31 00:00:11 +01:00
|
|
|
|
_mousePointerCrosshairsEnabledGpoRuleConfiguration = GPOWrapper.GetConfiguredMousePointerCrosshairsEnabledValue();
|
|
|
|
|
|
if (_mousePointerCrosshairsEnabledGpoRuleConfiguration == GpoRuleConfigured.Disabled || _mousePointerCrosshairsEnabledGpoRuleConfiguration == GpoRuleConfigured.Enabled)
|
|
|
|
|
|
{
|
|
|
|
|
|
// Get the enabled state from GPO.
|
|
|
|
|
|
_mousePointerCrosshairsEnabledStateIsGPOConfigured = true;
|
|
|
|
|
|
_isMousePointerCrosshairsEnabled = _mousePointerCrosshairsEnabledGpoRuleConfiguration == GpoRuleConfigured.Enabled;
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
_isMousePointerCrosshairsEnabled = GeneralSettingsConfig.Enabled.MousePointerCrosshairs;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-08-20 09:31:52 +08:00
|
|
|
|
public override Dictionary<string, HotkeySettings[]> GetAllHotkeySettings()
|
|
|
|
|
|
{
|
|
|
|
|
|
var hotkeysDict = new Dictionary<string, HotkeySettings[]>
|
|
|
|
|
|
{
|
|
|
|
|
|
[FindMyMouseSettings.ModuleName] = [FindMyMouseActivationShortcut],
|
|
|
|
|
|
[MouseHighlighterSettings.ModuleName] = [MouseHighlighterActivationShortcut],
|
Implement "Gliding cursor" accessibility feature (#41221)
## Summary of the Pull Request
Added '[Gliding
Cursor](https://github.com/microsoft/PowerToys/issues/37097)'
functionality to Mouse Pointer Crosshairs, this enables a single
hotkey/Microsoft Adaptive Hub + button to control cursor movement and
clicking. This is implemented as an extension to the existing Mouse
Pointer Crosshairs module.
Testing has been manual, ensuring that the existing Mouse Pointer
Crosshairs functionality is unchanged, and that the new Gliding Cursor
functionality works alongside Mouse Pointer Crosshairs.

<img width="857" height="438" alt="image"
src="https://github.com/user-attachments/assets/b9e7ee72-dfeb-4d20-93a5-a34e8b10d703"
/>
To test this functionality:
- Open Mouse Crosshair settings and make sure the feature is enabled.
- Press the shortcut to start the gliding cursor — a vertical line
appears.
- Press the shortcut again to slow the vertical line.
- Press once more to fix the vertical line; a horizontal line begins
moving.
- Press again to slow the horizontal line.
- When the lines meet at your target, press the shortcut to perform the
click.
## PR Checklist
- [x] Closes: #37097
- [ ] **Communication:** I've discussed this with core contributors
already. If the work hasn't been agreed, this work might be rejected
- [x] **Tests:** Added/updated and all pass
- [x] **Localization:** All end-user-facing strings can be localized
- [ ] **Dev docs:** Added/updated
- [ ] **New binaries:** Added on the required places
- [ ] [JSON for
signing](https://github.com/microsoft/PowerToys/blob/main/.pipelines/ESRPSigning_core.json)
for new binaries
- [ ] [WXS for
installer](https://github.com/microsoft/PowerToys/blob/main/installer/PowerToysSetup/Product.wxs)
for new binaries and localization folder
- [ ] [YML for CI
pipeline](https://github.com/microsoft/PowerToys/blob/main/.pipelines/ci/templates/build-powertoys-steps.yml)
for new test projects
- [ ] [YML for signed
pipeline](https://github.com/microsoft/PowerToys/blob/main/.pipelines/release.yml)
- [ ] **Documentation updated:** If checked, please file a pull request
on [our docs
repo](https://github.com/MicrosoftDocs/windows-uwp/tree/docs/hub/powertoys)
and link it here: #xxx
## Detailed Description of the Pull Request / Additional comments
The PR includes these changes:
* Updated Mouse Pointer Crosshairs XAML to include a new hotkey to start
the gliding cursor experience
* Added two sliders for fast/slow cursor movement
* mapped the new hotkey/XAML sliders through to the existing
MousePointerHotkeys project, dllmain.cpp
* Added a 10ms tick for Gliding cursor for crosshairs/cursor movement
* Added state for gliding functionality - horiz fast, horiz slow, vert
fast, vert slow, click
* added gates around the existing mouse movement hook to prevent mouse
movement when gliding
## Validation Steps Performed
Manual testing has been completed on several PCs to confirm the
following:
* Existing Mouse Pointer Crosshairs functionality is unchanged
* Gliding cursor settings are persisted/used by the gliding cursor code
* Gliding cursor restores Mouse Pointer Crosshairs state after the final
click has completed.
---------
Signed-off-by: Shawn Yuan <shuaiyuan@microsoft.com>
Co-authored-by: Niels Laute <niels.laute@live.nl>
Co-authored-by: Shawn Yuan <shuaiyuan@microsoft.com>
2025-08-21 06:53:20 +01:00
|
|
|
|
[MousePointerCrosshairsSettings.ModuleName] = [
|
|
|
|
|
|
MousePointerCrosshairsActivationShortcut,
|
|
|
|
|
|
GlidingCursorActivationShortcut],
|
2025-08-20 09:31:52 +08:00
|
|
|
|
[MouseJumpSettings.ModuleName] = [MouseJumpActivationShortcut],
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
return hotkeysDict;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2021-10-22 13:30:18 +01:00
|
|
|
|
public bool IsFindMyMouseEnabled
|
|
|
|
|
|
{
|
|
|
|
|
|
get => _isFindMyMouseEnabled;
|
|
|
|
|
|
set
|
|
|
|
|
|
{
|
2022-10-26 14:02:31 +01:00
|
|
|
|
if (_findMyMouseEnabledStateIsGPOConfigured)
|
|
|
|
|
|
{
|
|
|
|
|
|
// If it's GPO configured, shouldn't be able to change this state.
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2021-10-22 13:30:18 +01:00
|
|
|
|
if (_isFindMyMouseEnabled != value)
|
|
|
|
|
|
{
|
|
|
|
|
|
_isFindMyMouseEnabled = value;
|
|
|
|
|
|
|
|
|
|
|
|
GeneralSettingsConfig.Enabled.FindMyMouse = value;
|
|
|
|
|
|
OnPropertyChanged(nameof(IsFindMyMouseEnabled));
|
|
|
|
|
|
|
|
|
|
|
|
OutGoingGeneralSettings outgoing = new OutGoingGeneralSettings(GeneralSettingsConfig);
|
|
|
|
|
|
SendConfigMSG(outgoing.ToString());
|
|
|
|
|
|
|
2021-10-25 19:39:48 +01:00
|
|
|
|
NotifyFindMyMousePropertyChanged();
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2022-10-26 14:02:31 +01:00
|
|
|
|
public bool IsFindMyMouseEnabledGpoConfigured
|
|
|
|
|
|
{
|
|
|
|
|
|
get => _findMyMouseEnabledStateIsGPOConfigured;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2022-02-11 22:52:57 +00:00
|
|
|
|
public int FindMyMouseActivationMethod
|
|
|
|
|
|
{
|
|
|
|
|
|
get
|
|
|
|
|
|
{
|
|
|
|
|
|
return _findMyMouseActivationMethod;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
set
|
|
|
|
|
|
{
|
|
|
|
|
|
if (value != _findMyMouseActivationMethod)
|
|
|
|
|
|
{
|
|
|
|
|
|
_findMyMouseActivationMethod = value;
|
|
|
|
|
|
FindMyMouseSettingsConfig.Properties.ActivationMethod.Value = value;
|
|
|
|
|
|
NotifyFindMyMousePropertyChanged();
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2024-06-03 07:44:11 -04:00
|
|
|
|
public bool FindMyMouseIncludeWinKey
|
|
|
|
|
|
{
|
|
|
|
|
|
get
|
|
|
|
|
|
{
|
|
|
|
|
|
return _findMyMouseIncludeWinKey;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
set
|
|
|
|
|
|
{
|
|
|
|
|
|
if (_findMyMouseIncludeWinKey != value)
|
|
|
|
|
|
{
|
|
|
|
|
|
_findMyMouseIncludeWinKey = value;
|
|
|
|
|
|
FindMyMouseSettingsConfig.Properties.IncludeWinKey.Value = value;
|
|
|
|
|
|
NotifyFindMyMousePropertyChanged();
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2023-09-04 17:58:37 +02:00
|
|
|
|
public HotkeySettings FindMyMouseActivationShortcut
|
|
|
|
|
|
{
|
|
|
|
|
|
get
|
|
|
|
|
|
{
|
|
|
|
|
|
return FindMyMouseSettingsConfig.Properties.ActivationShortcut;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
set
|
|
|
|
|
|
{
|
|
|
|
|
|
if (FindMyMouseSettingsConfig.Properties.ActivationShortcut != value)
|
|
|
|
|
|
{
|
|
|
|
|
|
FindMyMouseSettingsConfig.Properties.ActivationShortcut = value ?? FindMyMouseSettingsConfig.Properties.DefaultActivationShortcut;
|
|
|
|
|
|
NotifyFindMyMousePropertyChanged();
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2021-10-25 19:39:48 +01:00
|
|
|
|
public bool FindMyMouseDoNotActivateOnGameMode
|
|
|
|
|
|
{
|
|
|
|
|
|
get
|
|
|
|
|
|
{
|
|
|
|
|
|
return _findMyMouseDoNotActivateOnGameMode;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
set
|
|
|
|
|
|
{
|
|
|
|
|
|
if (_findMyMouseDoNotActivateOnGameMode != value)
|
|
|
|
|
|
{
|
|
|
|
|
|
_findMyMouseDoNotActivateOnGameMode = value;
|
|
|
|
|
|
FindMyMouseSettingsConfig.Properties.DoNotActivateOnGameMode.Value = value;
|
|
|
|
|
|
NotifyFindMyMousePropertyChanged();
|
2021-10-22 13:30:18 +01:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2021-11-23 16:52:17 +00:00
|
|
|
|
public string FindMyMouseBackgroundColor
|
|
|
|
|
|
{
|
|
|
|
|
|
get
|
|
|
|
|
|
{
|
|
|
|
|
|
return _findMyMouseBackgroundColor;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
set
|
|
|
|
|
|
{
|
2025-09-26 13:03:00 +08:00
|
|
|
|
value = (value != null) ? SettingsUtilities.ToARGBHex(value) : "#FF000000";
|
2021-11-23 16:52:17 +00:00
|
|
|
|
if (!value.Equals(_findMyMouseBackgroundColor, StringComparison.OrdinalIgnoreCase))
|
|
|
|
|
|
{
|
|
|
|
|
|
_findMyMouseBackgroundColor = value;
|
|
|
|
|
|
FindMyMouseSettingsConfig.Properties.BackgroundColor.Value = value;
|
|
|
|
|
|
NotifyFindMyMousePropertyChanged();
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public string FindMyMouseSpotlightColor
|
|
|
|
|
|
{
|
|
|
|
|
|
get
|
|
|
|
|
|
{
|
|
|
|
|
|
return _findMyMouseSpotlightColor;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
set
|
|
|
|
|
|
{
|
2025-09-26 13:03:00 +08:00
|
|
|
|
value = (value != null) ? SettingsUtilities.ToARGBHex(value) : "#FFFFFFFF";
|
2021-11-23 16:52:17 +00:00
|
|
|
|
if (!value.Equals(_findMyMouseSpotlightColor, StringComparison.OrdinalIgnoreCase))
|
|
|
|
|
|
{
|
|
|
|
|
|
_findMyMouseSpotlightColor = value;
|
|
|
|
|
|
FindMyMouseSettingsConfig.Properties.SpotlightColor.Value = value;
|
|
|
|
|
|
NotifyFindMyMousePropertyChanged();
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public int FindMyMouseSpotlightRadius
|
|
|
|
|
|
{
|
|
|
|
|
|
get
|
|
|
|
|
|
{
|
|
|
|
|
|
return _findMyMouseSpotlightRadius;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
set
|
|
|
|
|
|
{
|
|
|
|
|
|
if (value != _findMyMouseSpotlightRadius)
|
|
|
|
|
|
{
|
|
|
|
|
|
_findMyMouseSpotlightRadius = value;
|
|
|
|
|
|
FindMyMouseSettingsConfig.Properties.SpotlightRadius.Value = value;
|
|
|
|
|
|
NotifyFindMyMousePropertyChanged();
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2023-09-05 15:25:24 +02:00
|
|
|
|
public bool IsAnimationEnabledBySystem
|
|
|
|
|
|
{
|
|
|
|
|
|
get
|
|
|
|
|
|
{
|
|
|
|
|
|
return _isAnimationEnabledBySystem;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
set
|
|
|
|
|
|
{
|
|
|
|
|
|
_isAnimationEnabledBySystem = value;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2021-11-23 16:52:17 +00:00
|
|
|
|
public int FindMyMouseAnimationDurationMs
|
|
|
|
|
|
{
|
|
|
|
|
|
get
|
|
|
|
|
|
{
|
|
|
|
|
|
return _findMyMouseAnimationDurationMs;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
set
|
|
|
|
|
|
{
|
|
|
|
|
|
if (value != _findMyMouseAnimationDurationMs)
|
|
|
|
|
|
{
|
|
|
|
|
|
_findMyMouseAnimationDurationMs = value;
|
|
|
|
|
|
FindMyMouseSettingsConfig.Properties.AnimationDurationMs.Value = value;
|
|
|
|
|
|
NotifyFindMyMousePropertyChanged();
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public int FindMyMouseSpotlightInitialZoom
|
|
|
|
|
|
{
|
|
|
|
|
|
get
|
|
|
|
|
|
{
|
|
|
|
|
|
return _findMyMouseSpotlightInitialZoom;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
set
|
|
|
|
|
|
{
|
|
|
|
|
|
if (value != _findMyMouseSpotlightInitialZoom)
|
|
|
|
|
|
{
|
|
|
|
|
|
_findMyMouseSpotlightInitialZoom = value;
|
|
|
|
|
|
FindMyMouseSettingsConfig.Properties.SpotlightInitialZoom.Value = value;
|
|
|
|
|
|
NotifyFindMyMousePropertyChanged();
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2022-02-14 18:22:05 +00:00
|
|
|
|
public string FindMyMouseExcludedApps
|
|
|
|
|
|
{
|
|
|
|
|
|
get
|
|
|
|
|
|
{
|
|
|
|
|
|
return _findMyMouseExcludedApps;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
set
|
|
|
|
|
|
{
|
|
|
|
|
|
if (value != _findMyMouseExcludedApps)
|
|
|
|
|
|
{
|
|
|
|
|
|
_findMyMouseExcludedApps = value;
|
|
|
|
|
|
FindMyMouseSettingsConfig.Properties.ExcludedApps.Value = value;
|
|
|
|
|
|
NotifyFindMyMousePropertyChanged();
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2022-03-04 12:28:11 +00:00
|
|
|
|
public int FindMyMouseShakingMinimumDistance
|
|
|
|
|
|
{
|
|
|
|
|
|
get
|
|
|
|
|
|
{
|
|
|
|
|
|
return _findMyMouseShakingMinimumDistance;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
set
|
|
|
|
|
|
{
|
|
|
|
|
|
if (value != _findMyMouseShakingMinimumDistance)
|
|
|
|
|
|
{
|
|
|
|
|
|
_findMyMouseShakingMinimumDistance = value;
|
|
|
|
|
|
FindMyMouseSettingsConfig.Properties.ShakingMinimumDistance.Value = value;
|
|
|
|
|
|
NotifyFindMyMousePropertyChanged();
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2024-01-16 17:35:54 +00:00
|
|
|
|
public int FindMyMouseShakingIntervalMs
|
|
|
|
|
|
{
|
|
|
|
|
|
get
|
|
|
|
|
|
{
|
|
|
|
|
|
return _findMyMouseShakingIntervalMs;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
set
|
|
|
|
|
|
{
|
|
|
|
|
|
if (value != _findMyMouseShakingIntervalMs)
|
|
|
|
|
|
{
|
|
|
|
|
|
_findMyMouseShakingIntervalMs = value;
|
|
|
|
|
|
FindMyMouseSettingsConfig.Properties.ShakingIntervalMs.Value = value;
|
|
|
|
|
|
NotifyFindMyMousePropertyChanged();
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public int FindMyMouseShakingFactor
|
|
|
|
|
|
{
|
|
|
|
|
|
get
|
|
|
|
|
|
{
|
|
|
|
|
|
return _findMyMouseShakingFactor;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
set
|
|
|
|
|
|
{
|
|
|
|
|
|
if (value != _findMyMouseShakingFactor)
|
|
|
|
|
|
{
|
|
|
|
|
|
_findMyMouseShakingFactor = value;
|
|
|
|
|
|
FindMyMouseSettingsConfig.Properties.ShakingFactor.Value = value;
|
|
|
|
|
|
NotifyFindMyMousePropertyChanged();
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2021-10-25 19:39:48 +01:00
|
|
|
|
public void NotifyFindMyMousePropertyChanged([CallerMemberName] string propertyName = null)
|
|
|
|
|
|
{
|
|
|
|
|
|
OnPropertyChanged(propertyName);
|
|
|
|
|
|
|
|
|
|
|
|
SndFindMyMouseSettings outsettings = new SndFindMyMouseSettings(FindMyMouseSettingsConfig);
|
|
|
|
|
|
SndModuleSettings<SndFindMyMouseSettings> ipcMessage = new SndModuleSettings<SndFindMyMouseSettings>(outsettings);
|
|
|
|
|
|
SendConfigMSG(ipcMessage.ToJsonString());
|
|
|
|
|
|
SettingsUtils.SaveSettings(FindMyMouseSettingsConfig.ToJsonString(), FindMyMouseSettings.ModuleName);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2021-11-22 13:31:31 +00:00
|
|
|
|
public bool IsMouseHighlighterEnabled
|
|
|
|
|
|
{
|
|
|
|
|
|
get => _isMouseHighlighterEnabled;
|
|
|
|
|
|
set
|
|
|
|
|
|
{
|
2022-10-26 14:02:31 +01:00
|
|
|
|
if (_highlighterEnabledStateIsGPOConfigured)
|
|
|
|
|
|
{
|
|
|
|
|
|
// If it's GPO configured, shouldn't be able to change this state.
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2021-11-22 13:31:31 +00:00
|
|
|
|
if (_isMouseHighlighterEnabled != value)
|
|
|
|
|
|
{
|
|
|
|
|
|
_isMouseHighlighterEnabled = value;
|
|
|
|
|
|
|
|
|
|
|
|
GeneralSettingsConfig.Enabled.MouseHighlighter = value;
|
|
|
|
|
|
OnPropertyChanged(nameof(_isMouseHighlighterEnabled));
|
|
|
|
|
|
|
|
|
|
|
|
OutGoingGeneralSettings outgoing = new OutGoingGeneralSettings(GeneralSettingsConfig);
|
|
|
|
|
|
SendConfigMSG(outgoing.ToString());
|
|
|
|
|
|
|
|
|
|
|
|
NotifyMouseHighlighterPropertyChanged();
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2022-10-26 14:02:31 +01:00
|
|
|
|
public bool IsHighlighterEnabledGpoConfigured
|
|
|
|
|
|
{
|
|
|
|
|
|
get => _highlighterEnabledStateIsGPOConfigured;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2021-11-22 13:31:31 +00:00
|
|
|
|
public HotkeySettings MouseHighlighterActivationShortcut
|
|
|
|
|
|
{
|
|
|
|
|
|
get
|
|
|
|
|
|
{
|
|
|
|
|
|
return MouseHighlighterSettingsConfig.Properties.ActivationShortcut;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
set
|
|
|
|
|
|
{
|
|
|
|
|
|
if (MouseHighlighterSettingsConfig.Properties.ActivationShortcut != value)
|
|
|
|
|
|
{
|
2023-06-20 15:42:04 +02:00
|
|
|
|
MouseHighlighterSettingsConfig.Properties.ActivationShortcut = value ?? MouseHighlighterSettingsConfig.Properties.DefaultActivationShortcut;
|
2021-11-22 13:31:31 +00:00
|
|
|
|
NotifyMouseHighlighterPropertyChanged();
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public string MouseHighlighterLeftButtonClickColor
|
|
|
|
|
|
{
|
|
|
|
|
|
get
|
|
|
|
|
|
{
|
|
|
|
|
|
return _highlighterLeftButtonClickColor;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
set
|
|
|
|
|
|
{
|
2023-07-26 23:48:00 +09:00
|
|
|
|
value = SettingsUtilities.ToARGBHex(value);
|
2021-11-22 13:31:31 +00:00
|
|
|
|
if (!value.Equals(_highlighterLeftButtonClickColor, StringComparison.OrdinalIgnoreCase))
|
|
|
|
|
|
{
|
|
|
|
|
|
_highlighterLeftButtonClickColor = value;
|
|
|
|
|
|
MouseHighlighterSettingsConfig.Properties.LeftButtonClickColor.Value = value;
|
|
|
|
|
|
NotifyMouseHighlighterPropertyChanged();
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public string MouseHighlighterRightButtonClickColor
|
|
|
|
|
|
{
|
|
|
|
|
|
get
|
|
|
|
|
|
{
|
|
|
|
|
|
return _highlighterRightButtonClickColor;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
set
|
|
|
|
|
|
{
|
2023-07-26 23:48:00 +09:00
|
|
|
|
value = SettingsUtilities.ToARGBHex(value);
|
2021-11-22 13:31:31 +00:00
|
|
|
|
if (!value.Equals(_highlighterRightButtonClickColor, StringComparison.OrdinalIgnoreCase))
|
|
|
|
|
|
{
|
|
|
|
|
|
_highlighterRightButtonClickColor = value;
|
|
|
|
|
|
MouseHighlighterSettingsConfig.Properties.RightButtonClickColor.Value = value;
|
|
|
|
|
|
NotifyMouseHighlighterPropertyChanged();
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2023-07-26 23:48:00 +09:00
|
|
|
|
public string MouseHighlighterAlwaysColor
|
2021-11-22 13:31:31 +00:00
|
|
|
|
{
|
|
|
|
|
|
get
|
|
|
|
|
|
{
|
2023-07-26 23:48:00 +09:00
|
|
|
|
return _highlighterAlwaysColor;
|
2021-11-22 13:31:31 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
set
|
|
|
|
|
|
{
|
2023-07-26 23:48:00 +09:00
|
|
|
|
value = SettingsUtilities.ToARGBHex(value);
|
|
|
|
|
|
if (!value.Equals(_highlighterAlwaysColor, StringComparison.OrdinalIgnoreCase))
|
2021-11-22 13:31:31 +00:00
|
|
|
|
{
|
2023-07-26 23:48:00 +09:00
|
|
|
|
_highlighterAlwaysColor = value;
|
|
|
|
|
|
MouseHighlighterSettingsConfig.Properties.AlwaysColor.Value = value;
|
2021-11-22 13:31:31 +00:00
|
|
|
|
NotifyMouseHighlighterPropertyChanged();
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-06-27 14:11:39 +08:00
|
|
|
|
public bool IsSpotlightModeEnabled
|
|
|
|
|
|
{
|
|
|
|
|
|
get => _isSpotlightModeEnabled;
|
|
|
|
|
|
set
|
|
|
|
|
|
{
|
|
|
|
|
|
if (_isSpotlightModeEnabled != value)
|
|
|
|
|
|
{
|
|
|
|
|
|
_isSpotlightModeEnabled = value;
|
|
|
|
|
|
MouseHighlighterSettingsConfig.Properties.SpotlightMode.Value = value;
|
|
|
|
|
|
NotifyMouseHighlighterPropertyChanged();
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2021-11-22 13:31:31 +00:00
|
|
|
|
public int MouseHighlighterRadius
|
|
|
|
|
|
{
|
|
|
|
|
|
get
|
|
|
|
|
|
{
|
|
|
|
|
|
return _highlighterRadius;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
set
|
|
|
|
|
|
{
|
|
|
|
|
|
if (value != _highlighterRadius)
|
|
|
|
|
|
{
|
|
|
|
|
|
_highlighterRadius = value;
|
|
|
|
|
|
MouseHighlighterSettingsConfig.Properties.HighlightRadius.Value = value;
|
|
|
|
|
|
NotifyMouseHighlighterPropertyChanged();
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public int MouseHighlighterFadeDelayMs
|
|
|
|
|
|
{
|
|
|
|
|
|
get
|
|
|
|
|
|
{
|
|
|
|
|
|
return _highlightFadeDelayMs;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
set
|
|
|
|
|
|
{
|
|
|
|
|
|
if (value != _highlightFadeDelayMs)
|
|
|
|
|
|
{
|
|
|
|
|
|
_highlightFadeDelayMs = value;
|
|
|
|
|
|
MouseHighlighterSettingsConfig.Properties.HighlightFadeDelayMs.Value = value;
|
|
|
|
|
|
NotifyMouseHighlighterPropertyChanged();
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public int MouseHighlighterFadeDurationMs
|
|
|
|
|
|
{
|
|
|
|
|
|
get
|
|
|
|
|
|
{
|
|
|
|
|
|
return _highlightFadeDurationMs;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
set
|
|
|
|
|
|
{
|
|
|
|
|
|
if (value != _highlightFadeDurationMs)
|
|
|
|
|
|
{
|
|
|
|
|
|
_highlightFadeDurationMs = value;
|
|
|
|
|
|
MouseHighlighterSettingsConfig.Properties.HighlightFadeDurationMs.Value = value;
|
|
|
|
|
|
NotifyMouseHighlighterPropertyChanged();
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2023-08-08 18:01:23 +02:00
|
|
|
|
public bool MouseHighlighterAutoActivate
|
|
|
|
|
|
{
|
|
|
|
|
|
get
|
|
|
|
|
|
{
|
|
|
|
|
|
return _highlighterAutoActivate;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
set
|
|
|
|
|
|
{
|
|
|
|
|
|
if (value != _highlighterAutoActivate)
|
|
|
|
|
|
{
|
|
|
|
|
|
_highlighterAutoActivate = value;
|
|
|
|
|
|
MouseHighlighterSettingsConfig.Properties.AutoActivate.Value = value;
|
|
|
|
|
|
NotifyMouseHighlighterPropertyChanged();
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2021-11-22 13:31:31 +00:00
|
|
|
|
public void NotifyMouseHighlighterPropertyChanged([CallerMemberName] string propertyName = null)
|
|
|
|
|
|
{
|
|
|
|
|
|
OnPropertyChanged(propertyName);
|
|
|
|
|
|
|
|
|
|
|
|
SndMouseHighlighterSettings outsettings = new SndMouseHighlighterSettings(MouseHighlighterSettingsConfig);
|
|
|
|
|
|
SndModuleSettings<SndMouseHighlighterSettings> ipcMessage = new SndModuleSettings<SndMouseHighlighterSettings>(outsettings);
|
|
|
|
|
|
SendConfigMSG(ipcMessage.ToJsonString());
|
|
|
|
|
|
SettingsUtils.SaveSettings(MouseHighlighterSettingsConfig.ToJsonString(), MouseHighlighterSettings.ModuleName);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2022-01-26 14:01:24 +00:00
|
|
|
|
public bool IsMousePointerCrosshairsEnabled
|
2022-01-24 13:29:16 +00:00
|
|
|
|
{
|
2022-01-26 14:01:24 +00:00
|
|
|
|
get => _isMousePointerCrosshairsEnabled;
|
2022-01-24 13:29:16 +00:00
|
|
|
|
set
|
|
|
|
|
|
{
|
2022-10-26 14:02:31 +01:00
|
|
|
|
if (_mousePointerCrosshairsEnabledStateIsGPOConfigured)
|
|
|
|
|
|
{
|
|
|
|
|
|
// If it's GPO configured, shouldn't be able to change this state.
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2022-01-26 14:01:24 +00:00
|
|
|
|
if (_isMousePointerCrosshairsEnabled != value)
|
2022-01-24 13:29:16 +00:00
|
|
|
|
{
|
2022-01-26 14:01:24 +00:00
|
|
|
|
_isMousePointerCrosshairsEnabled = value;
|
2022-01-24 13:29:16 +00:00
|
|
|
|
|
2022-01-26 14:01:24 +00:00
|
|
|
|
GeneralSettingsConfig.Enabled.MousePointerCrosshairs = value;
|
|
|
|
|
|
OnPropertyChanged(nameof(_isMousePointerCrosshairsEnabled));
|
2022-01-24 13:29:16 +00:00
|
|
|
|
|
|
|
|
|
|
OutGoingGeneralSettings outgoing = new OutGoingGeneralSettings(GeneralSettingsConfig);
|
|
|
|
|
|
SendConfigMSG(outgoing.ToString());
|
|
|
|
|
|
|
2022-01-26 14:01:24 +00:00
|
|
|
|
NotifyMousePointerCrosshairsPropertyChanged();
|
2022-01-24 13:29:16 +00:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2022-10-26 14:02:31 +01:00
|
|
|
|
public bool IsMousePointerCrosshairsEnabledGpoConfigured
|
|
|
|
|
|
{
|
|
|
|
|
|
get => _mousePointerCrosshairsEnabledStateIsGPOConfigured;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2022-01-26 14:01:24 +00:00
|
|
|
|
public HotkeySettings MousePointerCrosshairsActivationShortcut
|
2022-01-24 13:29:16 +00:00
|
|
|
|
{
|
|
|
|
|
|
get
|
|
|
|
|
|
{
|
2022-01-26 14:01:24 +00:00
|
|
|
|
return MousePointerCrosshairsSettingsConfig.Properties.ActivationShortcut;
|
2022-01-24 13:29:16 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
set
|
|
|
|
|
|
{
|
2022-01-26 14:01:24 +00:00
|
|
|
|
if (MousePointerCrosshairsSettingsConfig.Properties.ActivationShortcut != value)
|
2022-01-24 13:29:16 +00:00
|
|
|
|
{
|
2023-06-20 15:42:04 +02:00
|
|
|
|
MousePointerCrosshairsSettingsConfig.Properties.ActivationShortcut = value ?? MousePointerCrosshairsSettingsConfig.Properties.DefaultActivationShortcut;
|
2022-01-26 14:01:24 +00:00
|
|
|
|
NotifyMousePointerCrosshairsPropertyChanged();
|
2022-01-24 13:29:16 +00:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2022-01-26 14:01:24 +00:00
|
|
|
|
public string MousePointerCrosshairsColor
|
2022-01-24 13:29:16 +00:00
|
|
|
|
{
|
|
|
|
|
|
get
|
|
|
|
|
|
{
|
2022-01-26 14:01:24 +00:00
|
|
|
|
return _mousePointerCrosshairsColor;
|
2022-01-24 13:29:16 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
set
|
|
|
|
|
|
{
|
2022-08-09 06:35:46 +02:00
|
|
|
|
value = SettingsUtilities.ToRGBHex(value);
|
2022-01-26 14:01:24 +00:00
|
|
|
|
if (!value.Equals(_mousePointerCrosshairsColor, StringComparison.OrdinalIgnoreCase))
|
2022-01-24 13:29:16 +00:00
|
|
|
|
{
|
2022-01-26 14:01:24 +00:00
|
|
|
|
_mousePointerCrosshairsColor = value;
|
|
|
|
|
|
MousePointerCrosshairsSettingsConfig.Properties.CrosshairsColor.Value = value;
|
|
|
|
|
|
NotifyMousePointerCrosshairsPropertyChanged();
|
2022-01-24 13:29:16 +00:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2022-01-26 14:01:24 +00:00
|
|
|
|
public int MousePointerCrosshairsOpacity
|
2022-01-24 13:29:16 +00:00
|
|
|
|
{
|
|
|
|
|
|
get
|
|
|
|
|
|
{
|
2022-01-26 14:01:24 +00:00
|
|
|
|
return _mousePointerCrosshairsOpacity;
|
2022-01-24 13:29:16 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
set
|
|
|
|
|
|
{
|
2022-01-26 14:01:24 +00:00
|
|
|
|
if (value != _mousePointerCrosshairsOpacity)
|
2022-01-24 13:29:16 +00:00
|
|
|
|
{
|
2022-01-26 14:01:24 +00:00
|
|
|
|
_mousePointerCrosshairsOpacity = value;
|
|
|
|
|
|
MousePointerCrosshairsSettingsConfig.Properties.CrosshairsOpacity.Value = value;
|
|
|
|
|
|
NotifyMousePointerCrosshairsPropertyChanged();
|
2022-01-24 13:29:16 +00:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2022-01-26 14:01:24 +00:00
|
|
|
|
public int MousePointerCrosshairsRadius
|
2022-01-24 13:29:16 +00:00
|
|
|
|
{
|
|
|
|
|
|
get
|
|
|
|
|
|
{
|
2022-01-26 14:01:24 +00:00
|
|
|
|
return _mousePointerCrosshairsRadius;
|
2022-01-24 13:29:16 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
set
|
|
|
|
|
|
{
|
2022-01-26 14:01:24 +00:00
|
|
|
|
if (value != _mousePointerCrosshairsRadius)
|
2022-01-24 13:29:16 +00:00
|
|
|
|
{
|
2022-01-26 14:01:24 +00:00
|
|
|
|
_mousePointerCrosshairsRadius = value;
|
|
|
|
|
|
MousePointerCrosshairsSettingsConfig.Properties.CrosshairsRadius.Value = value;
|
|
|
|
|
|
NotifyMousePointerCrosshairsPropertyChanged();
|
2022-01-24 13:29:16 +00:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2022-01-26 14:01:24 +00:00
|
|
|
|
public int MousePointerCrosshairsThickness
|
2022-01-24 13:29:16 +00:00
|
|
|
|
{
|
|
|
|
|
|
get
|
|
|
|
|
|
{
|
2022-01-26 14:01:24 +00:00
|
|
|
|
return _mousePointerCrosshairsThickness;
|
2022-01-24 13:29:16 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
set
|
|
|
|
|
|
{
|
2022-01-26 14:01:24 +00:00
|
|
|
|
if (value != _mousePointerCrosshairsThickness)
|
2022-01-24 13:29:16 +00:00
|
|
|
|
{
|
2022-01-26 14:01:24 +00:00
|
|
|
|
_mousePointerCrosshairsThickness = value;
|
|
|
|
|
|
MousePointerCrosshairsSettingsConfig.Properties.CrosshairsThickness.Value = value;
|
|
|
|
|
|
NotifyMousePointerCrosshairsPropertyChanged();
|
2022-01-24 13:29:16 +00:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2022-01-26 14:01:24 +00:00
|
|
|
|
public string MousePointerCrosshairsBorderColor
|
2022-01-24 13:29:16 +00:00
|
|
|
|
{
|
|
|
|
|
|
get
|
|
|
|
|
|
{
|
2022-01-26 14:01:24 +00:00
|
|
|
|
return _mousePointerCrosshairsBorderColor;
|
2022-01-24 13:29:16 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
set
|
|
|
|
|
|
{
|
2022-08-09 06:35:46 +02:00
|
|
|
|
value = SettingsUtilities.ToRGBHex(value);
|
2022-01-26 14:01:24 +00:00
|
|
|
|
if (!value.Equals(_mousePointerCrosshairsBorderColor, StringComparison.OrdinalIgnoreCase))
|
2022-01-24 13:29:16 +00:00
|
|
|
|
{
|
2022-01-26 14:01:24 +00:00
|
|
|
|
_mousePointerCrosshairsBorderColor = value;
|
|
|
|
|
|
MousePointerCrosshairsSettingsConfig.Properties.CrosshairsBorderColor.Value = value;
|
|
|
|
|
|
NotifyMousePointerCrosshairsPropertyChanged();
|
2022-01-24 13:29:16 +00:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2022-01-26 14:01:24 +00:00
|
|
|
|
public int MousePointerCrosshairsBorderSize
|
2022-01-24 13:29:16 +00:00
|
|
|
|
{
|
|
|
|
|
|
get
|
|
|
|
|
|
{
|
2022-01-26 14:01:24 +00:00
|
|
|
|
return _mousePointerCrosshairsBorderSize;
|
2022-01-24 13:29:16 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
set
|
|
|
|
|
|
{
|
2022-01-26 14:01:24 +00:00
|
|
|
|
if (value != _mousePointerCrosshairsBorderSize)
|
2022-01-24 13:29:16 +00:00
|
|
|
|
{
|
2022-01-26 14:01:24 +00:00
|
|
|
|
_mousePointerCrosshairsBorderSize = value;
|
|
|
|
|
|
MousePointerCrosshairsSettingsConfig.Properties.CrosshairsBorderSize.Value = value;
|
|
|
|
|
|
NotifyMousePointerCrosshairsPropertyChanged();
|
2022-01-24 13:29:16 +00:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2023-07-18 14:33:32 +02:00
|
|
|
|
public bool MousePointerCrosshairsAutoHide
|
|
|
|
|
|
{
|
|
|
|
|
|
get
|
|
|
|
|
|
{
|
|
|
|
|
|
return _mousePointerCrosshairsAutoHide;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
set
|
|
|
|
|
|
{
|
|
|
|
|
|
if (value != _mousePointerCrosshairsAutoHide)
|
|
|
|
|
|
{
|
|
|
|
|
|
_mousePointerCrosshairsAutoHide = value;
|
|
|
|
|
|
MousePointerCrosshairsSettingsConfig.Properties.CrosshairsAutoHide.Value = value;
|
|
|
|
|
|
NotifyMousePointerCrosshairsPropertyChanged();
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2023-07-19 07:24:47 -07:00
|
|
|
|
public bool MousePointerCrosshairsIsFixedLengthEnabled
|
|
|
|
|
|
{
|
|
|
|
|
|
get
|
|
|
|
|
|
{
|
|
|
|
|
|
return _mousePointerCrosshairsIsFixedLengthEnabled;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
set
|
|
|
|
|
|
{
|
|
|
|
|
|
if (value != _mousePointerCrosshairsIsFixedLengthEnabled)
|
|
|
|
|
|
{
|
|
|
|
|
|
_mousePointerCrosshairsIsFixedLengthEnabled = value;
|
|
|
|
|
|
MousePointerCrosshairsSettingsConfig.Properties.CrosshairsIsFixedLengthEnabled.Value = value;
|
|
|
|
|
|
NotifyMousePointerCrosshairsPropertyChanged();
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public int MousePointerCrosshairsFixedLength
|
|
|
|
|
|
{
|
|
|
|
|
|
get
|
|
|
|
|
|
{
|
|
|
|
|
|
return _mousePointerCrosshairsFixedLength;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
set
|
|
|
|
|
|
{
|
|
|
|
|
|
if (value != _mousePointerCrosshairsFixedLength)
|
|
|
|
|
|
{
|
|
|
|
|
|
_mousePointerCrosshairsFixedLength = value;
|
|
|
|
|
|
MousePointerCrosshairsSettingsConfig.Properties.CrosshairsFixedLength.Value = value;
|
|
|
|
|
|
NotifyMousePointerCrosshairsPropertyChanged();
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-09-29 03:32:07 +01:00
|
|
|
|
public int MousePointerCrosshairsOrientation
|
|
|
|
|
|
{
|
|
|
|
|
|
get
|
|
|
|
|
|
{
|
|
|
|
|
|
return _mousePointerCrosshairsOrientation;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
set
|
|
|
|
|
|
{
|
|
|
|
|
|
if (value != _mousePointerCrosshairsOrientation)
|
|
|
|
|
|
{
|
|
|
|
|
|
_mousePointerCrosshairsOrientation = value;
|
|
|
|
|
|
MousePointerCrosshairsSettingsConfig.Properties.CrosshairsOrientation.Value = value;
|
|
|
|
|
|
NotifyMousePointerCrosshairsPropertyChanged();
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2023-08-08 18:01:23 +02:00
|
|
|
|
public bool MousePointerCrosshairsAutoActivate
|
|
|
|
|
|
{
|
|
|
|
|
|
get
|
|
|
|
|
|
{
|
|
|
|
|
|
return _mousePointerCrosshairsAutoActivate;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
set
|
|
|
|
|
|
{
|
|
|
|
|
|
if (value != _mousePointerCrosshairsAutoActivate)
|
|
|
|
|
|
{
|
|
|
|
|
|
_mousePointerCrosshairsAutoActivate = value;
|
|
|
|
|
|
MousePointerCrosshairsSettingsConfig.Properties.AutoActivate.Value = value;
|
|
|
|
|
|
NotifyMousePointerCrosshairsPropertyChanged();
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
Implement "Gliding cursor" accessibility feature (#41221)
## Summary of the Pull Request
Added '[Gliding
Cursor](https://github.com/microsoft/PowerToys/issues/37097)'
functionality to Mouse Pointer Crosshairs, this enables a single
hotkey/Microsoft Adaptive Hub + button to control cursor movement and
clicking. This is implemented as an extension to the existing Mouse
Pointer Crosshairs module.
Testing has been manual, ensuring that the existing Mouse Pointer
Crosshairs functionality is unchanged, and that the new Gliding Cursor
functionality works alongside Mouse Pointer Crosshairs.

<img width="857" height="438" alt="image"
src="https://github.com/user-attachments/assets/b9e7ee72-dfeb-4d20-93a5-a34e8b10d703"
/>
To test this functionality:
- Open Mouse Crosshair settings and make sure the feature is enabled.
- Press the shortcut to start the gliding cursor — a vertical line
appears.
- Press the shortcut again to slow the vertical line.
- Press once more to fix the vertical line; a horizontal line begins
moving.
- Press again to slow the horizontal line.
- When the lines meet at your target, press the shortcut to perform the
click.
## PR Checklist
- [x] Closes: #37097
- [ ] **Communication:** I've discussed this with core contributors
already. If the work hasn't been agreed, this work might be rejected
- [x] **Tests:** Added/updated and all pass
- [x] **Localization:** All end-user-facing strings can be localized
- [ ] **Dev docs:** Added/updated
- [ ] **New binaries:** Added on the required places
- [ ] [JSON for
signing](https://github.com/microsoft/PowerToys/blob/main/.pipelines/ESRPSigning_core.json)
for new binaries
- [ ] [WXS for
installer](https://github.com/microsoft/PowerToys/blob/main/installer/PowerToysSetup/Product.wxs)
for new binaries and localization folder
- [ ] [YML for CI
pipeline](https://github.com/microsoft/PowerToys/blob/main/.pipelines/ci/templates/build-powertoys-steps.yml)
for new test projects
- [ ] [YML for signed
pipeline](https://github.com/microsoft/PowerToys/blob/main/.pipelines/release.yml)
- [ ] **Documentation updated:** If checked, please file a pull request
on [our docs
repo](https://github.com/MicrosoftDocs/windows-uwp/tree/docs/hub/powertoys)
and link it here: #xxx
## Detailed Description of the Pull Request / Additional comments
The PR includes these changes:
* Updated Mouse Pointer Crosshairs XAML to include a new hotkey to start
the gliding cursor experience
* Added two sliders for fast/slow cursor movement
* mapped the new hotkey/XAML sliders through to the existing
MousePointerHotkeys project, dllmain.cpp
* Added a 10ms tick for Gliding cursor for crosshairs/cursor movement
* Added state for gliding functionality - horiz fast, horiz slow, vert
fast, vert slow, click
* added gates around the existing mouse movement hook to prevent mouse
movement when gliding
## Validation Steps Performed
Manual testing has been completed on several PCs to confirm the
following:
* Existing Mouse Pointer Crosshairs functionality is unchanged
* Gliding cursor settings are persisted/used by the gliding cursor code
* Gliding cursor restores Mouse Pointer Crosshairs state after the final
click has completed.
---------
Signed-off-by: Shawn Yuan <shuaiyuan@microsoft.com>
Co-authored-by: Niels Laute <niels.laute@live.nl>
Co-authored-by: Shawn Yuan <shuaiyuan@microsoft.com>
2025-08-21 06:53:20 +01:00
|
|
|
|
public int GlidingCursorTravelSpeed
|
|
|
|
|
|
{
|
|
|
|
|
|
get => MousePointerCrosshairsSettingsConfig.Properties.GlidingTravelSpeed.Value;
|
|
|
|
|
|
set
|
|
|
|
|
|
{
|
|
|
|
|
|
if (MousePointerCrosshairsSettingsConfig.Properties.GlidingTravelSpeed.Value != value)
|
|
|
|
|
|
{
|
|
|
|
|
|
MousePointerCrosshairsSettingsConfig.Properties.GlidingTravelSpeed.Value = value;
|
|
|
|
|
|
NotifyMousePointerCrosshairsPropertyChanged();
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public int GlidingCursorDelaySpeed
|
|
|
|
|
|
{
|
|
|
|
|
|
get => MousePointerCrosshairsSettingsConfig.Properties.GlidingDelaySpeed.Value;
|
|
|
|
|
|
set
|
|
|
|
|
|
{
|
|
|
|
|
|
if (MousePointerCrosshairsSettingsConfig.Properties.GlidingDelaySpeed.Value != value)
|
|
|
|
|
|
{
|
|
|
|
|
|
MousePointerCrosshairsSettingsConfig.Properties.GlidingDelaySpeed.Value = value;
|
|
|
|
|
|
NotifyMousePointerCrosshairsPropertyChanged();
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public HotkeySettings GlidingCursorActivationShortcut
|
|
|
|
|
|
{
|
|
|
|
|
|
get
|
|
|
|
|
|
{
|
|
|
|
|
|
return MousePointerCrosshairsSettingsConfig.Properties.GlidingCursorActivationShortcut;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
set
|
|
|
|
|
|
{
|
|
|
|
|
|
if (MousePointerCrosshairsSettingsConfig.Properties.GlidingCursorActivationShortcut != value)
|
|
|
|
|
|
{
|
|
|
|
|
|
MousePointerCrosshairsSettingsConfig.Properties.GlidingCursorActivationShortcut = value ?? MousePointerCrosshairsSettingsConfig.Properties.DefaultGlidingCursorActivationShortcut;
|
|
|
|
|
|
NotifyMousePointerCrosshairsPropertyChanged();
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2022-01-26 14:01:24 +00:00
|
|
|
|
public void NotifyMousePointerCrosshairsPropertyChanged([CallerMemberName] string propertyName = null)
|
2022-01-24 13:29:16 +00:00
|
|
|
|
{
|
|
|
|
|
|
OnPropertyChanged(propertyName);
|
|
|
|
|
|
|
2022-01-26 14:01:24 +00:00
|
|
|
|
SndMousePointerCrosshairsSettings outsettings = new SndMousePointerCrosshairsSettings(MousePointerCrosshairsSettingsConfig);
|
|
|
|
|
|
SndModuleSettings<SndMousePointerCrosshairsSettings> ipcMessage = new SndModuleSettings<SndMousePointerCrosshairsSettings>(outsettings);
|
2022-01-24 13:29:16 +00:00
|
|
|
|
SendConfigMSG(ipcMessage.ToJsonString());
|
2022-01-26 14:01:24 +00:00
|
|
|
|
SettingsUtils.SaveSettings(MousePointerCrosshairsSettingsConfig.ToJsonString(), MousePointerCrosshairsSettings.ModuleName);
|
2022-01-24 13:29:16 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2023-01-31 00:00:11 +01:00
|
|
|
|
public void RefreshEnabledState()
|
|
|
|
|
|
{
|
|
|
|
|
|
InitializeEnabledValues();
|
|
|
|
|
|
OnPropertyChanged(nameof(IsFindMyMouseEnabled));
|
|
|
|
|
|
OnPropertyChanged(nameof(IsMouseHighlighterEnabled));
|
2023-02-24 13:30:30 +00:00
|
|
|
|
OnPropertyChanged(nameof(IsMouseJumpEnabled));
|
2023-01-31 00:00:11 +01:00
|
|
|
|
OnPropertyChanged(nameof(IsMousePointerCrosshairsEnabled));
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2021-10-22 13:30:18 +01:00
|
|
|
|
private Func<string, int> SendConfigMSG { get; }
|
|
|
|
|
|
|
2022-10-26 14:02:31 +01:00
|
|
|
|
private GpoRuleConfigured _findMyMouseEnabledGpoRuleConfiguration;
|
|
|
|
|
|
private bool _findMyMouseEnabledStateIsGPOConfigured;
|
2021-10-22 13:30:18 +01:00
|
|
|
|
private bool _isFindMyMouseEnabled;
|
2022-02-11 22:52:57 +00:00
|
|
|
|
private int _findMyMouseActivationMethod;
|
2024-06-03 07:44:11 -04:00
|
|
|
|
private bool _findMyMouseIncludeWinKey;
|
2021-10-25 19:39:48 +01:00
|
|
|
|
private bool _findMyMouseDoNotActivateOnGameMode;
|
2021-11-23 16:52:17 +00:00
|
|
|
|
private string _findMyMouseBackgroundColor;
|
|
|
|
|
|
private string _findMyMouseSpotlightColor;
|
|
|
|
|
|
private int _findMyMouseSpotlightRadius;
|
|
|
|
|
|
private int _findMyMouseAnimationDurationMs;
|
|
|
|
|
|
private int _findMyMouseSpotlightInitialZoom;
|
2022-02-14 18:22:05 +00:00
|
|
|
|
private string _findMyMouseExcludedApps;
|
2022-03-04 12:28:11 +00:00
|
|
|
|
private int _findMyMouseShakingMinimumDistance;
|
2024-01-16 17:35:54 +00:00
|
|
|
|
private int _findMyMouseShakingIntervalMs;
|
|
|
|
|
|
private int _findMyMouseShakingFactor;
|
2021-11-22 13:31:31 +00:00
|
|
|
|
|
2022-10-26 14:02:31 +01:00
|
|
|
|
private GpoRuleConfigured _highlighterEnabledGpoRuleConfiguration;
|
|
|
|
|
|
private bool _highlighterEnabledStateIsGPOConfigured;
|
2021-11-22 13:31:31 +00:00
|
|
|
|
private bool _isMouseHighlighterEnabled;
|
|
|
|
|
|
private string _highlighterLeftButtonClickColor;
|
|
|
|
|
|
private string _highlighterRightButtonClickColor;
|
2023-07-26 23:48:00 +09:00
|
|
|
|
private string _highlighterAlwaysColor;
|
2025-06-27 14:11:39 +08:00
|
|
|
|
private bool _isSpotlightModeEnabled;
|
2021-11-22 13:31:31 +00:00
|
|
|
|
private int _highlighterRadius;
|
|
|
|
|
|
private int _highlightFadeDelayMs;
|
|
|
|
|
|
private int _highlightFadeDurationMs;
|
2023-08-08 18:01:23 +02:00
|
|
|
|
private bool _highlighterAutoActivate;
|
2022-01-24 13:29:16 +00:00
|
|
|
|
|
2022-10-26 14:02:31 +01:00
|
|
|
|
private GpoRuleConfigured _mousePointerCrosshairsEnabledGpoRuleConfiguration;
|
|
|
|
|
|
private bool _mousePointerCrosshairsEnabledStateIsGPOConfigured;
|
2022-01-26 14:01:24 +00:00
|
|
|
|
private bool _isMousePointerCrosshairsEnabled;
|
|
|
|
|
|
private string _mousePointerCrosshairsColor;
|
|
|
|
|
|
private int _mousePointerCrosshairsOpacity;
|
|
|
|
|
|
private int _mousePointerCrosshairsRadius;
|
|
|
|
|
|
private int _mousePointerCrosshairsThickness;
|
|
|
|
|
|
private string _mousePointerCrosshairsBorderColor;
|
|
|
|
|
|
private int _mousePointerCrosshairsBorderSize;
|
2023-07-18 14:33:32 +02:00
|
|
|
|
private bool _mousePointerCrosshairsAutoHide;
|
2023-07-19 07:24:47 -07:00
|
|
|
|
private bool _mousePointerCrosshairsIsFixedLengthEnabled;
|
|
|
|
|
|
private int _mousePointerCrosshairsFixedLength;
|
2025-09-29 03:32:07 +01:00
|
|
|
|
private int _mousePointerCrosshairsOrientation;
|
2023-08-08 18:01:23 +02:00
|
|
|
|
private bool _mousePointerCrosshairsAutoActivate;
|
2023-09-05 15:25:24 +02:00
|
|
|
|
private bool _isAnimationEnabledBySystem;
|
2021-10-22 13:30:18 +01:00
|
|
|
|
}
|
|
|
|
|
|
}
|