[WIP] Partially working taskbar moving

This commit is contained in:
Terry MacDonald 2022-01-30 20:24:36 +13:00
parent 71505faa13
commit cd25f9a0fa
10 changed files with 364 additions and 112 deletions

View File

@ -131,6 +131,22 @@ namespace DisplayMagician
[SuppressUnmanagedCodeSecurity]
internal static class NativeMethods
{
[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
private static extern IntPtr SendMessageTimeout(IntPtr windowHandle, uint message, IntPtr wordParameter, IntPtr longParameter, SendMessageTimeoutFlag flag, uint timeout, out IntPtr resultHandle);
[Flags]
public enum SendMessageTimeoutFlag : uint
{
SMTO_NORMAL = 0x0,
SMTO_BLOCK = 0x1,
SMTO_ABORTIFHUNG = 0x2,
SMTO_NOTIMEOUTIFNOTHUNG = 0x8,
SMTO_ERRORONEXIT = 0x20
}
public const Int32 WM_WININICHANGE = 0x001A;
/// <summary>
/// Delegate declaration that matches WndProc signatures.
/// </summary>

View File

@ -26,8 +26,8 @@ using System.Resources;
[assembly: Guid("e4ceaf5e-ad01-4695-b179-31168eb74c48")]
// Version information
[assembly: AssemblyVersion("2.2.0.112")]
[assembly: AssemblyFileVersion("2.2.0.112")]
[assembly: AssemblyVersion("2.2.0.152")]
[assembly: AssemblyFileVersion("2.2.0.152")]
[assembly: NeutralResourcesLanguageAttribute( "en" )]
[assembly: CLSCompliant(true)]

View File

@ -629,6 +629,7 @@ namespace DisplayMagician.UIForms
// otherwise we'll save it only when the user wants to save this profile.
if (_saveOrRenameMode == "rename" && profileSettingsForm.ProfileSettingChanged)
{
//_selectedProfile = profileSettingsForm.Profile;
ProfileRepository.SaveProfiles();
}
}

View File

@ -40,8 +40,13 @@ namespace DisplayMagician.UIForms
this.btn_select = new System.Windows.Forms.Button();
this.lbl_style = new System.Windows.Forms.Label();
this.cmb_wallpaper_display_mode = new System.Windows.Forms.ComboBox();
this.gb_taskbar = new System.Windows.Forms.GroupBox();
this.cmb_forced_taskbar_location = new System.Windows.Forms.ComboBox();
this.rb_default_taskbar = new System.Windows.Forms.RadioButton();
this.rb_forced_taskbar = new System.Windows.Forms.RadioButton();
this.gb_general.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.pb_wallpaper)).BeginInit();
this.gb_taskbar.SuspendLayout();
this.SuspendLayout();
//
// btn_back
@ -52,7 +57,7 @@ namespace DisplayMagician.UIForms
this.btn_back.FlatAppearance.MouseOverBackColor = System.Drawing.Color.Brown;
this.btn_back.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
this.btn_back.ForeColor = System.Drawing.Color.White;
this.btn_back.Location = new System.Drawing.Point(476, 436);
this.btn_back.Location = new System.Drawing.Point(476, 554);
this.btn_back.Name = "btn_back";
this.btn_back.Size = new System.Drawing.Size(75, 23);
this.btn_back.TabIndex = 9;
@ -73,7 +78,7 @@ namespace DisplayMagician.UIForms
this.gb_general.Controls.Add(this.cmb_wallpaper_display_mode);
this.gb_general.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.gb_general.ForeColor = System.Drawing.Color.White;
this.gb_general.Location = new System.Drawing.Point(27, 27);
this.gb_general.Location = new System.Drawing.Point(27, 131);
this.gb_general.Name = "gb_general";
this.gb_general.Size = new System.Drawing.Size(525, 381);
this.gb_general.TabIndex = 11;
@ -205,12 +210,62 @@ namespace DisplayMagician.UIForms
this.cmb_wallpaper_display_mode.TabIndex = 12;
this.cmb_wallpaper_display_mode.SelectedIndexChanged += new System.EventHandler(this.cmb_wallpaper_display_mode_SelectedIndexChanged);
//
// gb_taskbar
//
this.gb_taskbar.Controls.Add(this.rb_default_taskbar);
this.gb_taskbar.Controls.Add(this.rb_forced_taskbar);
this.gb_taskbar.Controls.Add(this.cmb_forced_taskbar_location);
this.gb_taskbar.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.gb_taskbar.ForeColor = System.Drawing.Color.White;
this.gb_taskbar.Location = new System.Drawing.Point(27, 22);
this.gb_taskbar.Name = "gb_taskbar";
this.gb_taskbar.Size = new System.Drawing.Size(524, 100);
this.gb_taskbar.TabIndex = 12;
this.gb_taskbar.TabStop = false;
this.gb_taskbar.Text = "TaskBar Settings";
//
// cmb_forced_taskbar_location
//
this.cmb_forced_taskbar_location.Enabled = false;
this.cmb_forced_taskbar_location.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.cmb_forced_taskbar_location.FormattingEnabled = true;
this.cmb_forced_taskbar_location.Location = new System.Drawing.Point(220, 59);
this.cmb_forced_taskbar_location.Name = "cmb_forced_taskbar_location";
this.cmb_forced_taskbar_location.Size = new System.Drawing.Size(189, 24);
this.cmb_forced_taskbar_location.TabIndex = 13;
this.cmb_forced_taskbar_location.SelectedIndexChanged += new System.EventHandler(this.cmb_forced_taskbar_location_SelectedIndexChanged);
//
// rb_default_taskbar
//
this.rb_default_taskbar.AutoSize = true;
this.rb_default_taskbar.Checked = true;
this.rb_default_taskbar.Location = new System.Drawing.Point(28, 34);
this.rb_default_taskbar.Name = "rb_default_taskbar";
this.rb_default_taskbar.Size = new System.Drawing.Size(288, 20);
this.rb_default_taskbar.TabIndex = 24;
this.rb_default_taskbar.TabStop = true;
this.rb_default_taskbar.Text = "Leave TaskBar Location as set by Windows";
this.rb_default_taskbar.UseVisualStyleBackColor = true;
this.rb_default_taskbar.CheckedChanged += new System.EventHandler(this.rb_default_taskbar_CheckedChanged);
//
// rb_forced_taskbar
//
this.rb_forced_taskbar.AutoSize = true;
this.rb_forced_taskbar.Location = new System.Drawing.Point(28, 60);
this.rb_forced_taskbar.Name = "rb_forced_taskbar";
this.rb_forced_taskbar.Size = new System.Drawing.Size(190, 20);
this.rb_forced_taskbar.TabIndex = 23;
this.rb_forced_taskbar.Text = "Force TaskBar Location to :";
this.rb_forced_taskbar.UseVisualStyleBackColor = true;
this.rb_forced_taskbar.CheckedChanged += new System.EventHandler(this.rb_forced_taskbar_CheckedChanged);
//
// ProfileSettingsForm
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.BackColor = System.Drawing.Color.Black;
this.ClientSize = new System.Drawing.Size(580, 483);
this.ClientSize = new System.Drawing.Size(580, 594);
this.Controls.Add(this.gb_taskbar);
this.Controls.Add(this.gb_general);
this.Controls.Add(this.btn_back);
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
@ -227,6 +282,8 @@ namespace DisplayMagician.UIForms
this.gb_general.ResumeLayout(false);
this.gb_general.PerformLayout();
((System.ComponentModel.ISupportInitialize)(this.pb_wallpaper)).EndInit();
this.gb_taskbar.ResumeLayout(false);
this.gb_taskbar.PerformLayout();
this.ResumeLayout(false);
}
@ -243,5 +300,9 @@ namespace DisplayMagician.UIForms
private System.Windows.Forms.RadioButton rb_leave_wallpaper;
private System.Windows.Forms.RadioButton rb_clear_wallpaper;
private System.Windows.Forms.RadioButton rb_apply_wallpaper;
private System.Windows.Forms.GroupBox gb_taskbar;
private System.Windows.Forms.RadioButton rb_default_taskbar;
private System.Windows.Forms.RadioButton rb_forced_taskbar;
private System.Windows.Forms.ComboBox cmb_forced_taskbar_location;
}
}

