mirror of
https://github.com/microsoft/PowerToys.git
synced 2025-12-15 11:17:53 +01:00
## Summary of the Pull Request Adds basic support for finding, listing, and executing Windows App Actions on files found by the Microsoft.CmdPal.Ext.Indexer extension. ## PR Checklist - [X] **Closes:** #39926 - [X] **Communication:** I've discussed this with core contributors already. If work hasn't been agreed, this work might be rejected - [ ] **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 We also update cswin32 to stable version. <!-- Describe how you validated the behavior. Add automated tests wherever possible, but list manual validation steps taken as well --> ## Validation Steps Performed Validated that it doesn't show on older versions of Windows (<26100 insiders) and that it does work on newer version that have the App Actions runtime. --------- Co-authored-by: Gordon Lam (SH) <yeelam@microsoft.com> Co-authored-by: Mike Griese <migrie@microsoft.com> Co-authored-by: Leilei Zhang <leilzh@microsoft.com>
145 lines
5.1 KiB
C#
145 lines
5.1 KiB
C#
// 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 ManagedCommon;
|
|
using Microsoft.Extensions.DependencyInjection;
|
|
using Microsoft.Extensions.Hosting;
|
|
using Microsoft.PowerToys.Telemetry;
|
|
using Microsoft.UI.Xaml;
|
|
using Peek.Common;
|
|
using Peek.FilePreviewer;
|
|
using Peek.FilePreviewer.Models;
|
|
using Peek.UI.Native;
|
|
using Peek.UI.Telemetry.Events;
|
|
using Peek.UI.Views;
|
|
using PowerToys.Interop;
|
|
|
|
namespace Peek.UI
|
|
{
|
|
/// <summary>
|
|
/// Provides application-specific behavior to supplement the default Application class.
|
|
/// </summary>
|
|
public partial class App : Application, IApp
|
|
{
|
|
public static int PowerToysPID { get; set; }
|
|
|
|
public ETWTrace EtwTrace { get; private set; } = new ETWTrace();
|
|
|
|
public IHost Host
|
|
{
|
|
get;
|
|
}
|
|
|
|
private MainWindow? Window { get; set; }
|
|
|
|
/// <summary>
|
|
/// Initializes a new instance of the <see cref="App"/> class.
|
|
/// Initializes the singleton application object. This is the first line of authored code
|
|
/// executed, and as such is the logical equivalent of main() or WinMain().
|
|
/// </summary>
|
|
public App()
|
|
{
|
|
string appLanguage = LanguageHelper.LoadLanguage();
|
|
if (!string.IsNullOrEmpty(appLanguage))
|
|
{
|
|
Microsoft.Windows.Globalization.ApplicationLanguages.PrimaryLanguageOverride = appLanguage;
|
|
}
|
|
|
|
InitializeComponent();
|
|
Logger.InitializeLogger("\\Peek\\Logs");
|
|
|
|
Host = Microsoft.Extensions.Hosting.Host.
|
|
CreateDefaultBuilder().
|
|
UseContentRoot(AppContext.BaseDirectory).
|
|
ConfigureServices((context, services) =>
|
|
{
|
|
// Core Services
|
|
services.AddTransient<NeighboringItemsQuery>();
|
|
services.AddSingleton<IUserSettings, UserSettings>();
|
|
services.AddSingleton<IPreviewSettings, PreviewSettings>();
|
|
|
|
// Views and ViewModels
|
|
services.AddTransient<TitleBar>();
|
|
services.AddTransient<FilePreview>();
|
|
services.AddTransient<MainWindowViewModel>();
|
|
}).
|
|
Build();
|
|
|
|
UnhandledException += App_UnhandledException;
|
|
}
|
|
|
|
public T GetService<T>()
|
|
where T : class
|
|
{
|
|
if ((App.Current as App)!.Host.Services.GetService(typeof(T)) is not T service)
|
|
{
|
|
throw new ArgumentException($"{typeof(T)} needs to be registered in ConfigureServices within App.xaml.cs.");
|
|
}
|
|
|
|
return service;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Invoked when the application is launched.
|
|
/// </summary>
|
|
/// <param name="args">Details about the launch request and process.</param>
|
|
protected override void OnLaunched(LaunchActivatedEventArgs args)
|
|
{
|
|
if (PowerToys.GPOWrapper.GPOWrapper.GetConfiguredPeekEnabledValue() == PowerToys.GPOWrapper.GpoRuleConfigured.Disabled)
|
|
{
|
|
Logger.LogWarning("Tried to start with a GPO policy setting the utility to always be disabled. Please contact your systems administrator.");
|
|
Environment.Exit(0); // Current.Exit won't work until there's a window opened.
|
|
return;
|
|
}
|
|
|
|
var cmdArgs = Environment.GetCommandLineArgs();
|
|
if (cmdArgs?.Length > 1)
|
|
{
|
|
if (int.TryParse(cmdArgs[^1], out int powerToysRunnerPid))
|
|
{
|
|
RunnerHelper.WaitForPowerToysRunner(powerToysRunnerPid, () =>
|
|
{
|
|
EtwTrace?.Dispose();
|
|
Environment.Exit(0);
|
|
});
|
|
}
|
|
}
|
|
|
|
NativeEventWaiter.WaitForEventLoop(Constants.ShowPeekEvent(), OnPeekHotkey);
|
|
NativeEventWaiter.WaitForEventLoop(Constants.TerminatePeekEvent(), () =>
|
|
{
|
|
EtwTrace?.Dispose();
|
|
Environment.Exit(0);
|
|
});
|
|
}
|
|
|
|
private void App_UnhandledException(object sender, Microsoft.UI.Xaml.UnhandledExceptionEventArgs e)
|
|
{
|
|
PowerToysTelemetry.Log.WriteEvent(new ErrorEvent() { HResult = (Common.Models.HResult)e.Exception.HResult, Failure = ErrorEvent.FailureType.AppCrash });
|
|
}
|
|
|
|
/// <summary>
|
|
/// Handle Peek hotkey
|
|
/// </summary>
|
|
private void OnPeekHotkey()
|
|
{
|
|
// Need to read the foreground HWND before activating Peek to avoid focus stealing
|
|
// Foreground HWND must always be Explorer or Desktop
|
|
var foregroundWindowHandle = Windows.Win32.PInvoke_PeekUI.GetForegroundWindow();
|
|
|
|
bool firstActivation = false;
|
|
|
|
if (Window == null)
|
|
{
|
|
firstActivation = true;
|
|
Window = new MainWindow();
|
|
}
|
|
|
|
Window.Toggle(firstActivation, foregroundWindowHandle);
|
|
}
|
|
}
|
|
}
|