mirror of
https://github.com/microsoft/PowerToys.git
synced 2026-04-10 21:41:51 +02:00
[Settings] [VCM] Allow selecting a picture for VCM camera mute when running elevated (#24247)
* Fix the issue of not being able to select an image for VCM Camera mute while PowerToys is running elevated. * change the buffer size for Path and filename * move DLL import to native methods file * Adding comment to rember to move back to WinUI3 when it is fixed * making Dll Import methods internal * changes from comments * fix new c# errors * Remove async
This commit is contained in:
@@ -44,6 +44,9 @@ namespace Microsoft.PowerToys.Settings.UI.Helpers
|
|||||||
[DllImport("shell32.dll")]
|
[DllImport("shell32.dll")]
|
||||||
internal static extern int SHGetPathFromIDListW(IntPtr pidl, IntPtr pszPath);
|
internal static extern int SHGetPathFromIDListW(IntPtr pidl, IntPtr pszPath);
|
||||||
|
|
||||||
|
[DllImport("Comdlg32.dll", CharSet = CharSet.Unicode)]
|
||||||
|
internal static extern bool GetOpenFileName([In, Out] OpenFileName openFileName);
|
||||||
|
|
||||||
#pragma warning disable CA1401 // P/Invokes should not be visible
|
#pragma warning disable CA1401 // P/Invokes should not be visible
|
||||||
[DllImport("user32.dll")]
|
[DllImport("user32.dll")]
|
||||||
public static extern bool ShowWindow(System.IntPtr hWnd, int nCmdShow);
|
public static extern bool ShowWindow(System.IntPtr hWnd, int nCmdShow);
|
||||||
|
|||||||
36
src/settings-ui/Settings.UI/Helpers/OpenFileName.cs
Normal file
36
src/settings-ui/Settings.UI/Helpers/OpenFileName.cs
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
// 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;
|
||||||
|
using System.Diagnostics.CodeAnalysis;
|
||||||
|
using System.Runtime.InteropServices;
|
||||||
|
|
||||||
|
namespace Microsoft.PowerToys.Settings.UI.Helpers
|
||||||
|
{
|
||||||
|
[SuppressMessage("StyleCop.CSharp.MaintainabilityRules", "SA1401:FieldsMustBePrivate", Justification = "Reviewed.")]
|
||||||
|
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
|
||||||
|
public class OpenFileName
|
||||||
|
{
|
||||||
|
public int StructSize;
|
||||||
|
public IntPtr Hwnd = IntPtr.Zero;
|
||||||
|
public IntPtr Hinst = IntPtr.Zero;
|
||||||
|
public string Filter;
|
||||||
|
public string CustFilter;
|
||||||
|
public int CustFilterMax;
|
||||||
|
public int FilterIndex;
|
||||||
|
public string File;
|
||||||
|
public int MaxFile;
|
||||||
|
public string FileTitle;
|
||||||
|
public int MaxFileTitle;
|
||||||
|
public string InitialDir;
|
||||||
|
public string Title;
|
||||||
|
public int Flags;
|
||||||
|
public short FileOffset;
|
||||||
|
public short FileExtMax;
|
||||||
|
public string DefExt;
|
||||||
|
public int CustData;
|
||||||
|
public IntPtr Hook = IntPtr.Zero;
|
||||||
|
public string Template;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -30,7 +30,7 @@ namespace Microsoft.PowerToys.Settings.UI.ViewModels
|
|||||||
|
|
||||||
private Func<string, int> SendConfigMSG { get; }
|
private Func<string, int> SendConfigMSG { get; }
|
||||||
|
|
||||||
private Func<Task<string>> PickFileDialog { get; }
|
private Func<string> PickFileDialog { get; }
|
||||||
|
|
||||||
private string _settingsConfigFileFolder = string.Empty;
|
private string _settingsConfigFileFolder = string.Empty;
|
||||||
|
|
||||||
@@ -39,7 +39,7 @@ namespace Microsoft.PowerToys.Settings.UI.ViewModels
|
|||||||
ISettingsRepository<GeneralSettings> settingsRepository,
|
ISettingsRepository<GeneralSettings> settingsRepository,
|
||||||
ISettingsRepository<VideoConferenceSettings> videoConferenceSettingsRepository,
|
ISettingsRepository<VideoConferenceSettings> videoConferenceSettingsRepository,
|
||||||
Func<string, int> ipcMSGCallBackFunc,
|
Func<string, int> ipcMSGCallBackFunc,
|
||||||
Func<Task<string>> pickFileDialog,
|
Func<string> pickFileDialog,
|
||||||
string configFileSubfolder = "")
|
string configFileSubfolder = "")
|
||||||
{
|
{
|
||||||
PickFileDialog = pickFileDialog;
|
PickFileDialog = pickFileDialog;
|
||||||
@@ -197,11 +197,11 @@ namespace Microsoft.PowerToys.Settings.UI.ViewModels
|
|||||||
RaisePropertyChanged(nameof(CameraImageOverlayPath));
|
RaisePropertyChanged(nameof(CameraImageOverlayPath));
|
||||||
}
|
}
|
||||||
|
|
||||||
private async void SelectOverlayImageAction()
|
private void SelectOverlayImageAction()
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
string pickedImage = await PickFileDialog().ConfigureAwait(true);
|
string pickedImage = PickFileDialog();
|
||||||
if (pickedImage != null)
|
if (pickedImage != null)
|
||||||
{
|
{
|
||||||
CameraImageOverlayPath = pickedImage;
|
CameraImageOverlayPath = pickedImage;
|
||||||
|
|||||||
@@ -3,13 +3,12 @@
|
|||||||
// See the LICENSE file in the project root for more information.
|
// See the LICENSE file in the project root for more information.
|
||||||
|
|
||||||
using System;
|
using System;
|
||||||
|
using System.Runtime.InteropServices;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using Microsoft.PowerToys.Settings.UI.Helpers;
|
using Microsoft.PowerToys.Settings.UI.Helpers;
|
||||||
using Microsoft.PowerToys.Settings.UI.Library;
|
using Microsoft.PowerToys.Settings.UI.Library;
|
||||||
using Microsoft.PowerToys.Settings.UI.ViewModels;
|
using Microsoft.PowerToys.Settings.UI.ViewModels;
|
||||||
using Microsoft.UI.Xaml.Controls;
|
using Microsoft.UI.Xaml.Controls;
|
||||||
using Windows.Storage;
|
|
||||||
using Windows.Storage.Pickers;
|
|
||||||
|
|
||||||
namespace Microsoft.PowerToys.Settings.UI.Views
|
namespace Microsoft.PowerToys.Settings.UI.Views
|
||||||
{
|
{
|
||||||
@@ -17,19 +16,31 @@ namespace Microsoft.PowerToys.Settings.UI.Views
|
|||||||
{
|
{
|
||||||
private VideoConferenceViewModel ViewModel { get; set; }
|
private VideoConferenceViewModel ViewModel { get; set; }
|
||||||
|
|
||||||
private static async Task<string> PickFileDialog()
|
private static string PickFileDialog()
|
||||||
{
|
{
|
||||||
FileOpenPicker openPicker = new FileOpenPicker();
|
// this code was changed to solve the problem with WinUI3 that prevents to select a file
|
||||||
openPicker.ViewMode = PickerViewMode.Thumbnail;
|
// while running elevated, when the issue is solved in WinUI3 it should be changed back
|
||||||
openPicker.SuggestedStartLocation = PickerLocationId.PicturesLibrary;
|
OpenFileName openFileName = new OpenFileName();
|
||||||
openPicker.FileTypeFilter.Add(".jpg");
|
openFileName.StructSize = Marshal.SizeOf(openFileName);
|
||||||
openPicker.FileTypeFilter.Add(".jpeg");
|
openFileName.Filter = "Images(*.jpg,*.jpeg,*.png)\0*.jpg;*.jpeg;*.png\0";
|
||||||
openPicker.FileTypeFilter.Add(".png");
|
|
||||||
var hwnd = WinRT.Interop.WindowNative.GetWindowHandle(App.GetSettingsWindow());
|
|
||||||
WinRT.Interop.InitializeWithWindow.Initialize(openPicker, hwnd);
|
|
||||||
|
|
||||||
StorageFile file = await openPicker.PickSingleFileAsync();
|
// make buffer 65k bytes big as the MAX_PATH can be ~32k chars if long path is enable
|
||||||
return file?.Path;
|
// and unicode uses 2 bytes per character
|
||||||
|
openFileName.File = new string(new char[65000]);
|
||||||
|
openFileName.MaxFile = openFileName.File.Length;
|
||||||
|
openFileName.FileTitle = new string(new char[65000]);
|
||||||
|
openFileName.MaxFileTitle = openFileName.FileTitle.Length;
|
||||||
|
openFileName.InitialDir = null;
|
||||||
|
openFileName.Title = string.Empty;
|
||||||
|
openFileName.DefExt = null;
|
||||||
|
|
||||||
|
bool result = NativeMethods.GetOpenFileName(openFileName);
|
||||||
|
if (result)
|
||||||
|
{
|
||||||
|
return openFileName.File;
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
public VideoConferencePage()
|
public VideoConferencePage()
|
||||||
|
|||||||
Reference in New Issue
Block a user