View File

@ -1,4 +1,5 @@
using DisplayMagicianShared;
using DisplayMagicianShared.Windows;
//using Microsoft.Win32;
using NHotkey;
using NHotkey.WindowsForms;
@ -19,6 +20,7 @@ namespace DisplayMagician.UIForms
private Dictionary<Wallpaper.Style, string> wallpaperStyleText = new Dictionary<Wallpaper.Style, string>();
Bitmap wallpaperImage = null;
private Dictionary<TaskBarStuckRectangle.TaskBarForcedEdge, string> forcedTaskBarEdgeText = new Dictionary<TaskBarStuckRectangle.TaskBarForcedEdge, string>();
private bool _profileSettingChanged = false;
public ProfileSettingsForm()
@ -38,6 +40,28 @@ namespace DisplayMagician.UIForms
cmb_wallpaper_display_mode.DisplayMember = "Value";
cmb_wallpaper_display_mode.ValueMember = "Text";
cmb_wallpaper_display_mode.DataSource = new BindingSource(wallpaperStyleText, null);
// Populate the Forced Taskbar Location dictionary
if (Utils.IsWindows11())
{
// Is Windows 11
forcedTaskBarEdgeText.Add(TaskBarStuckRectangle.TaskBarForcedEdge.Left, "Left");
forcedTaskBarEdgeText.Add(TaskBarStuckRectangle.TaskBarForcedEdge.Top, "Top");
forcedTaskBarEdgeText.Add(TaskBarStuckRectangle.TaskBarForcedEdge.Right, "Right");
forcedTaskBarEdgeText.Add(TaskBarStuckRectangle.TaskBarForcedEdge.Bottom, "Bottom");
}
else
{
// Is Windows 10
forcedTaskBarEdgeText.Add(TaskBarStuckRectangle.TaskBarForcedEdge.Left, "Left");
forcedTaskBarEdgeText.Add(TaskBarStuckRectangle.TaskBarForcedEdge.Top, "Top");
forcedTaskBarEdgeText.Add(TaskBarStuckRectangle.TaskBarForcedEdge.Right, "Right");
forcedTaskBarEdgeText.Add(TaskBarStuckRectangle.TaskBarForcedEdge.Bottom, "Bottom");
}
cmb_forced_taskbar_location.DisplayMember = "Value";
cmb_forced_taskbar_location.ValueMember = "Text";
cmb_forced_taskbar_location.DataSource = new BindingSource(forcedTaskBarEdgeText, null);
}
public ProfileItem Profile
@ -89,6 +113,18 @@ namespace DisplayMagician.UIForms
cmb_wallpaper_display_mode.SelectedIndex = 0;
}
if (Profile.ForcedTaskBarEdge.Equals(TaskBarStuckRectangle.TaskBarForcedEdge.None))
{
rb_default_taskbar.Checked = true;
cmb_forced_taskbar_location.SelectedIndex = 3;
}
else
{
rb_forced_taskbar.Checked = true;
cmb_forced_taskbar_location.SelectedIndex = cmb_forced_taskbar_location.FindStringExact(forcedTaskBarEdgeText[Profile.ForcedTaskBarEdge]);
}
}
private void ProfileSettingsForm_FormClosing(object sender, FormClosingEventArgs e)
@ -107,6 +143,18 @@ namespace DisplayMagician.UIForms
}
Profile.WallpaperStyle = ((KeyValuePair<Wallpaper.Style, string>)cmb_wallpaper_display_mode.SelectedItem).Key;
if (rb_default_taskbar.Checked)
{
Profile.ForcedTaskBarEdge = TaskBarStuckRectangle.TaskBarForcedEdge.None;
}
else
{
Profile.ForcedTaskBarEdge = ((KeyValuePair<TaskBarStuckRectangle.TaskBarForcedEdge, string>)cmb_forced_taskbar_location.SelectedItem).Key;
}
// Apply the changed taskbar settings to the windows config if needed
WINDOWS_DISPLAY_CONFIG winDispConfig = Profile.WindowsDisplayConfig;
TaskBarStuckRectangle.ForceTaskBarIfNeeded(ref winDispConfig.TaskBarLayout, Profile.ForcedTaskBarEdge);
}
private void btn_back_Click(object sender, EventArgs e)
@ -315,5 +363,30 @@ namespace DisplayMagician.UIForms
}
}
private void cmb_forced_taskbar_location_SelectedIndexChanged(object sender, EventArgs e)
{
_profileSettingChanged = true;
}
private void rb_default_taskbar_CheckedChanged(object sender, EventArgs e)
{
_profileSettingChanged = true;
if (rb_default_taskbar.Checked)
{
// Disable all the things
cmb_forced_taskbar_location.Enabled = false;
}
}
private void rb_forced_taskbar_CheckedChanged(object sender, EventArgs e)
{
_profileSettingChanged = true;
if (rb_forced_taskbar.Checked)
{
// Disable all the things
cmb_forced_taskbar_location.Enabled = true;
}
}
}
}

View File

@ -73,6 +73,7 @@ namespace DisplayMagicianShared
private bool _isPossible = false;
private Keys _hotkey = Keys.None;
private string _wallpaperBitmapFilename = "";
private TaskBarStuckRectangle.TaskBarForcedEdge _forcedTaskBarEdge = TaskBarStuckRectangle.TaskBarForcedEdge.None;
#region JsonConverterBitmap
@ -289,6 +290,17 @@ namespace DisplayMagicianShared
}
public string SavedProfileIconCacheFilename { get; set; }
public TaskBarStuckRectangle.TaskBarForcedEdge ForcedTaskBarEdge {
get
{
return _forcedTaskBarEdge;
}
set
{
_forcedTaskBarEdge = value;
}
}
public Wallpaper.Mode WallpaperMode { get; set; }
@ -449,6 +461,7 @@ namespace DisplayMagicianShared
profile.WallpaperMode = WallpaperMode;
profile.WallpaperBitmapFilename = WallpaperBitmapFilename;
profile.WallpaperStyle = WallpaperStyle;
profile.ForcedTaskBarEdge = ForcedTaskBarEdge;
return true;
}
@ -672,11 +685,10 @@ namespace DisplayMagicianShared
// Lets update the screens so Windows knows whats happening
// NVIDIA makes such large changes to the available screens in windows, we need to do this.
winLibrary.UpdateActiveConfig();
// Then let's try to also apply the windows changes
// Note: we are unable to check if the Windows CCD display config is possible, as it won't match if either the current display config is a Mosaic config,
// or if the display config we want to change to is a Mosaic config. So we just have to assume that it will work!
// or if the display config we want to change to is a Mosaic config. So we just have to assume that it will work
bool itWorkedforWindows = winLibrary.SetActiveConfig(_windowsDisplayConfig);
if (itWorkedforWindows)
{

View File

@ -839,7 +839,24 @@ namespace DisplayMagicianShared
// We do the actual change we were trying to do
try
{
// Now we try to patch in a Windows Taskbar Stuck Rects list into the json if there isnt one
SharedLogger.logger.Trace($"ProfileRepository/MigrateJsonToLatestVersion: Looking for a missing ForcedTaskBarEdge setting in Profile.");
// Create a default object (a default of NONE)
TaskBarStuckRectangle.TaskBarForcedEdge taskBarForcedEdge = TaskBarStuckRectangle.TaskBarForcedEdge.None;
for (int i = 0; i < root.Count; i++)
{
JObject profile = (JObject)root[i];
JValue forcedTaskBarEdge = (JValue)profile.SelectToken("ForcedTaskBarEdge");
if (forcedTaskBarEdge == null)
{
JProperty newForcedTaskBarEdge = new JProperty("ForcedTaskBarEdge", TaskBarStuckRectangle.TaskBarForcedEdge.None);
profile.Add("ForcedTaskBarEdge", newForcedTaskBarEdge);
changedJson = true;
SharedLogger.logger.Trace($"ProfileRepository/MigrateJsonToLatestVersion: Patched missing ForcedTaskBarEdge in profile {profile.SelectToken("Name")} (index {i}).");
}
}
// Now we try to patch in a Windows Taskbar Stuck Rects list into the json if there isnt one
SharedLogger.logger.Trace($"ProfileRepository/MigrateJsonToLatestVersion: Looking for missing Windows Taskbar layout.");
// Create a default object (an empty list)
@ -879,11 +896,11 @@ namespace DisplayMagicianShared
}
catch (JsonReaderException ex)
{
SharedLogger.logger.Error($"ProfileRepository/MigrateJsonToLatestVersion: JSONReaderException while trying to process the Profiles json data to migrate any older feature to the latest version.");
SharedLogger.logger.Error(ex, $"ProfileRepository/MigrateJsonToLatestVersion: JSONReaderException while trying to process the Profiles json data to migrate any older feature to the latest version.");
}
catch (Exception ex)
{
SharedLogger.logger.Error($"ProfileRepository/MigrateJsonToLatestVersion: Exception while trying to process the Profiles json data to migrate any older feature to the latest version.");
SharedLogger.logger.Error(ex, $"ProfileRepository/MigrateJsonToLatestVersion: Exception while trying to process the Profiles json data to migrate any older feature to the latest version.");
}
// Now write the changed json to the json string but only if we've changed something

View File

@ -300,7 +300,7 @@ namespace DisplayMagicianShared
RestartManagerSession restartManager = new RestartManagerSession();
FileInfo explorerFileInfo = new FileInfo(@"C:\Windows\explorer.exe");
restartManager.RegisterProcessFile(explorerFileInfo);
restartManager.Shutdown(RestartManagerSession.ShutdownType.ForceShutdown);
restartManager.Shutdown(RestartManagerSession.ShutdownType.Normal);
restartManager.Restart();
restartManager.Dispose();
return true;

View File

@ -2,6 +2,7 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
@ -18,5 +19,25 @@ namespace DisplayMagicianShared
return currentBuild >= 22000;
}
[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
public static extern IntPtr SendMessageTimeout(IntPtr windowHandle, uint message, IntPtr wordParameter, IntPtr longParameter, SendMessageTimeoutFlag flag, uint timeout, out IntPtr resultHandle);
[DllImport("User32.dll", SetLastError = true, CharSet = CharSet.Auto)]
public static extern bool SendNotifyMessage(IntPtr hWnd, uint Msg, UIntPtr wParam, string lParam);
[Flags]
public enum SendMessageTimeoutFlag : uint
{
SMTO_NORMAL = 0x0,
SMTO_BLOCK = 0x1,
SMTO_ABORTIFHUNG = 0x2,
SMTO_NOTIMEOUTIFNOTHUNG = 0x8,
SMTO_ERRORONEXIT = 0x20
}
public const int NULL = 0;
public const int HWND_BROADCAST = 0xffff;
public const int WM_SETTINGCHANGE = 0x001a;
}
}

View File

@ -2,7 +2,8 @@
using System.Collections.Generic;
using System.Drawing;
using System.Text.RegularExpressions;
using DisplayMagicianShared.Windows;
using System.Threading.Tasks;
using DisplayMagicianShared;
using Microsoft.Win32;
using Newtonsoft.Json;
@ -15,6 +16,15 @@ namespace DisplayMagicianShared.Windows
{
public class TaskBarStuckRectangle
{
public enum TaskBarForcedEdge : UInt32
{
Left = 0,
Top = 1,
Right = 2,
Bottom = 3,
None = 9999
}
public enum TaskBarEdge : UInt32
{
Left = 0,
@ -87,6 +97,8 @@ namespace DisplayMagicianShared.Windows
public byte[] Binary { get; set; }
public byte[] BinaryBackup { get; set; }
public string DevicePath { get; set; }
public bool MainScreen { get; set; }
@ -259,16 +271,23 @@ namespace DisplayMagicianShared.Windows
public override bool Equals(object obj) => obj is TaskBarStuckRectangle other && this.Equals(other);
public bool Equals(TaskBarStuckRectangle other)
=> Version == other.Version &&
MainScreen == other.MainScreen &&
DevicePath == other.DevicePath &&
Xor(Binary, other.Binary);
{
// We return all the fields
return Version == other.Version &&
MainScreen == other.MainScreen &&
DevicePath == other.DevicePath &&
Edge == other.Edge &&
Location == other.Location;
// &&
//Xor(Binary, other.Binary);
}
public override int GetHashCode()
{
//return (DisplayConfigPaths, DisplayConfigModes, DisplayHDRStates, GdiDisplaySettings.Values, IsCloned, DisplayIdentifiers).GetHashCode();
return (Version, MainScreen, DevicePath, Binary).GetHashCode();
//return (Version, MainScreen, DevicePath, Binary).GetHashCode();
return (Version, MainScreen, DevicePath, Edge, Location).GetHashCode();
}
public static bool operator ==(TaskBarStuckRectangle lhs, TaskBarStuckRectangle rhs) => lhs.Equals(rhs);
@ -292,80 +311,13 @@ namespace DisplayMagicianShared.Windows
}
/*public static TaskBarStuckRectangle GetCurrent()
{
return GetCurrent((string)null);
}*/
/*public static TaskBarStuckRectangle GetCurrent(PathDisplayTarget pathTargetInfo)
{
var devicePath = pathTargetInfo?.DevicePath;
var index = devicePath?.IndexOf("{", StringComparison.InvariantCultureIgnoreCase);
if (index > 0)
{
devicePath = devicePath.Substring(0, index.Value).TrimEnd('#');
}
index = devicePath?.IndexOf("#", StringComparison.InvariantCultureIgnoreCase);
if (index > 0)
{
devicePath = devicePath.Substring(index.Value).TrimStart('#');
}
return GetCurrent(devicePath);
}*/
public static List<TaskBarStuckRectangle> GetCurrent(List<string> displayIdentifiers)
{
List<TaskBarStuckRectangle> taskBarStuckRectangles = new List<TaskBarStuckRectangle>();
int version = 2;
var address = string.Format(MainDisplayAddress, version);
if (Registry.CurrentUser.OpenSubKey(address) == null)
{
// If it's not version 2, then try version 3
version = 3;
address = string.Format(MainDisplayAddress, version);
if (Registry.CurrentUser.OpenSubKey(address) == null)
{
// It's not v2 or v3, so error
version = -1;
}
}
if (version >= 2)
{
// Grab the main screen taskbar placement
try
{
using (var key = Registry.CurrentUser.OpenSubKey(
address,
RegistryKeyPermissionCheck.ReadSubTree))
{
var settings = key?.GetValue("Settings") as byte[];
if (settings?.Length > 0)
{
TaskBarStuckRectangle taskBarStuckRectangle = new TaskBarStuckRectangle
{
MainScreen = true,
DevicePath = "Settings",
Binary = settings,
Version = version
};
taskBarStuckRectangles.Add(taskBarStuckRectangle);
}
}
}
catch (Exception ex)
{
SharedLogger.logger.Error(ex, $"TaskBarStuckRectangle/GetCurrent: Unable to read the Main Screen TaskBarStuckRectangle registry settings due to an exception!");
}
}
version = 2;
string address = "";
address = string.Format(MultiDisplayAddress, version);
if (Registry.CurrentUser.OpenSubKey(address) == null)
{
@ -396,7 +348,6 @@ namespace DisplayMagicianShared.Windows
RegistryKeyPermissionCheck.ReadSubTree))
{
var settings = key?.GetValue(tbStuckRectKey) as byte[];
if (settings?.Length > 0)
{
taskBarStuckRectangle = new TaskBarStuckRectangle
@ -404,6 +355,7 @@ namespace DisplayMagicianShared.Windows
MainScreen = false,
DevicePath = tbStuckRectKey,
Binary = settings,
BinaryBackup = settings,
Version = version
};
taskBarStuckRectangles.Add(taskBarStuckRectangle);
@ -413,7 +365,7 @@ namespace DisplayMagicianShared.Windows
{
SharedLogger.logger.Trace($"WinLibrary/GetWindowsDisplayConfig: Unable to get the TaskBarStuckRectangle for {displayId}.");
}
}
}
}
else
{
@ -422,43 +374,100 @@ namespace DisplayMagicianShared.Windows
}
}
version = 2;
address = string.Format(MainDisplayAddress, version);
if (Registry.CurrentUser.OpenSubKey(address) == null)
{
// If it's not version 2, then try version 3
version = 3;
address = string.Format(MainDisplayAddress, version);
if (Registry.CurrentUser.OpenSubKey(address) == null)
{
// It's not v2 or v3, so error
version = -1;
}
}
if (version >= 2)
{
// Grab the main screen taskbar placement
try
{
using (var key = Registry.CurrentUser.OpenSubKey(
address,
RegistryKeyPermissionCheck.ReadSubTree))
{
var settings = key?.GetValue("Settings") as byte[];
if (settings?.Length > 0)
{
TaskBarStuckRectangle taskBarStuckRectangle = new TaskBarStuckRectangle
{
MainScreen = true,
DevicePath = "Settings",
Binary = settings,
BinaryBackup = settings,
Version = version
};
taskBarStuckRectangles.Add(taskBarStuckRectangle);
}
}
}
catch (Exception ex)
{
SharedLogger.logger.Error(ex, $"TaskBarStuckRectangle/GetCurrent: Unable to read the Main Screen TaskBarStuckRectangle registry settings due to an exception!");
}
}
return taskBarStuckRectangles;
}
public static bool Apply(List<TaskBarStuckRectangle> taskBarStuckRectangles)
public static bool ForceTaskBarIfNeeded(ref List<TaskBarStuckRectangle> taskBarStuckRectangles, TaskBarForcedEdge forcedEdge = TaskBarForcedEdge.None)
{
if (taskBarStuckRectangles.Count == 0)
try
{
if (forcedEdge != TaskBarForcedEdge.None)
{
for (int i = 0; i < taskBarStuckRectangles.Count; i++)
{
// Force the taskbar change
taskBarStuckRectangles[i].Edge = (TaskBarEdge)forcedEdge;
taskBarStuckRectangles[i].Location = Rectangle.Empty;
}
}
else if (forcedEdge == TaskBarForcedEdge.None)
{
// Revert the forced taskbar change from the backup
for (int i = 0; i < taskBarStuckRectangles.Count; i++)
{
taskBarStuckRectangles[i].Binary = taskBarStuckRectangles[i].BinaryBackup;
}
}
return true;
}
catch (Exception ex)
{
return false;
}
}
public static bool Apply(List<TaskBarStuckRectangle> taskBarStuckRectangles, TaskBarForcedEdge forcedEdge = TaskBarForcedEdge.None)
{
string address;
if (taskBarStuckRectangles.Count < 1)
{
SharedLogger.logger.Trace($"TaskBarStuckRectangle/Apply: There are no TaskBarStuckRectangle registry settings to apply! This taskbar configuration is invalid.");
return false;
}
foreach (TaskBarStuckRectangle tbsr in taskBarStuckRectangles)
{
if (tbsr.Version >= 2 && tbsr.Version <= 3)
{
if (tbsr.MainScreen)
{
address = string.Format(MainDisplayAddress, tbsr.Version);
// Grab the main screen taskbar placement
try
{
using (var key = Registry.CurrentUser.OpenSubKey(
address,
RegistryKeyPermissionCheck.ReadWriteSubTree))
{
key.SetValue("Settings", tbsr.Binary);
SharedLogger.logger.Trace($"TaskBarStuckRectangle/Apply: Successfully applied TaskBarStuckRectangle registry settings for the Main Screen!");
}
}
catch (Exception ex)
{
SharedLogger.logger.Error(ex, $"TaskBarStuckRectangle/GetCurrent: Unable to set the Main Screen TaskBarStuckRectangle registry settings due to an exception!");
}
}
else
if (!tbsr.MainScreen)
{
address = string.Format(MultiDisplayAddress, tbsr.Version);
// Grab the main screen taskbar placement
@ -473,6 +482,40 @@ namespace DisplayMagicianShared.Windows
}
}
catch (Exception ex)
{
SharedLogger.logger.Error(ex, $"TaskBarStuckRectangle/GetCurrent: Unable to set the {tbsr.DevicePath} TaskBarStuckRectangle registry settings due to an exception!");
}
}
}
else
{
SharedLogger.logger.Error($"TaskBarStuckRectangle/GetCurrent: Unable to set the {tbsr.DevicePath} TaskBarStuckRectangle registry settings as the version isn't v2 or v3!");
}
}
// Tell Windows to refresh the Windows Taskbar (which will only refresh the non-main screen)
Utils.SendNotifyMessage((IntPtr)Utils.HWND_BROADCAST, Utils.WM_SETTINGCHANGE, (UIntPtr)Utils.NULL, "TraySettings");
foreach (TaskBarStuckRectangle tbsr in taskBarStuckRectangles)
{
if (tbsr.Version >= 2 && tbsr.Version <= 3)
{
if (tbsr.MainScreen)
{
address = string.Format(MainDisplayAddress, tbsr.Version);
// Grab the main screen taskbar placement
try
{
using (var key2 = Registry.CurrentUser.OpenSubKey(
address,
RegistryKeyPermissionCheck.ReadWriteSubTree))
{
key2.SetValue("Settings", tbsr.Binary);
SharedLogger.logger.Trace($"TaskBarStuckRectangle/Apply: Successfully applied TaskBarStuckRectangle registry settings for the Main Screen!");
}
}
catch (Exception ex)
{
SharedLogger.logger.Error(ex, $"TaskBarStuckRectangle/GetCurrent: Unable to set the Main Screen TaskBarStuckRectangle registry settings due to an exception!");
}
@ -480,10 +523,18 @@ namespace DisplayMagicianShared.Windows
}
else
{
SharedLogger.logger.Error($"TaskBarStuckRectangle/GetCurrent: Unable to set the Main Screen TaskBarStuckRectangle registry settings due to an exception!");
SharedLogger.logger.Error($"TaskBarStuckRectangle/GetCurrent: Unable to set the Main Screen TaskBarStuckRectangle registry settings as the version isn't v2 or v3!");
}
}
// Tell Windows to refresh the Windows Taskbar (which will only refresh the non-main screen)
Utils.SendNotifyMessage((IntPtr)Utils.HWND_BROADCAST, Utils.WM_SETTINGCHANGE, (UIntPtr)Utils.NULL, "TraySettings");
Task.Delay(2000);
// This will refresh the main screen as well. No idea why the above notification doesn't update the main screen too :/)
//RestartManagerSession.RestartExplorer();
return true;
}
}