Merge branch 'dev' into enable_windows_key

This commit is contained in:
Jeremy 2025-01-01 13:56:19 +11:00
commit 5dee66e15f
105 changed files with 4493 additions and 973 deletions

View file

@ -3,10 +3,8 @@ using System.Collections.Generic;
using System.IO; using System.IO;
using System.Linq; using System.Linq;
using System.Xml; using System.Xml;
using System.Runtime.InteropServices;
using System.Windows; using System.Windows;
using System.Windows.Controls; using System.Windows.Controls;
using System.Windows.Interop;
using System.Windows.Markup; using System.Windows.Markup;
using System.Windows.Media; using System.Windows.Media;
using System.Windows.Media.Effects; using System.Windows.Media.Effects;
@ -98,12 +96,12 @@ namespace Flow.Launcher.Core.Resource
_oldTheme = Path.GetFileNameWithoutExtension(_oldResource.Source.AbsolutePath); _oldTheme = Path.GetFileNameWithoutExtension(_oldResource.Source.AbsolutePath);
} }
BlurEnabled = IsBlurTheme(); BlurEnabled = Win32Helper.IsBlurTheme();
if (Settings.UseDropShadowEffect && !BlurEnabled) if (Settings.UseDropShadowEffect && !BlurEnabled)
AddDropShadowEffectToCurrentTheme(); AddDropShadowEffectToCurrentTheme();
SetBlurForWindow(); Win32Helper.SetBlurForWindow(Application.Current.MainWindow, BlurEnabled);
} }
catch (DirectoryNotFoundException) catch (DirectoryNotFoundException)
{ {
@ -357,98 +355,6 @@ namespace Flow.Launcher.Core.Resource
UpdateResourceDictionary(dict); UpdateResourceDictionary(dict);
} }
#region Blur Handling
/*
Found on https://github.com/riverar/sample-win10-aeroglass
*/
private enum AccentState
{
ACCENT_DISABLED = 0,
ACCENT_ENABLE_GRADIENT = 1,
ACCENT_ENABLE_TRANSPARENTGRADIENT = 2,
ACCENT_ENABLE_BLURBEHIND = 3,
ACCENT_INVALID_STATE = 4
}
[StructLayout(LayoutKind.Sequential)]
private struct AccentPolicy
{
public AccentState AccentState;
public int AccentFlags;
public int GradientColor;
public int AnimationId;
}
[StructLayout(LayoutKind.Sequential)]
private struct WindowCompositionAttributeData
{
public WindowCompositionAttribute Attribute;
public IntPtr Data;
public int SizeOfData;
}
private enum WindowCompositionAttribute
{
WCA_ACCENT_POLICY = 19
}
[DllImport("user32.dll")]
private static extern int SetWindowCompositionAttribute(IntPtr hwnd, ref WindowCompositionAttributeData data);
/// <summary>
/// Sets the blur for a window via SetWindowCompositionAttribute
/// </summary>
public void SetBlurForWindow()
{
if (BlurEnabled)
{
SetWindowAccent(Application.Current.MainWindow, AccentState.ACCENT_ENABLE_BLURBEHIND);
}
else
{
SetWindowAccent(Application.Current.MainWindow, AccentState.ACCENT_DISABLED);
}
}
private bool IsBlurTheme()
{
if (Environment.OSVersion.Version >= new Version(6, 2))
{
var resource = Application.Current.TryFindResource("ThemeBlurEnabled");
if (resource is bool)
return (bool)resource;
return false;
}
return false;
}
private void SetWindowAccent(Window w, AccentState state)
{
var windowHelper = new WindowInteropHelper(w);
windowHelper.EnsureHandle();
var accent = new AccentPolicy { AccentState = state };
var accentStructSize = Marshal.SizeOf(accent);
var accentPtr = Marshal.AllocHGlobal(accentStructSize);
Marshal.StructureToPtr(accent, accentPtr, false);
var data = new WindowCompositionAttributeData
{
Attribute = WindowCompositionAttribute.WCA_ACCENT_POLICY,
SizeOfData = accentStructSize,
Data = accentPtr
};
SetWindowCompositionAttribute(windowHelper.Handle, ref data);
Marshal.FreeHGlobal(accentPtr);
}
#endregion
public record ThemeData(string FileNameWithoutExtension, string Name, bool? IsDark = null, bool? HasBlur = null); public record ThemeData(string FileNameWithoutExtension, string Name, bool? IsDark = null, bool? HasBlur = null);
} }
} }

View file

@ -2,7 +2,7 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.IO; using System.IO;
using System.Linq; using System.Linq;
using System.Runtime.InteropServices; using Windows.Win32;
namespace Flow.Launcher.Infrastructure namespace Flow.Launcher.Infrastructure
{ {
@ -54,10 +54,6 @@ namespace Flow.Launcher.Infrastructure
return explorerWindows.Zip(zOrders).MinBy(x => x.Second).First; return explorerWindows.Zip(zOrders).MinBy(x => x.Second).First;
} }
[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
private static extern bool EnumWindows(EnumWindowsProc lpEnumFunc, IntPtr lParam);
private delegate bool EnumWindowsProc(IntPtr hWnd, IntPtr lParam); private delegate bool EnumWindowsProc(IntPtr hWnd, IntPtr lParam);
/// <summary> /// <summary>
@ -70,9 +66,9 @@ namespace Flow.Launcher.Infrastructure
var index = 0; var index = 0;
var numRemaining = hWnds.Count; var numRemaining = hWnds.Count;
EnumWindows((wnd, _) => PInvoke.EnumWindows((wnd, _) =>
{ {
var searchIndex = hWnds.FindIndex(x => x.HWND == wnd.ToInt32()); var searchIndex = hWnds.FindIndex(x => x.HWND == wnd.Value);
if (searchIndex != -1) if (searchIndex != -1)
{ {
z[searchIndex] = index; z[searchIndex] = index;

View file

@ -35,6 +35,10 @@
<Prefer32Bit>false</Prefer32Bit> <Prefer32Bit>false</Prefer32Bit>
</PropertyGroup> </PropertyGroup>
<ItemGroup>
<AdditionalFiles Include="NativeMethods.txt" />
</ItemGroup>
<ItemGroup> <ItemGroup>
<Compile Include="..\SolutionAssemblyInfo.cs" Link="Properties\SolutionAssemblyInfo.cs" /> <Compile Include="..\SolutionAssemblyInfo.cs" Link="Properties\SolutionAssemblyInfo.cs" />
<None Include="FodyWeavers.xml" /> <None Include="FodyWeavers.xml" />
@ -56,6 +60,10 @@
</PackageReference> </PackageReference>
<PackageReference Include="MemoryPack" Version="1.21.3" /> <PackageReference Include="MemoryPack" Version="1.21.3" />
<PackageReference Include="Microsoft.VisualStudio.Threading" Version="17.12.19" /> <PackageReference Include="Microsoft.VisualStudio.Threading" Version="17.12.19" />
<PackageReference Include="Microsoft.Windows.CsWin32" Version="0.3.106">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<PackageReference Include="NLog" Version="4.7.10" /> <PackageReference Include="NLog" Version="4.7.10" />
<PackageReference Include="PropertyChanged.Fody" Version="3.4.0" /> <PackageReference Include="PropertyChanged.Fody" Version="3.4.0" />
<PackageReference Include="System.Drawing.Common" Version="7.0.0" /> <PackageReference Include="System.Drawing.Common" Version="7.0.0" />

View file

@ -1,6 +1,11 @@
using System; using System;
using System.Diagnostics;
using System.Runtime.InteropServices; using System.Runtime.InteropServices;
using Flow.Launcher.Plugin; using Flow.Launcher.Plugin;
using Windows.Win32;
using Windows.Win32.Foundation;
using Windows.Win32.UI.Input.KeyboardAndMouse;
using Windows.Win32.UI.WindowsAndMessaging;
namespace Flow.Launcher.Infrastructure.Hotkey namespace Flow.Launcher.Infrastructure.Hotkey
{ {
@ -10,44 +15,45 @@ namespace Flow.Launcher.Infrastructure.Hotkey
/// </summary> /// </summary>
public unsafe class GlobalHotkey : IDisposable public unsafe class GlobalHotkey : IDisposable
{ {
private static readonly IntPtr hookId; private static readonly HOOKPROC _procKeyboard = HookKeyboardCallback;
private static readonly UnhookWindowsHookExSafeHandle hookId;
public delegate bool KeyboardCallback(KeyEvent keyEvent, int vkCode, SpecialKeyState state); public delegate bool KeyboardCallback(KeyEvent keyEvent, int vkCode, SpecialKeyState state);
internal static Func<KeyEvent, int, SpecialKeyState, bool> hookedKeyboardCallback; internal static Func<KeyEvent, int, SpecialKeyState, bool> hookedKeyboardCallback;
//Modifier key constants
private const int VK_SHIFT = 0x10;
private const int VK_CONTROL = 0x11;
private const int VK_ALT = 0x12;
private const int VK_WIN = 91;
static GlobalHotkey() static GlobalHotkey()
{ {
// Set the hook // Set the hook
hookId = InterceptKeys.SetHook(& LowLevelKeyboardProc); hookId = SetHook(_procKeyboard, WINDOWS_HOOK_ID.WH_KEYBOARD_LL);
}
private static UnhookWindowsHookExSafeHandle SetHook(HOOKPROC proc, WINDOWS_HOOK_ID hookId)
{
using var curProcess = Process.GetCurrentProcess();
using var curModule = curProcess.MainModule;
return PInvoke.SetWindowsHookEx(hookId, proc, PInvoke.GetModuleHandle(curModule.ModuleName), 0);
} }
public static SpecialKeyState CheckModifiers() public static SpecialKeyState CheckModifiers()
{ {
SpecialKeyState state = new SpecialKeyState(); SpecialKeyState state = new SpecialKeyState();
if ((InterceptKeys.GetKeyState(VK_SHIFT) & 0x8000) != 0) if ((PInvoke.GetKeyState((int)VIRTUAL_KEY.VK_SHIFT) & 0x8000) != 0)
{ {
//SHIFT is pressed //SHIFT is pressed
state.ShiftPressed = true; state.ShiftPressed = true;
} }
if ((InterceptKeys.GetKeyState(VK_CONTROL) & 0x8000) != 0) if ((PInvoke.GetKeyState((int)VIRTUAL_KEY.VK_CONTROL) & 0x8000) != 0)
{ {
//CONTROL is pressed //CONTROL is pressed
state.CtrlPressed = true; state.CtrlPressed = true;
} }
if ((InterceptKeys.GetKeyState(VK_ALT) & 0x8000) != 0) if ((PInvoke.GetKeyState((int)VIRTUAL_KEY.VK_MENU) & 0x8000) != 0)
{ {
//ALT is pressed //ALT is pressed
state.AltPressed = true; state.AltPressed = true;
} }
if ((InterceptKeys.GetKeyState(VK_WIN) & 0x8000) != 0) if ((PInvoke.GetKeyState((int)VIRTUAL_KEY.VK_LWIN) & 0x8000) != 0 ||
(PInvoke.GetKeyState((int)VIRTUAL_KEY.VK_RWIN) & 0x8000) != 0)
{ {
//WIN is pressed //WIN is pressed
state.WinPressed = true; state.WinPressed = true;
@ -56,33 +62,33 @@ namespace Flow.Launcher.Infrastructure.Hotkey
return state; return state;
} }
[UnmanagedCallersOnly] private static LRESULT HookKeyboardCallback(int nCode, WPARAM wParam, LPARAM lParam)
private static IntPtr LowLevelKeyboardProc(int nCode, UIntPtr wParam, IntPtr lParam)
{ {
bool continues = true; bool continues = true;
if (nCode >= 0) if (nCode >= 0)
{ {
if (wParam.ToUInt32() == (int)KeyEvent.WM_KEYDOWN || if (wParam.Value == (int)KeyEvent.WM_KEYDOWN ||
wParam.ToUInt32() == (int)KeyEvent.WM_KEYUP || wParam.Value == (int)KeyEvent.WM_KEYUP ||
wParam.ToUInt32() == (int)KeyEvent.WM_SYSKEYDOWN || wParam.Value == (int)KeyEvent.WM_SYSKEYDOWN ||
wParam.ToUInt32() == (int)KeyEvent.WM_SYSKEYUP) wParam.Value == (int)KeyEvent.WM_SYSKEYUP)
{ {
if (hookedKeyboardCallback != null) if (hookedKeyboardCallback != null)
continues = hookedKeyboardCallback((KeyEvent)wParam.ToUInt32(), Marshal.ReadInt32(lParam), CheckModifiers()); continues = hookedKeyboardCallback((KeyEvent)wParam.Value, Marshal.ReadInt32(lParam), CheckModifiers());
} }
} }
if (continues) if (continues)
{ {
return InterceptKeys.CallNextHookEx(hookId, nCode, wParam, lParam); return PInvoke.CallNextHookEx(hookId, nCode, wParam, lParam);
} }
return (IntPtr)(-1);
return new LRESULT(1);
} }
public void Dispose() public void Dispose()
{ {
InterceptKeys.UnhookWindowsHookEx(hookId); hookId.Dispose();
} }
~GlobalHotkey() ~GlobalHotkey()
@ -90,4 +96,4 @@ namespace Flow.Launcher.Infrastructure.Hotkey
Dispose(); Dispose();
} }
} }
} }

View file

@ -1,38 +0,0 @@
using System;
using System.Diagnostics;
using System.Runtime.InteropServices;
namespace Flow.Launcher.Infrastructure.Hotkey
{
internal static unsafe class InterceptKeys
{
public delegate IntPtr LowLevelKeyboardProc(int nCode, UIntPtr wParam, IntPtr lParam);
private const int WH_KEYBOARD_LL = 13;
public static IntPtr SetHook(delegate* unmanaged<int, UIntPtr, IntPtr, IntPtr> proc)
{
using (Process curProcess = Process.GetCurrentProcess())
using (ProcessModule curModule = curProcess.MainModule)
{
return SetWindowsHookEx(WH_KEYBOARD_LL, proc, GetModuleHandle(curModule.ModuleName), 0);
}
}
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern IntPtr SetWindowsHookEx(int idHook, delegate* unmanaged<int, UIntPtr, IntPtr, IntPtr> lpfn, IntPtr hMod, uint dwThreadId);
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool UnhookWindowsHookEx(IntPtr hhk);
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern IntPtr CallNextHookEx(IntPtr hhk, int nCode, UIntPtr wParam, IntPtr lParam);
[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern IntPtr GetModuleHandle(string lpModuleName);
[DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true, CallingConvention = CallingConvention.Winapi)]
public static extern short GetKeyState(int keyCode);
}
}

View file

@ -1,3 +1,5 @@
using Windows.Win32;
namespace Flow.Launcher.Infrastructure.Hotkey namespace Flow.Launcher.Infrastructure.Hotkey
{ {
public enum KeyEvent public enum KeyEvent
@ -5,21 +7,21 @@ namespace Flow.Launcher.Infrastructure.Hotkey
/// <summary> /// <summary>
/// Key down /// Key down
/// </summary> /// </summary>
WM_KEYDOWN = 256, WM_KEYDOWN = (int)PInvoke.WM_KEYDOWN,
/// <summary> /// <summary>
/// Key up /// Key up
/// </summary> /// </summary>
WM_KEYUP = 257, WM_KEYUP = (int)PInvoke.WM_KEYUP,
/// <summary> /// <summary>
/// System key up /// System key up
/// </summary> /// </summary>
WM_SYSKEYUP = 261, WM_SYSKEYUP = (int)PInvoke.WM_SYSKEYUP,
/// <summary> /// <summary>
/// System key down /// System key down
/// </summary> /// </summary>
WM_SYSKEYDOWN = 260 WM_SYSKEYDOWN = (int)PInvoke.WM_SYSKEYDOWN
} }
} }

View file

@ -1,12 +1,19 @@
using System; using System;
using System.Runtime.InteropServices; using System.Runtime.InteropServices;
using System.IO; using System.IO;
using System.Windows;
using System.Windows.Interop; using System.Windows.Interop;
using System.Windows.Media.Imaging; using System.Windows.Media.Imaging;
using System.Windows; using Windows.Win32;
using Windows.Win32.Foundation;
using Windows.Win32.UI.Shell;
using Windows.Win32.Graphics.Gdi;
namespace Flow.Launcher.Infrastructure.Image namespace Flow.Launcher.Infrastructure.Image
{ {
/// <summary>
/// Subclass of <see cref="Windows.Win32.UI.Shell.SIIGBF"/>
/// </summary>
[Flags] [Flags]
public enum ThumbnailOptions public enum ThumbnailOptions
{ {
@ -22,91 +29,13 @@ namespace Flow.Launcher.Infrastructure.Image
{ {
// Based on https://stackoverflow.com/questions/21751747/extract-thumbnail-for-any-file-in-windows // Based on https://stackoverflow.com/questions/21751747/extract-thumbnail-for-any-file-in-windows
private const string IShellItem2Guid = "7E9FB0D3-919F-4307-AB2E-9B1860310C93"; private static readonly Guid GUID_IShellItem = typeof(IShellItem).GUID;
[DllImport("shell32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
internal static extern int SHCreateItemFromParsingName(
[MarshalAs(UnmanagedType.LPWStr)] string path,
IntPtr pbc,
ref Guid riid,
[MarshalAs(UnmanagedType.Interface)] out IShellItem shellItem);
[DllImport("gdi32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
internal static extern bool DeleteObject(IntPtr hObject);
[ComImport]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
[Guid("43826d1e-e718-42ee-bc55-a1e261c37bfe")]
internal interface IShellItem
{
void BindToHandler(IntPtr pbc,
[MarshalAs(UnmanagedType.LPStruct)]Guid bhid,
[MarshalAs(UnmanagedType.LPStruct)]Guid riid,
out IntPtr ppv);
void GetParent(out IShellItem ppsi);
void GetDisplayName(SIGDN sigdnName, out IntPtr ppszName);
void GetAttributes(uint sfgaoMask, out uint psfgaoAttribs);
void Compare(IShellItem psi, uint hint, out int piOrder);
};
internal enum SIGDN : uint
{
NORMALDISPLAY = 0,
PARENTRELATIVEPARSING = 0x80018001,
PARENTRELATIVEFORADDRESSBAR = 0x8001c001,
DESKTOPABSOLUTEPARSING = 0x80028000,
PARENTRELATIVEEDITING = 0x80031001,
DESKTOPABSOLUTEEDITING = 0x8004c000,
FILESYSPATH = 0x80058000,
URL = 0x80068000
}
internal enum HResult
{
Ok = 0x0000,
False = 0x0001,
InvalidArguments = unchecked((int)0x80070057),
OutOfMemory = unchecked((int)0x8007000E),
NoInterface = unchecked((int)0x80004002),
Fail = unchecked((int)0x80004005),
ExtractionFailed = unchecked((int)0x8004B200),
ElementNotFound = unchecked((int)0x80070490),
TypeElementNotFound = unchecked((int)0x8002802B),
NoObject = unchecked((int)0x800401E5),
Win32ErrorCanceled = 1223,
Canceled = unchecked((int)0x800704C7),
ResourceInUse = unchecked((int)0x800700AA),
AccessDenied = unchecked((int)0x80030005)
}
[ComImportAttribute()]
[GuidAttribute("bcc18b79-ba16-442f-80c4-8a59c30c463b")]
[InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)]
internal interface IShellItemImageFactory
{
[PreserveSig]
HResult GetImage(
[In, MarshalAs(UnmanagedType.Struct)] NativeSize size,
[In] ThumbnailOptions flags,
[Out] out IntPtr phbm);
}
[StructLayout(LayoutKind.Sequential)]
internal struct NativeSize
{
private int width;
private int height;
public int Width { set { width = value; } }
public int Height { set { height = value; } }
};
private static readonly HRESULT S_ExtractionFailed = (HRESULT)0x8004B200;
public static BitmapSource GetThumbnail(string fileName, int width, int height, ThumbnailOptions options) public static BitmapSource GetThumbnail(string fileName, int width, int height, ThumbnailOptions options)
{ {
IntPtr hBitmap = GetHBitmap(Path.GetFullPath(fileName), width, height, options); HBITMAP hBitmap = GetHBitmap(Path.GetFullPath(fileName), width, height, options);
try try
{ {
@ -115,39 +44,56 @@ namespace Flow.Launcher.Infrastructure.Image
finally finally
{ {
// delete HBitmap to avoid memory leaks // delete HBitmap to avoid memory leaks
DeleteObject(hBitmap); PInvoke.DeleteObject(hBitmap);
} }
} }
private static IntPtr GetHBitmap(string fileName, int width, int height, ThumbnailOptions options)
{
IShellItem nativeShellItem;
Guid shellItem2Guid = new Guid(IShellItem2Guid);
int retCode = SHCreateItemFromParsingName(fileName, IntPtr.Zero, ref shellItem2Guid, out nativeShellItem);
if (retCode != 0) private static unsafe HBITMAP GetHBitmap(string fileName, int width, int height, ThumbnailOptions options)
{
var retCode = PInvoke.SHCreateItemFromParsingName(
fileName,
null,
GUID_IShellItem,
out var nativeShellItem);
if (retCode != HRESULT.S_OK)
throw Marshal.GetExceptionForHR(retCode); throw Marshal.GetExceptionForHR(retCode);
NativeSize nativeSize = new NativeSize if (nativeShellItem is not IShellItemImageFactory imageFactory)
{ {
Width = width, Marshal.ReleaseComObject(nativeShellItem);
Height = height nativeShellItem = null;
}; throw new InvalidOperationException("Failed to get IShellItemImageFactory");
IntPtr hBitmap;
HResult hr = ((IShellItemImageFactory)nativeShellItem).GetImage(nativeSize, options, out hBitmap);
// if extracting image thumbnail and failed, extract shell icon
if (options == ThumbnailOptions.ThumbnailOnly && hr == HResult.ExtractionFailed)
{
hr = ((IShellItemImageFactory) nativeShellItem).GetImage(nativeSize, ThumbnailOptions.IconOnly, out hBitmap);
} }
Marshal.ReleaseComObject(nativeShellItem); SIZE size = new SIZE
{
cx = width,
cy = height
};
if (hr == HResult.Ok) return hBitmap; HBITMAP hBitmap = default;
try
{
try
{
imageFactory.GetImage(size, (SIIGBF)options, &hBitmap);
}
catch (COMException ex) when (ex.HResult == S_ExtractionFailed && options == ThumbnailOptions.ThumbnailOnly)
{
// Fallback to IconOnly if ThumbnailOnly fails
imageFactory.GetImage(size, (SIIGBF)ThumbnailOptions.IconOnly, &hBitmap);
}
}
finally
{
if (nativeShellItem != null)
{
Marshal.ReleaseComObject(nativeShellItem);
}
}
throw new COMException($"Error while extracting thumbnail for {fileName}", Marshal.GetExceptionForHR((int)hr)); return hBitmap;
} }
} }
} }

View file

@ -0,0 +1,22 @@
SHCreateItemFromParsingName
DeleteObject
IShellItem
IShellItemImageFactory
S_OK
SetWindowsHookEx
UnhookWindowsHookEx
CallNextHookEx
GetModuleHandle
GetKeyState
VIRTUAL_KEY
WM_KEYDOWN
WM_KEYUP
WM_SYSKEYDOWN
WM_SYSKEYUP
EnumWindows
OleInitialize
OleUninitialize

View file

@ -230,7 +230,7 @@ namespace Flow.Launcher.Infrastructure.UserSettings
[JsonIgnore] [JsonIgnore]
public ObservableCollection<BuiltinShortcutModel> BuiltinShortcuts { get; set; } = new() public ObservableCollection<BuiltinShortcutModel> BuiltinShortcuts { get; set; } = new()
{ {
new BuiltinShortcutModel("{clipboard}", "shortcut_clipboard_description", Clipboard.GetText), new BuiltinShortcutModel("{clipboard}", "shortcut_clipboard_description", () => Win32Helper.StartSTATaskAsync(Clipboard.GetText).Result),
new BuiltinShortcutModel("{active_explorer_path}", "shortcut_active_explorer_path", FileExplorerHelper.GetActiveExplorerPath) new BuiltinShortcutModel("{active_explorer_path}", "shortcut_active_explorer_path", FileExplorerHelper.GetActiveExplorerPath)
}; };

View file

@ -0,0 +1,239 @@
using System;
using System.Runtime.InteropServices;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Interop;
using System.Windows;
using Windows.Win32;
namespace Flow.Launcher.Infrastructure
{
public static class Win32Helper
{
#region STA Thread
/*
Found on https://github.com/files-community/Files
*/
public static Task StartSTATaskAsync(Action action)
{
var taskCompletionSource = new TaskCompletionSource();
Thread thread = new(() =>
{
PInvoke.OleInitialize();
try
{
action();
taskCompletionSource.SetResult();
}
catch (System.Exception)
{
taskCompletionSource.SetResult();
}
finally
{
PInvoke.OleUninitialize();
}
})
{
IsBackground = true,
Priority = ThreadPriority.Normal
};
thread.SetApartmentState(ApartmentState.STA);
thread.Start();
return taskCompletionSource.Task;
}
public static Task StartSTATaskAsync(Func<Task> func)
{
var taskCompletionSource = new TaskCompletionSource();
Thread thread = new(async () =>
{
PInvoke.OleInitialize();
try
{
await func();
taskCompletionSource.SetResult();
}
catch (System.Exception)
{
taskCompletionSource.SetResult();
}
finally
{
PInvoke.OleUninitialize();
}
})
{
IsBackground = true,
Priority = ThreadPriority.Normal
};
thread.SetApartmentState(ApartmentState.STA);
thread.Start();
return taskCompletionSource.Task;
}
public static Task<T?> StartSTATaskAsync<T>(Func<T> func)
{
var taskCompletionSource = new TaskCompletionSource<T?>();
Thread thread = new(() =>
{
PInvoke.OleInitialize();
try
{
taskCompletionSource.SetResult(func());
}
catch (System.Exception)
{
taskCompletionSource.SetResult(default);
}
finally
{
PInvoke.OleUninitialize();
}
})
{
IsBackground = true,
Priority = ThreadPriority.Normal
};
thread.SetApartmentState(ApartmentState.STA);
thread.Start();
return taskCompletionSource.Task;
}
public static Task<T?> StartSTATaskAsync<T>(Func<Task<T>> func)
{
var taskCompletionSource = new TaskCompletionSource<T?>();
Thread thread = new(async () =>
{
PInvoke.OleInitialize();
try
{
taskCompletionSource.SetResult(await func());
}
catch (System.Exception)
{
taskCompletionSource.SetResult(default);
}
finally
{
PInvoke.OleUninitialize();
}
})
{
IsBackground = true,
Priority = ThreadPriority.Normal
};
thread.SetApartmentState(ApartmentState.STA);
thread.Start();
return taskCompletionSource.Task;
}
#endregion
#region Blur Handling
/*
Found on https://github.com/riverar/sample-win10-aeroglass
*/
private enum AccentState
{
ACCENT_DISABLED = 0,
ACCENT_ENABLE_GRADIENT = 1,
ACCENT_ENABLE_TRANSPARENTGRADIENT = 2,
ACCENT_ENABLE_BLURBEHIND = 3,
ACCENT_INVALID_STATE = 4
}
[StructLayout(LayoutKind.Sequential)]
private struct AccentPolicy
{
public AccentState AccentState;
public int AccentFlags;
public int GradientColor;
public int AnimationId;
}
[StructLayout(LayoutKind.Sequential)]
private struct WindowCompositionAttributeData
{
public WindowCompositionAttribute Attribute;
public IntPtr Data;
public int SizeOfData;
}
private enum WindowCompositionAttribute
{
WCA_ACCENT_POLICY = 19
}
[DllImport("user32.dll")]
private static extern int SetWindowCompositionAttribute(IntPtr hwnd, ref WindowCompositionAttributeData data);
/// <summary>
/// Checks if the blur theme is enabled
/// </summary>
public static bool IsBlurTheme()
{
if (Environment.OSVersion.Version >= new Version(6, 2))
{
var resource = Application.Current.TryFindResource("ThemeBlurEnabled");
if (resource is bool b)
return b;
return false;
}
return false;
}
/// <summary>
/// Sets the blur for a window via SetWindowCompositionAttribute
/// </summary>
public static void SetBlurForWindow(Window w, bool blur)
{
SetWindowAccent(w, blur ? AccentState.ACCENT_ENABLE_BLURBEHIND : AccentState.ACCENT_DISABLED);
}
private static void SetWindowAccent(Window w, AccentState state)
{
var windowHelper = new WindowInteropHelper(w);
windowHelper.EnsureHandle();
var accent = new AccentPolicy { AccentState = state };
var accentStructSize = Marshal.SizeOf(accent);
var accentPtr = Marshal.AllocHGlobal(accentStructSize);
Marshal.StructureToPtr(accent, accentPtr, false);
var data = new WindowCompositionAttributeData
{
Attribute = WindowCompositionAttribute.WCA_ACCENT_POLICY,
SizeOfData = accentStructSize,
Data = accentPtr
};
SetWindowCompositionAttribute(windowHelper.Handle, ref data);
Marshal.FreeHGlobal(accentPtr);
}
#endregion
}
}

View file

@ -57,7 +57,11 @@
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<None Include="Readme.md" Pack="true" PackagePath="\"/> <AdditionalFiles Include="NativeMethods.txt" />
</ItemGroup>
<ItemGroup>
<None Include="Readme.md" Pack="true" PackagePath="\" />
<None Include="FodyWeavers.xml" /> <None Include="FodyWeavers.xml" />
</ItemGroup> </ItemGroup>
@ -68,6 +72,10 @@
</PackageReference> </PackageReference>
<PackageReference Include="Microsoft.SourceLink.GitHub" Version="1.1.1" PrivateAssets="All" /> <PackageReference Include="Microsoft.SourceLink.GitHub" Version="1.1.1" PrivateAssets="All" />
<PackageReference Include="JetBrains.Annotations" Version="2024.3.0" /> <PackageReference Include="JetBrains.Annotations" Version="2024.3.0" />
<PackageReference Include="Microsoft.Windows.CsWin32" Version="0.3.106">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<PackageReference Include="PropertyChanged.Fody" Version="3.4.0" /> <PackageReference Include="PropertyChanged.Fody" Version="3.4.0" />
</ItemGroup> </ItemGroup>

View file

@ -0,0 +1,3 @@
EnumThreadWindows
GetWindowText
GetWindowTextLength

View file

@ -2,18 +2,15 @@
using System.ComponentModel; using System.ComponentModel;
using System.Diagnostics; using System.Diagnostics;
using System.IO; using System.IO;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading; using System.Threading;
using Windows.Win32;
using Windows.Win32.Foundation;
namespace Flow.Launcher.Plugin.SharedCommands namespace Flow.Launcher.Plugin.SharedCommands
{ {
public static class ShellCommand public static class ShellCommand
{ {
public delegate bool EnumThreadDelegate(IntPtr hwnd, IntPtr lParam); public delegate bool EnumThreadDelegate(IntPtr hwnd, IntPtr lParam);
[DllImport("user32.dll")] static extern bool EnumThreadWindows(uint threadId, EnumThreadDelegate lpfn, IntPtr lParam);
[DllImport("user32.dll")] static extern int GetWindowText(IntPtr hwnd, StringBuilder lpString, int nMaxCount);
[DllImport("user32.dll")] static extern int GetWindowTextLength(IntPtr hwnd);
private static bool containsSecurityWindow; private static bool containsSecurityWindow;
@ -28,6 +25,7 @@ namespace Flow.Launcher.Plugin.SharedCommands
CheckSecurityWindow(); CheckSecurityWindow();
Thread.Sleep(25); Thread.Sleep(25);
} }
while (containsSecurityWindow) // while this process contains a "Windows Security" dialog, stay open while (containsSecurityWindow) // while this process contains a "Windows Security" dialog, stay open
{ {
containsSecurityWindow = false; containsSecurityWindow = false;
@ -42,24 +40,33 @@ namespace Flow.Launcher.Plugin.SharedCommands
{ {
ProcessThreadCollection ptc = Process.GetCurrentProcess().Threads; ProcessThreadCollection ptc = Process.GetCurrentProcess().Threads;
for (int i = 0; i < ptc.Count; i++) for (int i = 0; i < ptc.Count; i++)
EnumThreadWindows((uint)ptc[i].Id, CheckSecurityThread, IntPtr.Zero); PInvoke.EnumThreadWindows((uint)ptc[i].Id, CheckSecurityThread, IntPtr.Zero);
} }
private static bool CheckSecurityThread(IntPtr hwnd, IntPtr lParam) private static BOOL CheckSecurityThread(HWND hwnd, LPARAM lParam)
{ {
if (GetWindowTitle(hwnd) == "Windows Security") if (GetWindowTitle(hwnd) == "Windows Security")
containsSecurityWindow = true; containsSecurityWindow = true;
return true; return true;
} }
private static string GetWindowTitle(IntPtr hwnd) private static unsafe string GetWindowTitle(HWND hwnd)
{ {
StringBuilder sb = new StringBuilder(GetWindowTextLength(hwnd) + 1); var capacity = PInvoke.GetWindowTextLength(hwnd) + 1;
GetWindowText(hwnd, sb, sb.Capacity); int length;
return sb.ToString(); Span<char> buffer = capacity < 1024 ? stackalloc char[capacity] : new char[capacity];
fixed (char* pBuffer = buffer)
{
// If the window has no title bar or text, if the title bar is empty,
// or if the window or control handle is invalid, the return value is zero.
length = PInvoke.GetWindowText(hwnd, pBuffer, capacity);
}
return buffer[..length].ToString();
} }
public static ProcessStartInfo SetProcessStartInfo(this string fileName, string workingDirectory = "", string arguments = "", string verb = "", bool createNoWindow = false) public static ProcessStartInfo SetProcessStartInfo(this string fileName, string workingDirectory = "",
string arguments = "", string verb = "", bool createNoWindow = false)
{ {
var info = new ProcessStartInfo var info = new ProcessStartInfo
{ {

View file

@ -91,6 +91,10 @@
</PackageReference> </PackageReference>
<PackageReference Include="InputSimulator" Version="1.0.4" /> <PackageReference Include="InputSimulator" Version="1.0.4" />
<PackageReference Include="Microsoft.Toolkit.Uwp.Notifications" Version="7.1.3" /> <PackageReference Include="Microsoft.Toolkit.Uwp.Notifications" Version="7.1.3" />
<PackageReference Include="Microsoft.Windows.CsWin32" Version="0.3.106">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<!-- ModernWpfUI v0.9.5 introduced WinRT changes that causes Notification platform unavailable error on some machines --> <!-- ModernWpfUI v0.9.5 introduced WinRT changes that causes Notification platform unavailable error on some machines -->
<!-- https://github.com/Flow-Launcher/Flow.Launcher/issues/1772#issuecomment-1502440801 --> <!-- https://github.com/Flow-Launcher/Flow.Launcher/issues/1772#issuecomment-1502440801 -->
<PackageReference Include="ModernWpfUI" Version="0.9.4" /> <PackageReference Include="ModernWpfUI" Version="0.9.4" />

View file

@ -1,20 +1,16 @@
using System; using System;
using System.Drawing.Printing;
using System.Runtime.InteropServices;
using System.Windows; using System.Windows;
using System.Windows.Interop; using System.Windows.Interop;
using Windows.Win32;
using Windows.Win32.Foundation;
using Windows.Win32.Graphics.Dwm;
using Windows.Win32.UI.Controls;
namespace Flow.Launcher.Helper; namespace Flow.Launcher.Helper;
public class DwmDropShadow public class DwmDropShadow
{ {
[DllImport("dwmapi.dll", PreserveSig = true)]
private static extern int DwmSetWindowAttribute(IntPtr hwnd, int attr, ref int attrValue, int attrSize);
[DllImport("dwmapi.dll")]
private static extern int DwmExtendFrameIntoClientArea(IntPtr hWnd, ref Margins pMarInset);
/// <summary> /// <summary>
/// Drops a standard shadow to a WPF Window, even if the window isborderless. Only works with DWM (Vista and Seven). /// Drops a standard shadow to a WPF Window, even if the window isborderless. Only works with DWM (Vista and Seven).
/// This method is much more efficient than setting AllowsTransparency to true and using the DropShadow effect, /// This method is much more efficient than setting AllowsTransparency to true and using the DropShadow effect,
@ -43,24 +39,22 @@ public class DwmDropShadow
/// </summary> /// </summary>
/// <param name="window">Window to which the shadow will be applied</param> /// <param name="window">Window to which the shadow will be applied</param>
/// <returns>True if the method succeeded, false if not</returns> /// <returns>True if the method succeeded, false if not</returns>
private static bool DropShadow(Window window) private static unsafe bool DropShadow(Window window)
{ {
try try
{ {
WindowInteropHelper helper = new WindowInteropHelper(window); WindowInteropHelper helper = new WindowInteropHelper(window);
int val = 2; int val = 2;
int ret1 = DwmSetWindowAttribute(helper.Handle, 2, ref val, 4); var ret1 = PInvoke.DwmSetWindowAttribute(new (helper.Handle), DWMWINDOWATTRIBUTE.DWMWA_NCRENDERING_POLICY, &val, 4);
if (ret1 == 0) if (ret1 == HRESULT.S_OK)
{ {
Margins m = new Margins { Bottom = 0, Left = 0, Right = 0, Top = 0 }; var m = new MARGINS { cyBottomHeight = 0, cxLeftWidth = 0, cxRightWidth = 0, cyTopHeight = 0 };
int ret2 = DwmExtendFrameIntoClientArea(helper.Handle, ref m); var ret2 = PInvoke.DwmExtendFrameIntoClientArea(new(helper.Handle), &m);
return ret2 == 0; return ret2 == HRESULT.S_OK;
}
else
{
return false;
} }
return false;
} }
catch (Exception) catch (Exception)
{ {

View file

@ -1,11 +1,5 @@
using System; using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.IO;
using System.Runtime.InteropServices;
using System.IO.Pipes; using System.IO.Pipes;
using System.Security;
using System.Text;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using System.Windows; using System.Windows;
@ -14,172 +8,6 @@ using System.Windows;
// modified to allow single instace restart // modified to allow single instace restart
namespace Flow.Launcher.Helper namespace Flow.Launcher.Helper
{ {
internal enum WM
{
NULL = 0x0000,
CREATE = 0x0001,
DESTROY = 0x0002,
MOVE = 0x0003,
SIZE = 0x0005,
ACTIVATE = 0x0006,
SETFOCUS = 0x0007,
KILLFOCUS = 0x0008,
ENABLE = 0x000A,
SETREDRAW = 0x000B,
SETTEXT = 0x000C,
GETTEXT = 0x000D,
GETTEXTLENGTH = 0x000E,
PAINT = 0x000F,
CLOSE = 0x0010,
QUERYENDSESSION = 0x0011,
QUIT = 0x0012,
QUERYOPEN = 0x0013,
ERASEBKGND = 0x0014,
SYSCOLORCHANGE = 0x0015,
SHOWWINDOW = 0x0018,
ACTIVATEAPP = 0x001C,
SETCURSOR = 0x0020,
MOUSEACTIVATE = 0x0021,
CHILDACTIVATE = 0x0022,
QUEUESYNC = 0x0023,
GETMINMAXINFO = 0x0024,
WINDOWPOSCHANGING = 0x0046,
WINDOWPOSCHANGED = 0x0047,
CONTEXTMENU = 0x007B,
STYLECHANGING = 0x007C,
STYLECHANGED = 0x007D,
DISPLAYCHANGE = 0x007E,
GETICON = 0x007F,
SETICON = 0x0080,
NCCREATE = 0x0081,
NCDESTROY = 0x0082,
NCCALCSIZE = 0x0083,
NCHITTEST = 0x0084,
NCPAINT = 0x0085,
NCACTIVATE = 0x0086,
GETDLGCODE = 0x0087,
SYNCPAINT = 0x0088,
NCMOUSEMOVE = 0x00A0,
NCLBUTTONDOWN = 0x00A1,
NCLBUTTONUP = 0x00A2,
NCLBUTTONDBLCLK = 0x00A3,
NCRBUTTONDOWN = 0x00A4,
NCRBUTTONUP = 0x00A5,
NCRBUTTONDBLCLK = 0x00A6,
NCMBUTTONDOWN = 0x00A7,
NCMBUTTONUP = 0x00A8,
NCMBUTTONDBLCLK = 0x00A9,
SYSKEYDOWN = 0x0104,
SYSKEYUP = 0x0105,
SYSCHAR = 0x0106,
SYSDEADCHAR = 0x0107,
COMMAND = 0x0111,
SYSCOMMAND = 0x0112,
MOUSEMOVE = 0x0200,
LBUTTONDOWN = 0x0201,
LBUTTONUP = 0x0202,
LBUTTONDBLCLK = 0x0203,
RBUTTONDOWN = 0x0204,
RBUTTONUP = 0x0205,
RBUTTONDBLCLK = 0x0206,
MBUTTONDOWN = 0x0207,
MBUTTONUP = 0x0208,
MBUTTONDBLCLK = 0x0209,
MOUSEWHEEL = 0x020A,
XBUTTONDOWN = 0x020B,
XBUTTONUP = 0x020C,
XBUTTONDBLCLK = 0x020D,
MOUSEHWHEEL = 0x020E,
CAPTURECHANGED = 0x0215,
ENTERSIZEMOVE = 0x0231,
EXITSIZEMOVE = 0x0232,
IME_SETCONTEXT = 0x0281,
IME_NOTIFY = 0x0282,
IME_CONTROL = 0x0283,
IME_COMPOSITIONFULL = 0x0284,
IME_SELECT = 0x0285,
IME_CHAR = 0x0286,
IME_REQUEST = 0x0288,
IME_KEYDOWN = 0x0290,
IME_KEYUP = 0x0291,
NCMOUSELEAVE = 0x02A2,
DWMCOMPOSITIONCHANGED = 0x031E,
DWMNCRENDERINGCHANGED = 0x031F,
DWMCOLORIZATIONCOLORCHANGED = 0x0320,
DWMWINDOWMAXIMIZEDCHANGE = 0x0321,
#region Windows 7
DWMSENDICONICTHUMBNAIL = 0x0323,
DWMSENDICONICLIVEPREVIEWBITMAP = 0x0326,
#endregion
USER = 0x0400,
// This is the hard-coded message value used by WinForms for Shell_NotifyIcon.
// It's relatively safe to reuse.
TRAYMOUSEMESSAGE = 0x800, //WM_USER + 1024
APP = 0x8000
}
[SuppressUnmanagedCodeSecurity]
internal static class NativeMethods
{
/// <summary>
/// Delegate declaration that matches WndProc signatures.
/// </summary>
public delegate IntPtr MessageHandler(WM uMsg, IntPtr wParam, IntPtr lParam, out bool handled);
[DllImport("shell32.dll", EntryPoint = "CommandLineToArgvW", CharSet = CharSet.Unicode)]
private static extern IntPtr _CommandLineToArgvW([MarshalAs(UnmanagedType.LPWStr)] string cmdLine, out int numArgs);
[DllImport("kernel32.dll", EntryPoint = "LocalFree", SetLastError = true)]
private static extern IntPtr _LocalFree(IntPtr hMem);
public static string[] CommandLineToArgvW(string cmdLine)
{
IntPtr argv = IntPtr.Zero;
try
{
int numArgs = 0;
argv = _CommandLineToArgvW(cmdLine, out numArgs);
if (argv == IntPtr.Zero)
{
throw new Win32Exception();
}
var result = new string[numArgs];
for (int i = 0; i < numArgs; i++)
{
IntPtr currArg = Marshal.ReadIntPtr(argv, i * Marshal.SizeOf(typeof(IntPtr)));
result[i] = Marshal.PtrToStringUni(currArg);
}
return result;
}
finally
{
IntPtr p = _LocalFree(argv);
// Otherwise LocalFree failed.
// Assert.AreEqual(IntPtr.Zero, p);
}
}
}
public interface ISingleInstanceApp public interface ISingleInstanceApp
{ {
void OnSecondAppStarted(); void OnSecondAppStarted();
@ -219,10 +47,6 @@ namespace Flow.Launcher.Helper
#endregion #endregion
#region Public Properties
#endregion
#region Public Methods #region Public Methods
/// <summary> /// <summary>
@ -264,56 +88,6 @@ namespace Flow.Launcher.Helper
#region Private Methods #region Private Methods
/// <summary>
/// Gets command line args - for ClickOnce deployed applications, command line args may not be passed directly, they have to be retrieved.
/// </summary>
/// <returns>List of command line arg strings.</returns>
private static IList<string> GetCommandLineArgs( string uniqueApplicationName )
{
string[] args = null;
try
{
// The application was not clickonce deployed, get args from standard API's
args = Environment.GetCommandLineArgs();
}
catch (NotSupportedException)
{
// The application was clickonce deployed
// Clickonce deployed apps cannot recieve traditional commandline arguments
// As a workaround commandline arguments can be written to a shared location before
// the app is launched and the app can obtain its commandline arguments from the
// shared location
string appFolderPath = Path.Combine(
Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), uniqueApplicationName);
string cmdLinePath = Path.Combine(appFolderPath, "cmdline.txt");
if (File.Exists(cmdLinePath))
{
try
{
using (TextReader reader = new StreamReader(cmdLinePath, Encoding.Unicode))
{
args = NativeMethods.CommandLineToArgvW(reader.ReadToEnd());
}
File.Delete(cmdLinePath);
}
catch (IOException)
{
}
}
}
if (args == null)
{
args = new string[] { };
}
return new List<string>(args);
}
/// <summary> /// <summary>
/// Creates a remote server pipe for communication. /// Creates a remote server pipe for communication.
/// Once receives signal from client, will activate first instance. /// Once receives signal from client, will activate first instance.

View file

@ -2,29 +2,27 @@
using System.Linq; using System.Linq;
using System.Runtime.InteropServices; using System.Runtime.InteropServices;
using System.Text; using System.Text;
using System.Windows.Documents;
using System.Windows.Media; using System.Windows.Media;
using Microsoft.Win32; using Microsoft.Win32;
using Windows.Win32;
using Windows.Win32.UI.WindowsAndMessaging;
namespace Flow.Launcher.Helper; namespace Flow.Launcher.Helper;
public static class WallpaperPathRetrieval public static class WallpaperPathRetrieval
{ {
[DllImport("user32.dll", CharSet = CharSet.Unicode)] private static readonly int MAX_PATH = 260;
private static extern Int32 SystemParametersInfo(UInt32 action,
Int32 uParam, StringBuilder vParam, UInt32 winIni);
private static readonly UInt32 SPI_GETDESKWALLPAPER = 0x73;
private static int MAX_PATH = 260;
public static string GetWallpaperPath() public static unsafe string GetWallpaperPath()
{ {
var wallpaper = new StringBuilder(MAX_PATH); var wallpaperPtr = stackalloc char[MAX_PATH];
SystemParametersInfo(SPI_GETDESKWALLPAPER, MAX_PATH, wallpaper, 0); PInvoke.SystemParametersInfo(SYSTEM_PARAMETERS_INFO_ACTION.SPI_GETDESKWALLPAPER, (uint)MAX_PATH,
wallpaperPtr,
var str = wallpaper.ToString(); 0);
if (string.IsNullOrEmpty(str)) var wallpaper = MemoryMarshal.CreateReadOnlySpanFromNullTerminated(wallpaperPtr);
return null;
return wallpaper.ToString();
return str;
} }
public static Color GetWallpaperColor() public static Color GetWallpaperColor()
@ -35,13 +33,14 @@ public static class WallpaperPathRetrieval
{ {
try try
{ {
var parts = strResult.Trim().Split(new[] {' '}, 3).Select(byte.Parse).ToList(); var parts = strResult.Trim().Split(new[] { ' ' }, 3).Select(byte.Parse).ToList();
return Color.FromRgb(parts[0], parts[1], parts[2]); return Color.FromRgb(parts[0], parts[1], parts[2]);
} }
catch catch
{ {
} }
} }
return Colors.Transparent; return Colors.Transparent;
} }
} }

View file

@ -1,75 +1,52 @@
using System; using System;
using System.ComponentModel;
using System.Drawing; using System.Drawing;
using System.Runtime.InteropServices; using System.Runtime.InteropServices;
using System.Text;
using System.Windows; using System.Windows;
using System.Windows.Forms; using System.Windows.Forms;
using System.Windows.Interop; using System.Windows.Interop;
using System.Windows.Media; using System.Windows.Media;
using Windows.Win32;
using Windows.Win32.Foundation;
using Windows.Win32.UI.WindowsAndMessaging;
using Point = System.Windows.Point; using Point = System.Windows.Point;
namespace Flow.Launcher.Helper; namespace Flow.Launcher.Helper;
public class WindowsInteropHelper public class WindowsInteropHelper
{ {
private const int GWL_STYLE = -16; //WPF's Message code for Title Bar's Style private static HWND _hwnd_shell;
private const int WS_SYSMENU = 0x80000; //WPF's Message code for System Menu private static HWND _hwnd_desktop;
private static IntPtr _hwnd_shell;
private static IntPtr _hwnd_desktop;
//Accessors for shell and desktop handlers //Accessors for shell and desktop handlers
//Will set the variables once and then will return them //Will set the variables once and then will return them
private static IntPtr HWND_SHELL private static HWND HWND_SHELL
{ {
get get
{ {
return _hwnd_shell != IntPtr.Zero ? _hwnd_shell : _hwnd_shell = GetShellWindow(); return _hwnd_shell != HWND.Null ? _hwnd_shell : _hwnd_shell = PInvoke.GetShellWindow();
} }
} }
private static IntPtr HWND_DESKTOP
private static HWND HWND_DESKTOP
{ {
get get
{ {
return _hwnd_desktop != IntPtr.Zero ? _hwnd_desktop : _hwnd_desktop = GetDesktopWindow(); return _hwnd_desktop != HWND.Null ? _hwnd_desktop : _hwnd_desktop = PInvoke.GetDesktopWindow();
} }
} }
[DllImport("user32.dll", SetLastError = true)]
internal static extern int GetWindowLong(IntPtr hWnd, int nIndex);
[DllImport("user32.dll")]
internal static extern int SetWindowLong(IntPtr hWnd, int nIndex, int dwNewLong);
[DllImport("user32.dll")]
internal static extern IntPtr GetForegroundWindow();
[DllImport("user32.dll")]
internal static extern IntPtr GetDesktopWindow();
[DllImport("user32.dll")]
internal static extern IntPtr GetShellWindow();
[DllImport("user32.dll", SetLastError = true)]
internal static extern int GetWindowRect(IntPtr hwnd, out RECT rc);
[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
internal static extern int GetClassName(IntPtr hWnd, StringBuilder lpClassName, int nMaxCount);
[DllImport("user32.DLL")]
public static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow);
const string WINDOW_CLASS_CONSOLE = "ConsoleWindowClass"; const string WINDOW_CLASS_CONSOLE = "ConsoleWindowClass";
const string WINDOW_CLASS_WINTAB = "Flip3D"; const string WINDOW_CLASS_WINTAB = "Flip3D";
const string WINDOW_CLASS_PROGMAN = "Progman"; const string WINDOW_CLASS_PROGMAN = "Progman";
const string WINDOW_CLASS_WORKERW = "WorkerW"; const string WINDOW_CLASS_WORKERW = "WorkerW";
public static bool IsWindowFullscreen() public unsafe static bool IsWindowFullscreen()
{ {
//get current active window //get current active window
IntPtr hWnd = GetForegroundWindow(); var hWnd = PInvoke.GetForegroundWindow();
if (hWnd.Equals(IntPtr.Zero)) if (hWnd.Equals(HWND.Null))
{ {
return false; return false;
} }
@ -80,9 +57,17 @@ public class WindowsInteropHelper
return false; return false;
} }
StringBuilder sb = new StringBuilder(256); string windowClass;
GetClassName(hWnd, sb, sb.Capacity); const int capacity = 256;
string windowClass = sb.ToString(); Span<char> buffer = stackalloc char[capacity];
int validLength;
fixed (char* pBuffer = buffer)
{
validLength = PInvoke.GetClassName(hWnd, pBuffer, capacity);
}
windowClass = buffer[..validLength].ToString();
//for Win+Tab (Flip3D) //for Win+Tab (Flip3D)
if (windowClass == WINDOW_CLASS_WINTAB) if (windowClass == WINDOW_CLASS_WINTAB)
@ -90,28 +75,28 @@ public class WindowsInteropHelper
return false; return false;
} }
RECT appBounds; PInvoke.GetWindowRect(hWnd, out var appBounds);
GetWindowRect(hWnd, out appBounds);
//for console (ConsoleWindowClass), we have to check for negative dimensions //for console (ConsoleWindowClass), we have to check for negative dimensions
if (windowClass == WINDOW_CLASS_CONSOLE) if (windowClass == WINDOW_CLASS_CONSOLE)
{ {
return appBounds.Top < 0 && appBounds.Bottom < 0; return appBounds.top < 0 && appBounds.bottom < 0;
} }
//for desktop (Progman or WorkerW, depends on the system), we have to check //for desktop (Progman or WorkerW, depends on the system), we have to check
if (windowClass is WINDOW_CLASS_PROGMAN or WINDOW_CLASS_WORKERW) if (windowClass is WINDOW_CLASS_PROGMAN or WINDOW_CLASS_WORKERW)
{ {
IntPtr hWndDesktop = FindWindowEx(hWnd, IntPtr.Zero, "SHELLDLL_DefView", null); var hWndDesktop = PInvoke.FindWindowEx(hWnd, HWND.Null, "SHELLDLL_DefView", null);
hWndDesktop = FindWindowEx(hWndDesktop, IntPtr.Zero, "SysListView32", "FolderView"); hWndDesktop = PInvoke.FindWindowEx(hWndDesktop, HWND.Null, "SysListView32", "FolderView");
if (!hWndDesktop.Equals(IntPtr.Zero)) if (hWndDesktop.Value != (IntPtr.Zero))
{ {
return false; return false;
} }
} }
Rectangle screenBounds = Screen.FromHandle(hWnd).Bounds; Rectangle screenBounds = Screen.FromHandle(hWnd).Bounds;
return (appBounds.Bottom - appBounds.Top) == screenBounds.Height && (appBounds.Right - appBounds.Left) == screenBounds.Width; return (appBounds.bottom - appBounds.top) == screenBounds.Height &&
(appBounds.right - appBounds.left) == screenBounds.Width;
} }
/// <summary> /// <summary>
@ -120,8 +105,24 @@ public class WindowsInteropHelper
/// </summary> /// </summary>
public static void DisableControlBox(Window win) public static void DisableControlBox(Window win)
{ {
var hwnd = new WindowInteropHelper(win).Handle; var hwnd = new HWND(new WindowInteropHelper(win).Handle);
SetWindowLong(hwnd, GWL_STYLE, GetWindowLong(hwnd, GWL_STYLE) & ~WS_SYSMENU);
var style = PInvoke.GetWindowLong(hwnd, WINDOW_LONG_PTR_INDEX.GWL_STYLE);
if (style == 0)
{
throw new Win32Exception(Marshal.GetLastPInvokeError());
}
style &= ~(int)WINDOW_STYLE.WS_SYSMENU;
var previousStyle = PInvoke.SetWindowLong(hwnd, WINDOW_LONG_PTR_INDEX.GWL_STYLE,
style);
if (previousStyle == 0)
{
throw new Win32Exception(Marshal.GetLastPInvokeError());
}
} }
/// <summary> /// <summary>
@ -144,16 +145,7 @@ public class WindowsInteropHelper
using var src = new HwndSource(new HwndSourceParameters()); using var src = new HwndSource(new HwndSourceParameters());
matrix = src.CompositionTarget.TransformFromDevice; matrix = src.CompositionTarget.TransformFromDevice;
} }
return new Point((int)(matrix.M11 * unitX), (int)(matrix.M22 * unitY)); return new Point((int)(matrix.M11 * unitX), (int)(matrix.M22 * unitY));
} }
[StructLayout(LayoutKind.Sequential)]
public struct RECT
{
public int Left;
public int Top;
public int Right;
public int Bottom;
}
} }

View file

@ -65,6 +65,8 @@
<system:String x:Key="LastQueryPreserved">حفظ الاستعلام الأخير</system:String> <system:String x:Key="LastQueryPreserved">حفظ الاستعلام الأخير</system:String>
<system:String x:Key="LastQuerySelected">اختيار الاستعلام الأخير</system:String> <system:String x:Key="LastQuerySelected">اختيار الاستعلام الأخير</system:String>
<system:String x:Key="LastQueryEmpty">تفريغ الاستعلام الأخير</system:String> <system:String x:Key="LastQueryEmpty">تفريغ الاستعلام الأخير</system:String>
<system:String x:Key="LastQueryActionKeywordPreserved">Preserve Last Action Keyword</system:String>
<system:String x:Key="LastQueryActionKeywordSelected">Select Last Action Keyword</system:String>
<system:String x:Key="KeepMaxResults">ارتفاع ثابت للنافذة</system:String> <system:String x:Key="KeepMaxResults">ارتفاع ثابت للنافذة</system:String>
<system:String x:Key="KeepMaxResultsToolTip">ارتفاع النافذة غير قابل للتعديل عن طريق السحب.</system:String> <system:String x:Key="KeepMaxResultsToolTip">ارتفاع النافذة غير قابل للتعديل عن طريق السحب.</system:String>
<system:String x:Key="maxShowResults">الحد الأقصى للنتائج المعروضة</system:String> <system:String x:Key="maxShowResults">الحد الأقصى للنتائج المعروضة</system:String>

View file

@ -65,6 +65,8 @@
<system:String x:Key="LastQueryPreserved">Zachovat poslední dotaz</system:String> <system:String x:Key="LastQueryPreserved">Zachovat poslední dotaz</system:String>
<system:String x:Key="LastQuerySelected">Vybrat poslední dotaz</system:String> <system:String x:Key="LastQuerySelected">Vybrat poslední dotaz</system:String>
<system:String x:Key="LastQueryEmpty">Smazat poslední dotaz</system:String> <system:String x:Key="LastQueryEmpty">Smazat poslední dotaz</system:String>
<system:String x:Key="LastQueryActionKeywordPreserved">Preserve Last Action Keyword</system:String>
<system:String x:Key="LastQueryActionKeywordSelected">Select Last Action Keyword</system:String>
<system:String x:Key="KeepMaxResults">Fixed Window Height</system:String> <system:String x:Key="KeepMaxResults">Fixed Window Height</system:String>
<system:String x:Key="KeepMaxResultsToolTip">The window height is not adjustable by dragging.</system:String> <system:String x:Key="KeepMaxResultsToolTip">The window height is not adjustable by dragging.</system:String>
<system:String x:Key="maxShowResults">Počet zobrazených výsledků</system:String> <system:String x:Key="maxShowResults">Počet zobrazených výsledků</system:String>

View file

@ -65,6 +65,8 @@
<system:String x:Key="LastQueryPreserved">Preserve Last Query</system:String> <system:String x:Key="LastQueryPreserved">Preserve Last Query</system:String>
<system:String x:Key="LastQuerySelected">Select last Query</system:String> <system:String x:Key="LastQuerySelected">Select last Query</system:String>
<system:String x:Key="LastQueryEmpty">Empty last Query</system:String> <system:String x:Key="LastQueryEmpty">Empty last Query</system:String>
<system:String x:Key="LastQueryActionKeywordPreserved">Preserve Last Action Keyword</system:String>
<system:String x:Key="LastQueryActionKeywordSelected">Select Last Action Keyword</system:String>
<system:String x:Key="KeepMaxResults">Fixed Window Height</system:String> <system:String x:Key="KeepMaxResults">Fixed Window Height</system:String>
<system:String x:Key="KeepMaxResultsToolTip">The window height is not adjustable by dragging.</system:String> <system:String x:Key="KeepMaxResultsToolTip">The window height is not adjustable by dragging.</system:String>
<system:String x:Key="maxShowResults">Maksimum antal resultater vist</system:String> <system:String x:Key="maxShowResults">Maksimum antal resultater vist</system:String>

View file

@ -65,6 +65,8 @@
<system:String x:Key="LastQueryPreserved">Letzte Abfrage beibehalten</system:String> <system:String x:Key="LastQueryPreserved">Letzte Abfrage beibehalten</system:String>
<system:String x:Key="LastQuerySelected">Letzte Abfrage auswählen</system:String> <system:String x:Key="LastQuerySelected">Letzte Abfrage auswählen</system:String>
<system:String x:Key="LastQueryEmpty">Letzte Abfrage leeren</system:String> <system:String x:Key="LastQueryEmpty">Letzte Abfrage leeren</system:String>
<system:String x:Key="LastQueryActionKeywordPreserved">Preserve Last Action Keyword</system:String>
<system:String x:Key="LastQueryActionKeywordSelected">Select Last Action Keyword</system:String>
<system:String x:Key="KeepMaxResults">Feste Fensterhöhe</system:String> <system:String x:Key="KeepMaxResults">Feste Fensterhöhe</system:String>
<system:String x:Key="KeepMaxResultsToolTip">Die Fensterhöhe ist durch Ziehen nicht anpassbar.</system:String> <system:String x:Key="KeepMaxResultsToolTip">Die Fensterhöhe ist durch Ziehen nicht anpassbar.</system:String>
<system:String x:Key="maxShowResults">Maximal gezeigte Ergebnisse</system:String> <system:String x:Key="maxShowResults">Maximal gezeigte Ergebnisse</system:String>
@ -77,7 +79,7 @@
<system:String x:Key="defaultBrowserToolTip">Einstellung für Neuer Tab, Neues Fenster, Privater Modus.</system:String> <system:String x:Key="defaultBrowserToolTip">Einstellung für Neuer Tab, Neues Fenster, Privater Modus.</system:String>
<system:String x:Key="pythonFilePath">Python-Pfad</system:String> <system:String x:Key="pythonFilePath">Python-Pfad</system:String>
<system:String x:Key="nodeFilePath">Node.js-Pfad</system:String> <system:String x:Key="nodeFilePath">Node.js-Pfad</system:String>
<system:String x:Key="selectNodeExecutable">Bitte wählen Sie das Programm Node.js aus</system:String> <system:String x:Key="selectNodeExecutable">Bitte wählen Sie die ausführbare Datei Node.js aus</system:String>
<system:String x:Key="selectPythonExecutable">Bitte wählen Sie pythonw.exe aus</system:String> <system:String x:Key="selectPythonExecutable">Bitte wählen Sie pythonw.exe aus</system:String>
<system:String x:Key="typingStartEn">Tippen immer im englischen Modus starten</system:String> <system:String x:Key="typingStartEn">Tippen immer im englischen Modus starten</system:String>
<system:String x:Key="typingStartEnTooltip">Ändern Sie Ihre Eingabemethode temporär in den englischen Modus, wenn Sie Flow aktivieren.</system:String> <system:String x:Key="typingStartEnTooltip">Ändern Sie Ihre Eingabemethode temporär in den englischen Modus, wenn Sie Flow aktivieren.</system:String>
@ -166,8 +168,8 @@
<system:String x:Key="CustomizeToolTip">Individuell anpassen</system:String> <system:String x:Key="CustomizeToolTip">Individuell anpassen</system:String>
<system:String x:Key="windowMode">Fenstermodus</system:String> <system:String x:Key="windowMode">Fenstermodus</system:String>
<system:String x:Key="opacity">Opazität</system:String> <system:String x:Key="opacity">Opazität</system:String>
<system:String x:Key="theme_load_failure_path_not_exists">Theme {0} ist nicht vorhanden, Fallback auf Standard-Theme</system:String> <system:String x:Key="theme_load_failure_path_not_exists">Theme {0} ist nicht vorhanden, Fallback auf Default-Theme</system:String>
<system:String x:Key="theme_load_failure_parse_error">Theme {0} konnte nicht geladen werden, Fallback auf Standard-Theme</system:String> <system:String x:Key="theme_load_failure_parse_error">Theme {0} konnte nicht geladen werden, Fallback auf Default-Theme</system:String>
<system:String x:Key="ThemeFolder">Theme-Ordner</system:String> <system:String x:Key="ThemeFolder">Theme-Ordner</system:String>
<system:String x:Key="OpenThemeFolder">Theme-Ordner öffnen</system:String> <system:String x:Key="OpenThemeFolder">Theme-Ordner öffnen</system:String>
<system:String x:Key="ColorScheme">Farbschema</system:String> <system:String x:Key="ColorScheme">Farbschema</system:String>
@ -175,7 +177,7 @@
<system:String x:Key="ColorSchemeLight">Hell</system:String> <system:String x:Key="ColorSchemeLight">Hell</system:String>
<system:String x:Key="ColorSchemeDark">Dunkel</system:String> <system:String x:Key="ColorSchemeDark">Dunkel</system:String>
<system:String x:Key="SoundEffect">Soundeffekt</system:String> <system:String x:Key="SoundEffect">Soundeffekt</system:String>
<system:String x:Key="SoundEffectTip">Einen kleinen Sound abspielen, wenn das Suchfenster geöffnet wird</system:String> <system:String x:Key="SoundEffectTip">Einen kurzen Sound abspielen, wenn das Suchfenster geöffnet wird</system:String>
<system:String x:Key="SoundEffectVolume">Lautstärke der Soundeffekte</system:String> <system:String x:Key="SoundEffectVolume">Lautstärke der Soundeffekte</system:String>
<system:String x:Key="SoundEffectVolumeTip">Lautstärke des Soundeffekts anpassen</system:String> <system:String x:Key="SoundEffectVolumeTip">Lautstärke des Soundeffekts anpassen</system:String>
<system:String x:Key="SoundEffectWarning">Windows Media Player ist nicht verfügbar und ist für die Lautstärkeregelung von Flow erforderlich. Bitte überprüfen Sie Ihre Installation, wenn Sie die Lautstärke anpassen müssen.</system:String> <system:String x:Key="SoundEffectWarning">Windows Media Player ist nicht verfügbar und ist für die Lautstärkeregelung von Flow erforderlich. Bitte überprüfen Sie Ihre Installation, wenn Sie die Lautstärke anpassen müssen.</system:String>
@ -287,8 +289,8 @@
<system:String x:Key="releaseNotes">Versionshinweise</system:String> <system:String x:Key="releaseNotes">Versionshinweise</system:String>
<system:String x:Key="documentation">Tipps zur Nutzung</system:String> <system:String x:Key="documentation">Tipps zur Nutzung</system:String>
<system:String x:Key="devtool">DevTools</system:String> <system:String x:Key="devtool">DevTools</system:String>
<system:String x:Key="settingfolder">Ordner Einstellungen</system:String> <system:String x:Key="settingfolder">Ordner »Settings«</system:String>
<system:String x:Key="logfolder">Ordner Logs</system:String> <system:String x:Key="logfolder">Ordner »Logs«</system:String>
<system:String x:Key="clearlogfolder">Logs löschen</system:String> <system:String x:Key="clearlogfolder">Logs löschen</system:String>
<system:String x:Key="clearlogfolderMessage">Sind Sie sicher, dass Sie alle Logs löschen wollen?</system:String> <system:String x:Key="clearlogfolderMessage">Sind Sie sicher, dass Sie alle Logs löschen wollen?</system:String>
<system:String x:Key="welcomewindow">Assistent</system:String> <system:String x:Key="welcomewindow">Assistent</system:String>
@ -411,8 +413,8 @@ Wenn Sie bei der Eingabe eines Shortcuts ein '@'-Präfix hinzufügen, stimmt die
<system:String x:Key="Welcome_Page1_Title">Willkommen bei Flow Launcher</system:String> <system:String x:Key="Welcome_Page1_Title">Willkommen bei Flow Launcher</system:String>
<system:String x:Key="Welcome_Page1_Text01">Hallo, dies ist das erste Mal, dass Sie Flow Launcher ausführen!</system:String> <system:String x:Key="Welcome_Page1_Text01">Hallo, dies ist das erste Mal, dass Sie Flow Launcher ausführen!</system:String>
<system:String x:Key="Welcome_Page1_Text02">Bevor Sie beginnen, hilft dieser Assistent bei der Einrichtung von Flow Launcher. Sie können dies überspringen, wenn Sie möchten. Bitte wählen Sie eine Sprache</system:String> <system:String x:Key="Welcome_Page1_Text02">Bevor Sie beginnen, hilft dieser Assistent bei der Einrichtung von Flow Launcher. Sie können dies überspringen, wenn Sie möchten. Bitte wählen Sie eine Sprache</system:String>
<system:String x:Key="Welcome_Page2_Title">Suchen und führen Sie alle Dateien und Anwendungen auf Ihrem PC aus</system:String> <system:String x:Key="Welcome_Page2_Title">Alle Dateien und Anwendungen auf Ihrem PC suchen und ausführen</system:String>
<system:String x:Key="Welcome_Page2_Text01">Suchen Sie alles in Anwendungen, Dateien, Lesezeichen, YouTube, Twitter und vielem mehr. Alles bequem über Ihre Tastatur, ohne die Maus zu berühren.</system:String> <system:String x:Key="Welcome_Page2_Text01">Durchsuchen Sie alles von Anwendungen, Dateien, Lesezeichen, YouTube, Twitter und vielem mehr. Alles bequem über Ihre Tastatur, ohne die Maus zu berühren.</system:String>
<system:String x:Key="Welcome_Page2_Text02">Flow Launcher startet mit dem unten stehenden Hotkey, probieren Sie ihn gleich aus. Um ihn zu ändern, klicken Sie auf die Eingabe und drücken Sie den gewünschten Hotkey auf der Tastatur.</system:String> <system:String x:Key="Welcome_Page2_Text02">Flow Launcher startet mit dem unten stehenden Hotkey, probieren Sie ihn gleich aus. Um ihn zu ändern, klicken Sie auf die Eingabe und drücken Sie den gewünschten Hotkey auf der Tastatur.</system:String>
<system:String x:Key="Welcome_Page3_Title">Hotkeys</system:String> <system:String x:Key="Welcome_Page3_Title">Hotkeys</system:String>
<system:String x:Key="Welcome_Page4_Title">Aktions-Schlüsselwort und Befehle</system:String> <system:String x:Key="Welcome_Page4_Title">Aktions-Schlüsselwort und Befehle</system:String>

View file

@ -65,6 +65,8 @@
<system:String x:Key="LastQueryPreserved">Conservar última consulta</system:String> <system:String x:Key="LastQueryPreserved">Conservar última consulta</system:String>
<system:String x:Key="LastQuerySelected">Seleccionar última consulta</system:String> <system:String x:Key="LastQuerySelected">Seleccionar última consulta</system:String>
<system:String x:Key="LastQueryEmpty">Borrar última consulta</system:String> <system:String x:Key="LastQueryEmpty">Borrar última consulta</system:String>
<system:String x:Key="LastQueryActionKeywordPreserved">Preserve Last Action Keyword</system:String>
<system:String x:Key="LastQueryActionKeywordSelected">Select Last Action Keyword</system:String>
<system:String x:Key="KeepMaxResults">Fixed Window Height</system:String> <system:String x:Key="KeepMaxResults">Fixed Window Height</system:String>
<system:String x:Key="KeepMaxResultsToolTip">The window height is not adjustable by dragging.</system:String> <system:String x:Key="KeepMaxResultsToolTip">The window height is not adjustable by dragging.</system:String>
<system:String x:Key="maxShowResults">Máximo de resultados mostrados</system:String> <system:String x:Key="maxShowResults">Máximo de resultados mostrados</system:String>

View file

@ -65,6 +65,8 @@
<system:String x:Key="LastQueryPreserved">Mantener la última consulta</system:String> <system:String x:Key="LastQueryPreserved">Mantener la última consulta</system:String>
<system:String x:Key="LastQuerySelected">Seleccionar la última consulta</system:String> <system:String x:Key="LastQuerySelected">Seleccionar la última consulta</system:String>
<system:String x:Key="LastQueryEmpty">Limpiar la última consulta</system:String> <system:String x:Key="LastQueryEmpty">Limpiar la última consulta</system:String>
<system:String x:Key="LastQueryActionKeywordPreserved">Conservar palabra clave de última acción</system:String>
<system:String x:Key="LastQueryActionKeywordSelected">Seleccionar palabra clave de última acción</system:String>
<system:String x:Key="KeepMaxResults">Altura de la ventana fija</system:String> <system:String x:Key="KeepMaxResults">Altura de la ventana fija</system:String>
<system:String x:Key="KeepMaxResultsToolTip">La altura de la ventana no se puede ajustar arrastrando el ratón.</system:String> <system:String x:Key="KeepMaxResultsToolTip">La altura de la ventana no se puede ajustar arrastrando el ratón.</system:String>
<system:String x:Key="maxShowResults">Número máximo de resultados mostrados</system:String> <system:String x:Key="maxShowResults">Número máximo de resultados mostrados</system:String>
@ -218,7 +220,7 @@
<system:String x:Key="OpenNativeContextMenuHotkey">Abrir menú contextual nativo</system:String> <system:String x:Key="OpenNativeContextMenuHotkey">Abrir menú contextual nativo</system:String>
<system:String x:Key="SettingWindowHotkey">Abrir ventana de configuración</system:String> <system:String x:Key="SettingWindowHotkey">Abrir ventana de configuración</system:String>
<system:String x:Key="CopyFilePathHotkey">Copiar ruta del archivo</system:String> <system:String x:Key="CopyFilePathHotkey">Copiar ruta del archivo</system:String>
<system:String x:Key="ToggleGameModeHotkey">Cambia a Modo Juego</system:String> <system:String x:Key="ToggleGameModeHotkey">Cambiar a Modo Juego</system:String>
<system:String x:Key="ToggleHistoryHotkey">Cambiar historial</system:String> <system:String x:Key="ToggleHistoryHotkey">Cambiar historial</system:String>
<system:String x:Key="OpenContainFolderHotkey">Abrir carpeta contenedora</system:String> <system:String x:Key="OpenContainFolderHotkey">Abrir carpeta contenedora</system:String>
<system:String x:Key="RunAsAdminHotkey">Ejecutar como administrador</system:String> <system:String x:Key="RunAsAdminHotkey">Ejecutar como administrador</system:String>
@ -293,7 +295,7 @@
<system:String x:Key="clearlogfolderMessage">¿Está seguro de que desea eliminar todos los registros?</system:String> <system:String x:Key="clearlogfolderMessage">¿Está seguro de que desea eliminar todos los registros?</system:String>
<system:String x:Key="welcomewindow">Asistente</system:String> <system:String x:Key="welcomewindow">Asistente</system:String>
<system:String x:Key="userdatapath">Ubicación de datos del usuario</system:String> <system:String x:Key="userdatapath">Ubicación de datos del usuario</system:String>
<system:String x:Key="userdatapathToolTip">La configuración del usuario y los complementos instalados se guardan en la carpeta de datos del usuario. Esta ubicación puede variar dependiendo de si está en modo portátil o no.</system:String> <system:String x:Key="userdatapathToolTip">La configuración del usuario y los complementos instalados se guardan en la carpeta de datos del usuario. Esta ubicación puede variar dependiendo de si está en modo portable o no.</system:String>
<system:String x:Key="userdatapathButton">Abrir carpeta</system:String> <system:String x:Key="userdatapathButton">Abrir carpeta</system:String>
<!-- FileManager Setting Dialog --> <!-- FileManager Setting Dialog -->

View file

@ -65,6 +65,8 @@
<system:String x:Key="LastQueryPreserved">Conserver la dernière recherche</system:String> <system:String x:Key="LastQueryPreserved">Conserver la dernière recherche</system:String>
<system:String x:Key="LastQuerySelected">Sélectionner la dernière recherche</system:String> <system:String x:Key="LastQuerySelected">Sélectionner la dernière recherche</system:String>
<system:String x:Key="LastQueryEmpty">Ne pas afficher la dernière recherche</system:String> <system:String x:Key="LastQueryEmpty">Ne pas afficher la dernière recherche</system:String>
<system:String x:Key="LastQueryActionKeywordPreserved">Conserver le mot clé de la dernière action</system:String>
<system:String x:Key="LastQueryActionKeywordSelected">Sélectionnez le mot clé de la dernière action</system:String>
<system:String x:Key="KeepMaxResults">Hauteur de fenêtre fixe</system:String> <system:String x:Key="KeepMaxResults">Hauteur de fenêtre fixe</system:String>
<system:String x:Key="KeepMaxResultsToolTip">La hauteur de la fenêtre n'est pas réglable par glissement.</system:String> <system:String x:Key="KeepMaxResultsToolTip">La hauteur de la fenêtre n'est pas réglable par glissement.</system:String>
<system:String x:Key="maxShowResults">Résultats maximums à afficher</system:String> <system:String x:Key="maxShowResults">Résultats maximums à afficher</system:String>

View file

@ -0,0 +1,458 @@
<?xml version="1.0"?>
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:system="clr-namespace:System;assembly=mscorlib">
<!-- Startup -->
<system:String x:Key="runtimePluginInstalledChooseRuntimePrompt">
Flow detected you have installed {0} plugins, which will require {1} to run. Would you like to download {1}?
{2}{2}
Click no if it's already installed, and you will be prompted to select the folder that contains the {1} executable
</system:String>
<system:String x:Key="runtimePluginChooseRuntimeExecutable">אנא בחר את קובץ ההפעלה {0}</system:String>
<system:String x:Key="runtimePluginUnableToSetExecutablePath">לא ניתן להגדיר נתיב הפעלה {0}, אנא נסה שוב בהגדרות Flow (גלול עד למטה).</system:String>
<system:String x:Key="failedToInitializePluginsTitle">נכשל בהפעלת תוספים</system:String>
<system:String x:Key="failedToInitializePluginsMessage">תוספים: {0} - נכשלים בטעינה ויהיו מושבתים, אנא צור קשר עם יוצרי התוספים לקבלת עזרה</system:String>
<!-- MainWindow -->
<system:String x:Key="registerHotkeyFailed">רישום מקש הקיצור &quot;{0}&quot; נכשל. ייתכן שמקש הקיצור נמצא בשימוש על ידי תוכנה אחרת. שנה למקש קיצור אחר, או צא מהתוכנה האחרת.</system:String>
<system:String x:Key="MessageBoxTitle">Flow Launcher</system:String>
<system:String x:Key="couldnotStartCmd">לא ניתן היה להפעיל את {0}</system:String>
<system:String x:Key="invalidFlowLauncherPluginFileFormat">פורמט קובץ תוסף Flow Launcher לא חוקי</system:String>
<system:String x:Key="setAsTopMostInThisQuery">הגדר כגבוה ביותר בשאילתה זו</system:String>
<system:String x:Key="cancelTopMostInThisQuery">בטל העלאה בשאילתה זו</system:String>
<system:String x:Key="executeQuery">בצע שאילתה: {0}</system:String>
<system:String x:Key="lastExecuteTime">Last execution time: {0}</system:String>
<system:String x:Key="iconTrayOpen">פתח</system:String>
<system:String x:Key="iconTraySettings">הגדרות</system:String>
<system:String x:Key="iconTrayAbout">אודות</system:String>
<system:String x:Key="iconTrayExit">יציאה</system:String>
<system:String x:Key="closeWindow">סגור</system:String>
<system:String x:Key="copy">העתק</system:String>
<system:String x:Key="cut">גזור</system:String>
<system:String x:Key="paste">הדבק</system:String>
<system:String x:Key="undo">Undo</system:String>
<system:String x:Key="selectAll">בחר הכל</system:String>
<system:String x:Key="fileTitle">קובץ</system:String>
<system:String x:Key="folderTitle">תיקייה</system:String>
<system:String x:Key="textTitle">טקסט</system:String>
<system:String x:Key="GameMode">מצב משחק</system:String>
<system:String x:Key="GameModeToolTip">השהה את השימוש במקשי קיצור.</system:String>
<system:String x:Key="PositionReset">Position Reset</system:String>
<system:String x:Key="PositionResetToolTip">Reset search window position</system:String>
<!-- Setting General -->
<system:String x:Key="flowlauncher_settings">הגדרות</system:String>
<system:String x:Key="general">כללי</system:String>
<system:String x:Key="portableMode">מצב נייד</system:String>
<system:String x:Key="portableModeToolTIp">אחסן את כל ההגדרות ונתוני המשתמש בתיקייה אחת (שימושי בשימוש עם כוננים נשלפים או שירותי ענן).</system:String>
<system:String x:Key="startFlowLauncherOnSystemStartup">הפעל את Flow Launcher בעת הפעלת Window</system:String>
<system:String x:Key="setAutoStartFailed">שגיאה בהגדרת ההפעלה בעת הפעלת windows</system:String>
<system:String x:Key="hideFlowLauncherWhenLoseFocus">הסתר את Flow Launcher כאשר הוא אינו החלון הפעיל</system:String>
<system:String x:Key="dontPromptUpdateMsg">אל תציג התראות על גרסה חדשה</system:String>
<system:String x:Key="SearchWindowPosition">מיקום חלון החיפוש</system:String>
<system:String x:Key="SearchWindowScreenRememberLastLaunchLocation">זכור את המיקום האחרון</system:String>
<system:String x:Key="SearchWindowScreenCursor">Monitor with Mouse Cursor</system:String>
<system:String x:Key="SearchWindowScreenFocus">Monitor with Focused Window</system:String>
<system:String x:Key="SearchWindowScreenPrimary">צג ראשי</system:String>
<system:String x:Key="SearchWindowScreenCustom">צג מותאם אישית</system:String>
<system:String x:Key="SearchWindowAlign">Search Window Position on Monitor</system:String>
<system:String x:Key="SearchWindowAlignCenter">Center</system:String>
<system:String x:Key="SearchWindowAlignCenterTop">Center Top</system:String>
<system:String x:Key="SearchWindowAlignLeftTop">Left Top</system:String>
<system:String x:Key="SearchWindowAlignRightTop">Right Top</system:String>
<system:String x:Key="SearchWindowAlignCustom">Custom Position</system:String>
<system:String x:Key="language">שפה</system:String>
<system:String x:Key="lastQueryMode">Last Query Style</system:String>
<system:String x:Key="lastQueryModeToolTip">Show/Hide previous results when Flow Launcher is reactivated.</system:String>
<system:String x:Key="LastQueryPreserved">Preserve Last Query</system:String>
<system:String x:Key="LastQuerySelected">Select last Query</system:String>
<system:String x:Key="LastQueryEmpty">Empty last Query</system:String>
<system:String x:Key="LastQueryActionKeywordPreserved">Preserve Last Action Keyword</system:String>
<system:String x:Key="LastQueryActionKeywordSelected">Select Last Action Keyword</system:String>
<system:String x:Key="KeepMaxResults">Fixed Window Height</system:String>
<system:String x:Key="KeepMaxResultsToolTip">The window height is not adjustable by dragging.</system:String>
<system:String x:Key="maxShowResults">Maximum results shown</system:String>
<system:String x:Key="maxShowResultsToolTip">You can also quickly adjust this by using CTRL+Plus and CTRL+Minus.</system:String>
<system:String x:Key="ignoreHotkeysOnFullscreen">Ignore hotkeys in fullscreen mode</system:String>
<system:String x:Key="ignoreHotkeysOnFullscreenToolTip">Disable Flow Launcher activation when a full screen application is active (Recommended for games).</system:String>
<system:String x:Key="defaultFileManager">Default File Manager</system:String>
<system:String x:Key="defaultFileManagerToolTip">Select the file manager to use when opening the folder.</system:String>
<system:String x:Key="defaultBrowser">Default Web Browser</system:String>
<system:String x:Key="defaultBrowserToolTip">Setting for New Tab, New Window, Private Mode.</system:String>
<system:String x:Key="pythonFilePath">Python Path</system:String>
<system:String x:Key="nodeFilePath">Node.js Path</system:String>
<system:String x:Key="selectNodeExecutable">Please select the Node.js executable</system:String>
<system:String x:Key="selectPythonExecutable">Please select pythonw.exe</system:String>
<system:String x:Key="typingStartEn">Always Start Typing in English Mode</system:String>
<system:String x:Key="typingStartEnTooltip">Temporarily change your input method to English mode when activating Flow.</system:String>
<system:String x:Key="autoUpdates">Auto Update</system:String>
<system:String x:Key="select">Select</system:String>
<system:String x:Key="hideOnStartup">Hide Flow Launcher on startup</system:String>
<system:String x:Key="hideOnStartupToolTip">Flow Launcher search window is hidden in the tray after starting up.</system:String>
<system:String x:Key="hideNotifyIcon">Hide tray icon</system:String>
<system:String x:Key="hideNotifyIconToolTip">When the icon is hidden from the tray, the Settings menu can be opened by right-clicking on the search window.</system:String>
<system:String x:Key="querySearchPrecision">Query Search Precision</system:String>
<system:String x:Key="querySearchPrecisionToolTip">Changes minimum match score required for results.</system:String>
<system:String x:Key="SearchPrecisionNone">None</system:String>
<system:String x:Key="SearchPrecisionLow">Low</system:String>
<system:String x:Key="SearchPrecisionRegular">Regular</system:String>
<system:String x:Key="ShouldUsePinyin">Search with Pinyin</system:String>
<system:String x:Key="ShouldUsePinyinToolTip">Allows using Pinyin to search. Pinyin is the standard system of romanized spelling for translating Chinese.</system:String>
<system:String x:Key="AlwaysPreview">Always Preview</system:String>
<system:String x:Key="AlwaysPreviewToolTip">Always open preview panel when Flow activates. Press {0} to toggle preview.</system:String>
<system:String x:Key="shadowEffectNotAllowed">Shadow effect is not allowed while current theme has blur effect enabled</system:String>
<!-- Setting Plugin -->
<system:String x:Key="searchplugin">Search Plugin</system:String>
<system:String x:Key="searchpluginToolTip">Ctrl+F to search plugins</system:String>
<system:String x:Key="searchplugin_Noresult_Title">No results found</system:String>
<system:String x:Key="searchplugin_Noresult_Subtitle">Please try a different search.</system:String>
<system:String x:Key="plugin">Plugin</system:String>
<system:String x:Key="plugins">תוספים</system:String>
<system:String x:Key="browserMorePlugins">מצא תוספים נוספים</system:String>
<system:String x:Key="enable">On</system:String>
<system:String x:Key="disable">Off</system:String>
<system:String x:Key="actionKeywordsTitle">Action keyword Setting</system:String>
<system:String x:Key="actionKeywords">Action keyword</system:String>
<system:String x:Key="currentActionKeywords">Current action keyword</system:String>
<system:String x:Key="newActionKeyword">New action keyword</system:String>
<system:String x:Key="actionKeywordsTooltip">Change Action Keywords</system:String>
<system:String x:Key="currentPriority">Current Priority</system:String>
<system:String x:Key="newPriority">New Priority</system:String>
<system:String x:Key="priority">Priority</system:String>
<system:String x:Key="priorityToolTip">Change Plugin Results Priority</system:String>
<system:String x:Key="pluginDirectory">Plugin Directory</system:String>
<system:String x:Key="author">by</system:String>
<system:String x:Key="plugin_init_time">Init time:</system:String>
<system:String x:Key="plugin_query_time">Query time:</system:String>
<system:String x:Key="plugin_query_version">Version</system:String>
<system:String x:Key="plugin_query_web">Website</system:String>
<system:String x:Key="plugin_uninstall">Uninstall</system:String>
<!-- Setting Plugin Store -->
<system:String x:Key="pluginStore">חנות תוספים</system:String>
<system:String x:Key="pluginStore_NewRelease">New Release</system:String>
<system:String x:Key="pluginStore_RecentlyUpdated">Recently Updated</system:String>
<system:String x:Key="pluginStore_None">תוספים</system:String>
<system:String x:Key="pluginStore_Installed">Installed</system:String>
<system:String x:Key="refresh">רענן</system:String>
<system:String x:Key="installbtn">התקן</system:String>
<system:String x:Key="uninstallbtn">Uninstall</system:String>
<system:String x:Key="updatebtn">עדכון</system:String>
<system:String x:Key="LabelInstalledToolTip">Plugin already installed</system:String>
<system:String x:Key="LabelNew">New Version</system:String>
<system:String x:Key="LabelNewToolTip">This plugin has been updated within the last 7 days</system:String>
<system:String x:Key="LabelUpdateToolTip">New Update is Available</system:String>
<!-- Setting Theme -->
<system:String x:Key="theme">ערכת נושא</system:String>
<system:String x:Key="appearance">Appearance</system:String>
<system:String x:Key="browserMoreThemes">גלריית ערכות נושא</system:String>
<system:String x:Key="howToCreateTheme">How to create a theme</system:String>
<system:String x:Key="hiThere">Hi There</system:String>
<system:String x:Key="SampleTitleExplorer">Explorer</system:String>
<system:String x:Key="SampleSubTitleExplorer">Search for files, folders and file contents</system:String>
<system:String x:Key="SampleTitleWebSearch">WebSearch</system:String>
<system:String x:Key="SampleSubTitleWebSearch">Search the web with different search engine support</system:String>
<system:String x:Key="SampleTitleProgram">Program</system:String>
<system:String x:Key="SampleSubTitleProgram">Launch programs as admin or a different user</system:String>
<system:String x:Key="SampleTitleProcessKiller">ProcessKiller</system:String>
<system:String x:Key="SampleSubTitleProcessKiller">Terminate unwanted processes</system:String>
<system:String x:Key="SearchBarHeight">Search Bar Height</system:String>
<system:String x:Key="ItemHeight">Item Height</system:String>
<system:String x:Key="queryBoxFont">Query Box Font</system:String>
<system:String x:Key="resultItemFont">Result Title Font</system:String>
<system:String x:Key="resultSubItemFont">Result Subtitle Font</system:String>
<system:String x:Key="resetCustomize">Reset</system:String>
<system:String x:Key="CustomizeToolTip">Customize</system:String>
<system:String x:Key="windowMode">Window Mode</system:String>
<system:String x:Key="opacity">Opacity</system:String>
<system:String x:Key="theme_load_failure_path_not_exists">Theme {0} not exists, fallback to default theme</system:String>
<system:String x:Key="theme_load_failure_parse_error">Fail to load theme {0}, fallback to default theme</system:String>
<system:String x:Key="ThemeFolder">Theme Folder</system:String>
<system:String x:Key="OpenThemeFolder">Open Theme Folder</system:String>
<system:String x:Key="ColorScheme">Color Scheme</system:String>
<system:String x:Key="ColorSchemeSystem">System Default</system:String>
<system:String x:Key="ColorSchemeLight">בהיר</system:String>
<system:String x:Key="ColorSchemeDark">כהה</system:String>
<system:String x:Key="SoundEffect">Sound Effect</system:String>
<system:String x:Key="SoundEffectTip">Play a small sound when the search window opens</system:String>
<system:String x:Key="SoundEffectVolume">Sound Effect Volume</system:String>
<system:String x:Key="SoundEffectVolumeTip">Adjust the volume of the sound effect</system:String>
<system:String x:Key="SoundEffectWarning">Windows Media Player is unavailable and is required for Flow's volume adjustment. Please check your installation if you need to adjust volume.</system:String>
<system:String x:Key="Animation">Animation</system:String>
<system:String x:Key="AnimationTip">Use Animation in UI</system:String>
<system:String x:Key="AnimationSpeed">Animation Speed</system:String>
<system:String x:Key="AnimationSpeedTip">The speed of the UI animation</system:String>
<system:String x:Key="AnimationSpeedSlow">Slow</system:String>
<system:String x:Key="AnimationSpeedMedium">Medium</system:String>
<system:String x:Key="AnimationSpeedFast">Fast</system:String>
<system:String x:Key="AnimationSpeedCustom">Custom</system:String>
<system:String x:Key="Clock">Clock</system:String>
<system:String x:Key="Date">Date</system:String>
<system:String x:Key="TypeIsDarkToolTip">This theme supports two(light/dark) modes.</system:String>
<system:String x:Key="TypeHasBlurToolTip">This theme supports Blur Transparent Background.</system:String>
<!-- Setting Hotkey -->
<system:String x:Key="hotkey">Hotkey</system:String>
<system:String x:Key="hotkeys">Hotkeys</system:String>
<system:String x:Key="flowlauncherHotkey">Open Flow Launcher</system:String>
<system:String x:Key="flowlauncherHotkeyToolTip">Enter shortcut to show/hide Flow Launcher.</system:String>
<system:String x:Key="previewHotkey">Toggle Preview</system:String>
<system:String x:Key="previewHotkeyToolTip">Enter shortcut to show/hide preview in search window.</system:String>
<system:String x:Key="hotkeyPresets">Hotkey Presets</system:String>
<system:String x:Key="hotkeyPresetsToolTip">List of currently registered hotkeys</system:String>
<system:String x:Key="openResultModifiers">Open Result Modifier Key</system:String>
<system:String x:Key="openResultModifiersToolTip">Select a modifier key to open selected result via keyboard.</system:String>
<system:String x:Key="showOpenResultHotkey">Show Hotkey</system:String>
<system:String x:Key="showOpenResultHotkeyToolTip">Show result selection hotkey with results.</system:String>
<system:String x:Key="autoCompleteHotkey">Auto Complete</system:String>
<system:String x:Key="autoCompleteHotkeyToolTip">Runs autocomplete for the selected items.</system:String>
<system:String x:Key="SelectNextItemHotkey">Select Next Item</system:String>
<system:String x:Key="SelectPrevItemHotkey">Select Previous Item</system:String>
<system:String x:Key="SelectNextPageHotkey">Next Page</system:String>
<system:String x:Key="SelectPrevPageHotkey">Previous Page</system:String>
<system:String x:Key="CycleHistoryUpHotkey">Cycle Previous Query</system:String>
<system:String x:Key="CycleHistoryDownHotkey">Cycle Next Query</system:String>
<system:String x:Key="OpenContextMenuHotkey">Open Context Menu</system:String>
<system:String x:Key="OpenNativeContextMenuHotkey">Open Native Context Menu</system:String>
<system:String x:Key="SettingWindowHotkey">Open Setting Window</system:String>
<system:String x:Key="CopyFilePathHotkey">Copy File Path</system:String>
<system:String x:Key="ToggleGameModeHotkey">Toggle Game Mode</system:String>
<system:String x:Key="ToggleHistoryHotkey">Toggle History</system:String>
<system:String x:Key="OpenContainFolderHotkey">Open Containing Folder</system:String>
<system:String x:Key="RunAsAdminHotkey">Run As Admin</system:String>
<system:String x:Key="RequeryHotkey">Refresh Search Results</system:String>
<system:String x:Key="ReloadPluginHotkey">Reload Plugins Data</system:String>
<system:String x:Key="QuickWidthHotkey">Quick Adjust Window Width</system:String>
<system:String x:Key="QuickHeightHotkey">Quick Adjust Window Height</system:String>
<system:String x:Key="ReloadPluginHotkeyToolTip">Use when require plugins to reload and update their existing data.</system:String>
<system:String x:Key="AdditionalHotkeyToolTip">You can add one more hotkey for this function.</system:String>
<system:String x:Key="customQueryHotkey">Custom Query Hotkeys</system:String>
<system:String x:Key="customQueryShortcut">Custom Query Shortcuts</system:String>
<system:String x:Key="builtinShortcuts">Built-in Shortcuts</system:String>
<system:String x:Key="customQuery">שאילתה</system:String>
<system:String x:Key="customShortcut">Shortcut</system:String>
<system:String x:Key="customShortcutExpansion">Expansion</system:String>
<system:String x:Key="builtinShortcutDescription">Description</system:String>
<system:String x:Key="delete">מחק</system:String>
<system:String x:Key="edit">ערוך</system:String>
<system:String x:Key="add">הוסף</system:String>
<system:String x:Key="none">None</system:String>
<system:String x:Key="pleaseSelectAnItem">אנא בחר פריט</system:String>
<system:String x:Key="deleteCustomHotkeyWarning">Are you sure you want to delete {0} plugin hotkey?</system:String>
<system:String x:Key="deleteCustomShortcutWarning">Are you sure you want to delete shortcut: {0} with expansion {1}?</system:String>
<system:String x:Key="shortcut_clipboard_description">Get text from clipboard.</system:String>
<system:String x:Key="shortcut_active_explorer_path">Get path from active explorer.</system:String>
<system:String x:Key="queryWindowShadowEffect">Query window shadow effect</system:String>
<system:String x:Key="shadowEffectCPUUsage">Shadow effect has a substantial usage of GPU. Not recommended if your computer performance is limited.</system:String>
<system:String x:Key="windowWidthSize">Window Width Size</system:String>
<system:String x:Key="windowWidthSizeToolTip">You can also quickly adjust this by using Ctrl+[ and Ctrl+].</system:String>
<system:String x:Key="useGlyphUI">Use Segoe Fluent Icons</system:String>
<system:String x:Key="useGlyphUIEffect">Use Segoe Fluent Icons for query results where supported</system:String>
<system:String x:Key="flowlauncherPressHotkey">Press Key</system:String>
<!-- Setting Proxy -->
<system:String x:Key="proxy">HTTP Proxy</system:String>
<system:String x:Key="enableProxy">Enable HTTP Proxy</system:String>
<system:String x:Key="server">HTTP Server</system:String>
<system:String x:Key="port">Port</system:String>
<system:String x:Key="userName">User Name</system:String>
<system:String x:Key="password">Password</system:String>
<system:String x:Key="testProxy">Test Proxy</system:String>
<system:String x:Key="save">שמור</system:String>
<system:String x:Key="serverCantBeEmpty">Server field can't be empty</system:String>
<system:String x:Key="portCantBeEmpty">Port field can't be empty</system:String>
<system:String x:Key="invalidPortFormat">Invalid port format</system:String>
<system:String x:Key="saveProxySuccessfully">Proxy configuration saved successfully</system:String>
<system:String x:Key="proxyIsCorrect">Proxy configured correctly</system:String>
<system:String x:Key="proxyConnectFailed">Proxy connection failed</system:String>
<!-- Setting About -->
<system:String x:Key="about">אודות</system:String>
<system:String x:Key="website">Website</system:String>
<system:String x:Key="github">GitHub</system:String>
<system:String x:Key="docs">Docs</system:String>
<system:String x:Key="version">Version</system:String>
<system:String x:Key="icons">Icons</system:String>
<system:String x:Key="about_activate_times">You have activated Flow Launcher {0} times</system:String>
<system:String x:Key="checkUpdates">Check for Updates</system:String>
<system:String x:Key="BecomeASponsor">Become A Sponsor</system:String>
<system:String x:Key="newVersionTips">New version {0} is available, would you like to restart Flow Launcher to use the update?</system:String>
<system:String x:Key="checkUpdatesFailed">בדיקת העדכונים נכשלה, אנא בדוק את הגדרות החיבור ואת הגדרות ה-Proxy שלך לכתובת api.github.com.</system:String>
<system:String x:Key="downloadUpdatesFailed">
Download updates failed, please check your connection and proxy settings to github-cloud.s3.amazonaws.com,
or go to https://github.com/Flow-Launcher/Flow.Launcher/releases to download updates manually.
</system:String>
<system:String x:Key="releaseNotes">Release Notes</system:String>
<system:String x:Key="documentation">Usage Tips</system:String>
<system:String x:Key="devtool">DevTools</system:String>
<system:String x:Key="settingfolder">Setting Folder</system:String>
<system:String x:Key="logfolder">Log Folder</system:String>
<system:String x:Key="clearlogfolder">Clear Logs</system:String>
<system:String x:Key="clearlogfolderMessage">Are you sure you want to delete all logs?</system:String>
<system:String x:Key="welcomewindow">אשף</system:String>
<system:String x:Key="userdatapath">User Data Location</system:String>
<system:String x:Key="userdatapathToolTip">User settings and installed plugins are saved in the user data folder. This location may vary depending on whether it's in portable mode or not.</system:String>
<system:String x:Key="userdatapathButton">Open Folder</system:String>
<!-- FileManager Setting Dialog -->
<system:String x:Key="fileManagerWindow">Select File Manager</system:String>
<system:String x:Key="fileManager_tips">Please specify the file location of the file manager you using and add arguments as required. The &quot;%d&quot; represents the directory path to open for, used by the Arg for Folder field and for commands opening specific directories. The &quot;%f&quot; represents the file path to open for, used by the Arg for File field and for commands opening specific files.</system:String>
<system:String x:Key="fileManager_tips2">For example, if the file manager uses a command such as &quot;totalcmd.exe /A c:\windows&quot; to open the c:\windows directory, the File Manager Path will be totalcmd.exe, and the Arg For Folder will be /A &quot;%d&quot;. Certain file managers like QTTabBar may just require a path to be supplied, in this instance use &quot;%d&quot; as the File Manager Path and leave the rest of the fileds blank.</system:String>
<system:String x:Key="fileManager_name">File Manager</system:String>
<system:String x:Key="fileManager_profile_name">Profile Name</system:String>
<system:String x:Key="fileManager_path">File Manager Path</system:String>
<system:String x:Key="fileManager_directory_arg">Arg For Folder</system:String>
<system:String x:Key="fileManager_file_arg">Arg For File</system:String>
<!-- DefaultBrowser Setting Dialog -->
<system:String x:Key="defaultBrowserTitle">Default Web Browser</system:String>
<system:String x:Key="defaultBrowser_tips">The default setting follows the OS default browser setting. If specified separately, flow uses that browser.</system:String>
<system:String x:Key="defaultBrowser_name">Browser</system:String>
<system:String x:Key="defaultBrowser_profile_name">Browser Name</system:String>
<system:String x:Key="defaultBrowser_path">Browser Path</system:String>
<system:String x:Key="defaultBrowser_newWindow">New Window</system:String>
<system:String x:Key="defaultBrowser_newTab">New Tab</system:String>
<system:String x:Key="defaultBrowser_parameter">Private Mode</system:String>
<!-- Priority Setting Dialog -->
<system:String x:Key="changePriorityWindow">Change Priority</system:String>
<system:String x:Key="priority_tips">Greater the number, the higher the result will be ranked. Try setting it as 5. If you want the results to be lower than any other plugin's, provide a negative number</system:String>
<system:String x:Key="invalidPriority">Please provide an valid integer for Priority!</system:String>
<!-- Action Keyword Setting Dialog -->
<system:String x:Key="oldActionKeywords">Old Action Keyword</system:String>
<system:String x:Key="newActionKeywords">New Action Keyword</system:String>
<system:String x:Key="cancel">ביטול</system:String>
<system:String x:Key="done">בוצע</system:String>
<system:String x:Key="cannotFindSpecifiedPlugin">Can't find specified plugin</system:String>
<system:String x:Key="newActionKeywordsCannotBeEmpty">New Action Keyword can't be empty</system:String>
<system:String x:Key="newActionKeywordsHasBeenAssigned">This new Action Keyword is already assigned to another plugin, please choose a different one</system:String>
<system:String x:Key="success">הצליח</system:String>
<system:String x:Key="completedSuccessfully">הושלם בהצלחה</system:String>
<system:String x:Key="actionkeyword_tips">Enter the action keyword you like to use to start the plugin. Use * if you don't want to specify any, and the plugin will be triggered without any action keywords.</system:String>
<!-- Custom Query Hotkey Dialog -->
<system:String x:Key="customeQueryHotkeyTitle">Custom Query Hotkey</system:String>
<system:String x:Key="customeQueryHotkeyTips">Press a custom hotkey to open Flow Launcher and input the specified query automatically.</system:String>
<system:String x:Key="preview">תצוגה מקדימה</system:String>
<system:String x:Key="hotkeyIsNotUnavailable">Hotkey is unavailable, please select a new hotkey</system:String>
<system:String x:Key="invalidPluginHotkey">Invalid plugin hotkey</system:String>
<system:String x:Key="update">עדכון</system:String>
<system:String x:Key="hotkeyRegTitle">Binding Hotkey</system:String>
<system:String x:Key="hotkeyUnavailable">Current hotkey is unavailable.</system:String>
<system:String x:Key="hotkeyUnavailableUneditable">This hotkey is reserved for &quot;{0}&quot; and can't be used. Please choose another hotkey.</system:String>
<system:String x:Key="hotkeyUnavailableEditable">This hotkey is already in use by &quot;{0}&quot;. If you press &quot;Overwrite&quot;, it will be removed from &quot;{0}&quot;.</system:String>
<system:String x:Key="hotkeyRegGuide">Press the keys you want to use for this function.</system:String>
<!-- Custom Query Shortcut Dialog -->
<system:String x:Key="customeQueryShortcutTitle">Custom Query Shortcut</system:String>
<system:String x:Key="customeQueryShortcutTips">Enter a shortcut that automatically expands to the specified query.</system:String>
<system:String x:Key="customeQueryShortcutGuide" xml:space="preserve">A shortcut is expanded when it exactly matches the query.
If you add an '@' prefix while inputting a shortcut, it matches any position in the query. Builtin shortcuts match any position in a query.
</system:String>
<system:String x:Key="duplicateShortcut">Shortcut already exists, please enter a new Shortcut or edit the existing one.</system:String>
<system:String x:Key="emptyShortcut">Shortcut and/or its expansion is empty.</system:String>
<!-- Common Action -->
<system:String x:Key="commonSave">שמור</system:String>
<system:String x:Key="commonOverwrite">Overwrite</system:String>
<system:String x:Key="commonCancel">ביטול</system:String>
<system:String x:Key="commonReset">Reset</system:String>
<system:String x:Key="commonDelete">מחק</system:String>
<system:String x:Key="commonOK">OK</system:String>
<system:String x:Key="commonYes">Yes</system:String>
<system:String x:Key="commonNo">No</system:String>
<!-- Crash Reporter -->
<system:String x:Key="reportWindow_version">Version</system:String>
<system:String x:Key="reportWindow_time">זמן</system:String>
<system:String x:Key="reportWindow_reproduce">Please tell us how application crashed so we can fix it</system:String>
<system:String x:Key="reportWindow_send_report">שלח דיווח</system:String>
<system:String x:Key="reportWindow_cancel">ביטול</system:String>
<system:String x:Key="reportWindow_general">כללי</system:String>
<system:String x:Key="reportWindow_exceptions">חריגים</system:String>
<system:String x:Key="reportWindow_exception_type">Exception Type</system:String>
<system:String x:Key="reportWindow_source">Source</system:String>
<system:String x:Key="reportWindow_stack_trace">Stack Trace</system:String>
<system:String x:Key="reportWindow_sending">Sending</system:String>
<system:String x:Key="reportWindow_report_succeed">Report sent successfully</system:String>
<system:String x:Key="reportWindow_report_failed">Failed to send report</system:String>
<system:String x:Key="reportWindow_flowlauncher_got_an_error">Flow Launcher got an error</system:String>
<!-- General Notice -->
<system:String x:Key="pleaseWait">Please wait...</system:String>
<!-- Update -->
<system:String x:Key="update_flowlauncher_update_check">Checking for new update</system:String>
<system:String x:Key="update_flowlauncher_already_on_latest">You already have the latest Flow Launcher version</system:String>
<system:String x:Key="update_flowlauncher_update_found">Update found</system:String>
<system:String x:Key="update_flowlauncher_updating">Updating...</system:String>
<system:String x:Key="update_flowlauncher_fail_moving_portable_user_profile_data">
Flow Launcher was not able to move your user profile data to the new update version.
Please manually move your profile data folder from {0} to {1}
</system:String>
<system:String x:Key="update_flowlauncher_new_update">עדכון חדש</system:String>
<system:String x:Key="update_flowlauncher_update_new_version_available">New Flow Launcher release {0} is now available</system:String>
<system:String x:Key="update_flowlauncher_update_error">An error occurred while trying to install software updates</system:String>
<system:String x:Key="update_flowlauncher_update">עדכון</system:String>
<system:String x:Key="update_flowlauncher_update_cancel">ביטול</system:String>
<system:String x:Key="update_flowlauncher_fail">העדכון נכשל</system:String>
<system:String x:Key="update_flowlauncher_check_connection">Check your connection and try updating proxy settings to github-cloud.s3.amazonaws.com.</system:String>
<system:String x:Key="update_flowlauncher_update_restart_flowlauncher_tip">This upgrade will restart Flow Launcher</system:String>
<system:String x:Key="update_flowlauncher_update_update_files">Following files will be updated</system:String>
<system:String x:Key="update_flowlauncher_update_files">Update files</system:String>
<system:String x:Key="update_flowlauncher_update_update_description">Update description</system:String>
<!-- Welcome Window -->
<system:String x:Key="Skip">דלג</system:String>
<system:String x:Key="Welcome_Page1_Title">Welcome to Flow Launcher</system:String>
<system:String x:Key="Welcome_Page1_Text01">Hello, this is the first time you are running Flow Launcher!</system:String>
<system:String x:Key="Welcome_Page1_Text02">Before starting, this wizard will assist in setting up Flow Launcher. You can skip this if you wish. Please choose a language</system:String>
<system:String x:Key="Welcome_Page2_Title">Search and run all files and applications on your PC</system:String>
<system:String x:Key="Welcome_Page2_Text01">Search everything from applications, files, bookmarks, YouTube, Twitter and more. All from the comfort of your keyboard without ever touching the mouse.</system:String>
<system:String x:Key="Welcome_Page2_Text02">Flow Launcher starts with the hotkey below, go ahead and try it out now. To change it, click on the input and press the desired hotkey on the keyboard.</system:String>
<system:String x:Key="Welcome_Page3_Title">Hotkeys</system:String>
<system:String x:Key="Welcome_Page4_Title">Action Keyword and Commands</system:String>
<system:String x:Key="Welcome_Page4_Text01">Search the web, launch applications or run various functions through Flow Launcher plugins. Certain functions start with an action keyword, and if necessary, they can be used without action keywords. Try the queries below in Flow Launcher.</system:String>
<system:String x:Key="Welcome_Page5_Title">Let's Start Flow Launcher</system:String>
<system:String x:Key="Welcome_Page5_Text01">Finished. Enjoy Flow Launcher. Don't forget the hotkey to start :)</system:String>
<!-- General Guide & Hotkey -->
<system:String x:Key="HotkeyUpDownDesc">Back / Context Menu</system:String>
<system:String x:Key="HotkeyLeftRightDesc">Item Navigation</system:String>
<system:String x:Key="HotkeyShiftEnterDesc">Open Context Menu</system:String>
<system:String x:Key="HotkeyCtrlEnterDesc">Open Containing Folder</system:String>
<system:String x:Key="HotkeyCtrlShiftEnterDesc">Run as Admin / Open Folder in Default File Manager</system:String>
<system:String x:Key="HotkeyCtrlHDesc">Query History</system:String>
<system:String x:Key="HotkeyESCDesc">Back to Result in Context Menu</system:String>
<system:String x:Key="HotkeyTabDesc">Autocomplete</system:String>
<system:String x:Key="HotkeyRunDesc">Open / Run Selected Item</system:String>
<system:String x:Key="HotkeyCtrlIDesc">Open Setting Window</system:String>
<system:String x:Key="HotkeyF5Desc">Reload Plugin Data</system:String>
<system:String x:Key="HotkeySelectFirstResult">Select first result</system:String>
<system:String x:Key="HotkeySelectLastResult">Select last result</system:String>
<system:String x:Key="HotkeyRequery">Run current query again</system:String>
<system:String x:Key="HotkeyOpenResult">Open result</system:String>
<system:String x:Key="HotkeyOpenResultN">Open result #{0}</system:String>
<system:String x:Key="RecommendWeather">Weather</system:String>
<system:String x:Key="RecommendWeatherDesc">Weather in Google Result</system:String>
<system:String x:Key="RecommendShell">&gt; ping 8.8.8.8</system:String>
<system:String x:Key="RecommendShellDesc">Shell Command</system:String>
<system:String x:Key="RecommendBluetooth">s Bluetooth</system:String>
<system:String x:Key="RecommendBluetoothDesc">Bluetooth in Windows Settings</system:String>
<system:String x:Key="RecommendAcronyms">sn</system:String>
<system:String x:Key="RecommendAcronymsDesc">Sticky Notes</system:String>
<!-- Preview Area -->
<system:String x:Key="FileSize">File Size</system:String>
<system:String x:Key="Created">Created</system:String>
<system:String x:Key="LastModified">Last Modified</system:String>
</ResourceDictionary>

View file

@ -65,6 +65,8 @@
<system:String x:Key="LastQueryPreserved">Conserva ultima ricerca</system:String> <system:String x:Key="LastQueryPreserved">Conserva ultima ricerca</system:String>
<system:String x:Key="LastQuerySelected">Seleziona ultima ricerca</system:String> <system:String x:Key="LastQuerySelected">Seleziona ultima ricerca</system:String>
<system:String x:Key="LastQueryEmpty">Cancella ultima ricerca</system:String> <system:String x:Key="LastQueryEmpty">Cancella ultima ricerca</system:String>
<system:String x:Key="LastQueryActionKeywordPreserved">Preserve Last Action Keyword</system:String>
<system:String x:Key="LastQueryActionKeywordSelected">Select Last Action Keyword</system:String>
<system:String x:Key="KeepMaxResults">Altezza Finestra Fissa</system:String> <system:String x:Key="KeepMaxResults">Altezza Finestra Fissa</system:String>
<system:String x:Key="KeepMaxResultsToolTip">L'altezza della finestra non si può regolare trascinando.</system:String> <system:String x:Key="KeepMaxResultsToolTip">L'altezza della finestra non si può regolare trascinando.</system:String>
<system:String x:Key="maxShowResults">Numero massimo di risultati mostrati</system:String> <system:String x:Key="maxShowResults">Numero massimo di risultati mostrati</system:String>

View file

@ -65,6 +65,8 @@
<system:String x:Key="LastQueryPreserved">前回のクエリを保存</system:String> <system:String x:Key="LastQueryPreserved">前回のクエリを保存</system:String>
<system:String x:Key="LastQuerySelected">前回のクエリを選択</system:String> <system:String x:Key="LastQuerySelected">前回のクエリを選択</system:String>
<system:String x:Key="LastQueryEmpty">前回のクエリを消去</system:String> <system:String x:Key="LastQueryEmpty">前回のクエリを消去</system:String>
<system:String x:Key="LastQueryActionKeywordPreserved">Preserve Last Action Keyword</system:String>
<system:String x:Key="LastQueryActionKeywordSelected">Select Last Action Keyword</system:String>
<system:String x:Key="KeepMaxResults">Fixed Window Height</system:String> <system:String x:Key="KeepMaxResults">Fixed Window Height</system:String>
<system:String x:Key="KeepMaxResultsToolTip">The window height is not adjustable by dragging.</system:String> <system:String x:Key="KeepMaxResultsToolTip">The window height is not adjustable by dragging.</system:String>
<system:String x:Key="maxShowResults">結果の最大表示件数</system:String> <system:String x:Key="maxShowResults">結果の最大表示件数</system:String>

View file

@ -65,6 +65,8 @@
<system:String x:Key="LastQueryPreserved">직전 쿼리에 계속 입력</system:String> <system:String x:Key="LastQueryPreserved">직전 쿼리에 계속 입력</system:String>
<system:String x:Key="LastQuerySelected">직전 쿼리 내용 선택</system:String> <system:String x:Key="LastQuerySelected">직전 쿼리 내용 선택</system:String>
<system:String x:Key="LastQueryEmpty">직전 쿼리 지우기</system:String> <system:String x:Key="LastQueryEmpty">직전 쿼리 지우기</system:String>
<system:String x:Key="LastQueryActionKeywordPreserved">Preserve Last Action Keyword</system:String>
<system:String x:Key="LastQueryActionKeywordSelected">Select Last Action Keyword</system:String>
<system:String x:Key="KeepMaxResults">창 높이 고정</system:String> <system:String x:Key="KeepMaxResults">창 높이 고정</system:String>
<system:String x:Key="KeepMaxResultsToolTip">드래그로 창 높이를 조정하지 않습니다.</system:String> <system:String x:Key="KeepMaxResultsToolTip">드래그로 창 높이를 조정하지 않습니다.</system:String>
<system:String x:Key="maxShowResults">표시할 결과 수</system:String> <system:String x:Key="maxShowResults">표시할 결과 수</system:String>

View file

@ -65,6 +65,8 @@
<system:String x:Key="LastQueryPreserved">Bevar siste spørring</system:String> <system:String x:Key="LastQueryPreserved">Bevar siste spørring</system:String>
<system:String x:Key="LastQuerySelected">Velg siste spørring</system:String> <system:String x:Key="LastQuerySelected">Velg siste spørring</system:String>
<system:String x:Key="LastQueryEmpty">Tøm siste spørring</system:String> <system:String x:Key="LastQueryEmpty">Tøm siste spørring</system:String>
<system:String x:Key="LastQueryActionKeywordPreserved">Preserve Last Action Keyword</system:String>
<system:String x:Key="LastQueryActionKeywordSelected">Select Last Action Keyword</system:String>
<system:String x:Key="KeepMaxResults">Fast vindushøyde</system:String> <system:String x:Key="KeepMaxResults">Fast vindushøyde</system:String>
<system:String x:Key="KeepMaxResultsToolTip">Vindushøyden kan ikke justeres ved å dra.</system:String> <system:String x:Key="KeepMaxResultsToolTip">Vindushøyden kan ikke justeres ved å dra.</system:String>
<system:String x:Key="maxShowResults">Maksimalt antall resultater vist</system:String> <system:String x:Key="maxShowResults">Maksimalt antall resultater vist</system:String>

View file

@ -65,6 +65,8 @@
<system:String x:Key="LastQueryPreserved">Behoud laatste zoekopdracht</system:String> <system:String x:Key="LastQueryPreserved">Behoud laatste zoekopdracht</system:String>
<system:String x:Key="LastQuerySelected">Selecteer laatste zoekopdracht</system:String> <system:String x:Key="LastQuerySelected">Selecteer laatste zoekopdracht</system:String>
<system:String x:Key="LastQueryEmpty">Laatste zoekopdracht verwijderen</system:String> <system:String x:Key="LastQueryEmpty">Laatste zoekopdracht verwijderen</system:String>
<system:String x:Key="LastQueryActionKeywordPreserved">Preserve Last Action Keyword</system:String>
<system:String x:Key="LastQueryActionKeywordSelected">Select Last Action Keyword</system:String>
<system:String x:Key="KeepMaxResults">Vaste venster hoogte</system:String> <system:String x:Key="KeepMaxResults">Vaste venster hoogte</system:String>
<system:String x:Key="KeepMaxResultsToolTip">De vensterhoogte is niet aanpasbaar door te slepen.</system:String> <system:String x:Key="KeepMaxResultsToolTip">De vensterhoogte is niet aanpasbaar door te slepen.</system:String>
<system:String x:Key="maxShowResults">Laat maximale resultaten zien</system:String> <system:String x:Key="maxShowResults">Laat maximale resultaten zien</system:String>

View file

@ -65,6 +65,8 @@ Kliknij &quot;nie&quot;, jeśli jest już zainstalowany. Zostaniesz wtedy popros
<system:String x:Key="LastQueryPreserved">Zachowaj ostatnie zapytanie</system:String> <system:String x:Key="LastQueryPreserved">Zachowaj ostatnie zapytanie</system:String>
<system:String x:Key="LastQuerySelected">Wybierz ostatnie zapytanie</system:String> <system:String x:Key="LastQuerySelected">Wybierz ostatnie zapytanie</system:String>
<system:String x:Key="LastQueryEmpty">Puste ostatnie zapytanie</system:String> <system:String x:Key="LastQueryEmpty">Puste ostatnie zapytanie</system:String>
<system:String x:Key="LastQueryActionKeywordPreserved">Preserve Last Action Keyword</system:String>
<system:String x:Key="LastQueryActionKeywordSelected">Select Last Action Keyword</system:String>
<system:String x:Key="KeepMaxResults">Stała wysokość okna</system:String> <system:String x:Key="KeepMaxResults">Stała wysokość okna</system:String>
<system:String x:Key="KeepMaxResultsToolTip">Wysokość okna nie jest regulowana poprzez przeciąganie.</system:String> <system:String x:Key="KeepMaxResultsToolTip">Wysokość okna nie jest regulowana poprzez przeciąganie.</system:String>
<system:String x:Key="maxShowResults">Maksymalna liczba wyników</system:String> <system:String x:Key="maxShowResults">Maksymalna liczba wyników</system:String>
@ -361,7 +363,7 @@ Jeśli dodasz prefiks '@' podczas wprowadzania skrótu, będzie on pasował do d
<system:String x:Key="commonOverwrite">Nadpisz</system:String> <system:String x:Key="commonOverwrite">Nadpisz</system:String>
<system:String x:Key="commonCancel">Anuluj</system:String> <system:String x:Key="commonCancel">Anuluj</system:String>
<system:String x:Key="commonReset">Zresetuj</system:String> <system:String x:Key="commonReset">Zresetuj</system:String>
<system:String x:Key="commonDelete">Usu</system:String> <system:String x:Key="commonDelete">Usuń</system:String>
<system:String x:Key="commonOK">Aktualizuj</system:String> <system:String x:Key="commonOK">Aktualizuj</system:String>
<system:String x:Key="commonYes">Tak</system:String> <system:String x:Key="commonYes">Tak</system:String>
<system:String x:Key="commonNo">Nie</system:String> <system:String x:Key="commonNo">Nie</system:String>

View file

@ -65,6 +65,8 @@
<system:String x:Key="LastQueryPreserved">Preservar Última Consulta</system:String> <system:String x:Key="LastQueryPreserved">Preservar Última Consulta</system:String>
<system:String x:Key="LastQuerySelected">Selecionar última consulta</system:String> <system:String x:Key="LastQuerySelected">Selecionar última consulta</system:String>
<system:String x:Key="LastQueryEmpty">Limpar última consulta</system:String> <system:String x:Key="LastQueryEmpty">Limpar última consulta</system:String>
<system:String x:Key="LastQueryActionKeywordPreserved">Preserve Last Action Keyword</system:String>
<system:String x:Key="LastQueryActionKeywordSelected">Select Last Action Keyword</system:String>
<system:String x:Key="KeepMaxResults">Fixed Window Height</system:String> <system:String x:Key="KeepMaxResults">Fixed Window Height</system:String>
<system:String x:Key="KeepMaxResultsToolTip">The window height is not adjustable by dragging.</system:String> <system:String x:Key="KeepMaxResultsToolTip">The window height is not adjustable by dragging.</system:String>
<system:String x:Key="maxShowResults">Máximo de resultados mostrados</system:String> <system:String x:Key="maxShowResults">Máximo de resultados mostrados</system:String>

View file

@ -65,6 +65,8 @@ Clique &quot;Não&quot; se já tiver instalado e, de seguida, ser-lhe-á solicit
<system:String x:Key="LastQueryPreserved">Manter última consulta</system:String> <system:String x:Key="LastQueryPreserved">Manter última consulta</system:String>
<system:String x:Key="LastQuerySelected">Selecionar última consulta</system:String> <system:String x:Key="LastQuerySelected">Selecionar última consulta</system:String>
<system:String x:Key="LastQueryEmpty">Limpar última consulta</system:String> <system:String x:Key="LastQueryEmpty">Limpar última consulta</system:String>
<system:String x:Key="LastQueryActionKeywordPreserved">Manter palavra-chave da última ação</system:String>
<system:String x:Key="LastQueryActionKeywordSelected">Selecionar palavra-chave da última ação</system:String>
<system:String x:Key="KeepMaxResults">Altura fixa de janela</system:String> <system:String x:Key="KeepMaxResults">Altura fixa de janela</system:String>
<system:String x:Key="KeepMaxResultsToolTip">Não é possível ajustar o tamanho da janela por arrasto.</system:String> <system:String x:Key="KeepMaxResultsToolTip">Não é possível ajustar o tamanho da janela por arrasto.</system:String>
<system:String x:Key="maxShowResults">Número máximo de resultados</system:String> <system:String x:Key="maxShowResults">Número máximo de resultados</system:String>

View file

@ -1,12 +1,13 @@
<?xml version="1.0"?>
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:system="clr-namespace:System;assembly=mscorlib"> <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:system="clr-namespace:System;assembly=mscorlib">
<!-- Startup --> <!-- Startup -->
<system:String x:Key="runtimePluginInstalledChooseRuntimePrompt"> <system:String x:Key="runtimePluginInstalledChooseRuntimePrompt">
Flow определил, что вы установили {0} плагины, которым требуется {1} для работы. Скачать {1}? Flow detected you have installed {0} plugins, which will require {1} to run. Would you like to download {1}?
{2}{2} {2}{2}
Кликните нет, если он уже установлен, и вам будет предложено выбрать папку, где находится исполняемый файл {1} Click no if it's already installed, and you will be prompted to select the folder that contains the {1} executable
</system:String> </system:String>
<system:String x:Key="runtimePluginChooseRuntimeExecutable">Пожалуйста, выберите исполняемый файл {0}</system:String> <system:String x:Key="runtimePluginChooseRuntimeExecutable">Please select the {0} executable</system:String>
<system:String x:Key="runtimePluginUnableToSetExecutablePath">Не удалось установить путь к исполняемому файлу {0}, пожалуйста, попробуйте через настройки Flow (прокрутите вниз).</system:String> <system:String x:Key="runtimePluginUnableToSetExecutablePath">Unable to set {0} executable path, please try from Flow's settings (scroll down to the bottom).</system:String>
<system:String x:Key="failedToInitializePluginsTitle">Fail to Init Plugins</system:String> <system:String x:Key="failedToInitializePluginsTitle">Fail to Init Plugins</system:String>
<system:String x:Key="failedToInitializePluginsMessage">Plugins: {0} - fail to load and would be disabled, please contact plugin creator for help</system:String> <system:String x:Key="failedToInitializePluginsMessage">Plugins: {0} - fail to load and would be disabled, please contact plugin creator for help</system:String>
@ -64,6 +65,8 @@
<system:String x:Key="LastQueryPreserved">Сохранение последнего запроса</system:String> <system:String x:Key="LastQueryPreserved">Сохранение последнего запроса</system:String>
<system:String x:Key="LastQuerySelected">Выбор последнего запроса</system:String> <system:String x:Key="LastQuerySelected">Выбор последнего запроса</system:String>
<system:String x:Key="LastQueryEmpty">Очистить последний запрос</system:String> <system:String x:Key="LastQueryEmpty">Очистить последний запрос</system:String>
<system:String x:Key="LastQueryActionKeywordPreserved">Preserve Last Action Keyword</system:String>
<system:String x:Key="LastQueryActionKeywordSelected">Select Last Action Keyword</system:String>
<system:String x:Key="KeepMaxResults">Фиксированная высота окна</system:String> <system:String x:Key="KeepMaxResults">Фиксированная высота окна</system:String>
<system:String x:Key="KeepMaxResultsToolTip">The window height is not adjustable by dragging.</system:String> <system:String x:Key="KeepMaxResultsToolTip">The window height is not adjustable by dragging.</system:String>
<system:String x:Key="maxShowResults">Максимальное количество результатов</system:String> <system:String x:Key="maxShowResults">Максимальное количество результатов</system:String>

View file

@ -65,6 +65,8 @@
<system:String x:Key="LastQueryPreserved">Ponechať</system:String> <system:String x:Key="LastQueryPreserved">Ponechať</system:String>
<system:String x:Key="LastQuerySelected">Označiť</system:String> <system:String x:Key="LastQuerySelected">Označiť</system:String>
<system:String x:Key="LastQueryEmpty">Vymazať</system:String> <system:String x:Key="LastQueryEmpty">Vymazať</system:String>
<system:String x:Key="LastQueryActionKeywordPreserved">Ponechať posledný akčný príkaz</system:String>
<system:String x:Key="LastQueryActionKeywordSelected">Označiť posledný akčný príkaz</system:String>
<system:String x:Key="KeepMaxResults">Pevná výška okna</system:String> <system:String x:Key="KeepMaxResults">Pevná výška okna</system:String>
<system:String x:Key="KeepMaxResultsToolTip">Výška okna sa nedá nastaviť ťahaním.</system:String> <system:String x:Key="KeepMaxResultsToolTip">Výška okna sa nedá nastaviť ťahaním.</system:String>
<system:String x:Key="maxShowResults">Maximum výsledkov</system:String> <system:String x:Key="maxShowResults">Maximum výsledkov</system:String>
@ -454,4 +456,3 @@ Ak pri zadávaní skratky pred ňu pridáte &quot;@&quot;, bude sa zhodovať s
<system:String x:Key="Created">Vytvorené</system:String> <system:String x:Key="Created">Vytvorené</system:String>
<system:String x:Key="LastModified">Upravené</system:String> <system:String x:Key="LastModified">Upravené</system:String>
</ResourceDictionary> </ResourceDictionary>

View file

@ -65,6 +65,8 @@
<system:String x:Key="LastQueryPreserved">Sačuvaj poslednji Upit</system:String> <system:String x:Key="LastQueryPreserved">Sačuvaj poslednji Upit</system:String>
<system:String x:Key="LastQuerySelected">Selektuj poslednji Upit</system:String> <system:String x:Key="LastQuerySelected">Selektuj poslednji Upit</system:String>
<system:String x:Key="LastQueryEmpty">Isprazni poslednji Upit</system:String> <system:String x:Key="LastQueryEmpty">Isprazni poslednji Upit</system:String>
<system:String x:Key="LastQueryActionKeywordPreserved">Preserve Last Action Keyword</system:String>
<system:String x:Key="LastQueryActionKeywordSelected">Select Last Action Keyword</system:String>
<system:String x:Key="KeepMaxResults">Fixed Window Height</system:String> <system:String x:Key="KeepMaxResults">Fixed Window Height</system:String>
<system:String x:Key="KeepMaxResultsToolTip">The window height is not adjustable by dragging.</system:String> <system:String x:Key="KeepMaxResultsToolTip">The window height is not adjustable by dragging.</system:String>
<system:String x:Key="maxShowResults">Maksimum prikazanih rezultata</system:String> <system:String x:Key="maxShowResults">Maksimum prikazanih rezultata</system:String>

View file

@ -65,6 +65,8 @@
<system:String x:Key="LastQueryPreserved">Son Sorguyu Sakla</system:String> <system:String x:Key="LastQueryPreserved">Son Sorguyu Sakla</system:String>
<system:String x:Key="LastQuerySelected">Son Sorguyu Sakla ve Tümünü Seç</system:String> <system:String x:Key="LastQuerySelected">Son Sorguyu Sakla ve Tümünü Seç</system:String>
<system:String x:Key="LastQueryEmpty">Sorgu Kutusunu Temizle</system:String> <system:String x:Key="LastQueryEmpty">Sorgu Kutusunu Temizle</system:String>
<system:String x:Key="LastQueryActionKeywordPreserved">Preserve Last Action Keyword</system:String>
<system:String x:Key="LastQueryActionKeywordSelected">Select Last Action Keyword</system:String>
<system:String x:Key="KeepMaxResults">Sabit Pencere Yükseliği</system:String> <system:String x:Key="KeepMaxResults">Sabit Pencere Yükseliği</system:String>
<system:String x:Key="KeepMaxResultsToolTip">Pencere yüksekliği sürükleme ile ayarlanamaz.</system:String> <system:String x:Key="KeepMaxResultsToolTip">Pencere yüksekliği sürükleme ile ayarlanamaz.</system:String>
<system:String x:Key="maxShowResults">Maksimum Sonuç Sayısı</system:String> <system:String x:Key="maxShowResults">Maksimum Sonuç Sayısı</system:String>

View file

@ -65,6 +65,8 @@
<system:String x:Key="LastQueryPreserved">Зберегти останній запит</system:String> <system:String x:Key="LastQueryPreserved">Зберегти останній запит</system:String>
<system:String x:Key="LastQuerySelected">Вибрати останній запит</system:String> <system:String x:Key="LastQuerySelected">Вибрати останній запит</system:String>
<system:String x:Key="LastQueryEmpty">Очистити останній запит</system:String> <system:String x:Key="LastQueryEmpty">Очистити останній запит</system:String>
<system:String x:Key="LastQueryActionKeywordPreserved">Preserve Last Action Keyword</system:String>
<system:String x:Key="LastQueryActionKeywordSelected">Select Last Action Keyword</system:String>
<system:String x:Key="KeepMaxResults">Фіксована висота вікна</system:String> <system:String x:Key="KeepMaxResults">Фіксована висота вікна</system:String>
<system:String x:Key="KeepMaxResultsToolTip">Висота вікна не регулюється перетягуванням.</system:String> <system:String x:Key="KeepMaxResultsToolTip">Висота вікна не регулюється перетягуванням.</system:String>
<system:String x:Key="maxShowResults">Максимальна кількість результатів</system:String> <system:String x:Key="maxShowResults">Максимальна кількість результатів</system:String>

View file

@ -65,6 +65,8 @@
<system:String x:Key="LastQueryPreserved">Giữ lại truy vấn cuối cùng</system:String> <system:String x:Key="LastQueryPreserved">Giữ lại truy vấn cuối cùng</system:String>
<system:String x:Key="LastQuerySelected">Chọn truy vấn cuối cùng</system:String> <system:String x:Key="LastQuerySelected">Chọn truy vấn cuối cùng</system:String>
<system:String x:Key="LastQueryEmpty">Trống truy vấn cuối cùng</system:String> <system:String x:Key="LastQueryEmpty">Trống truy vấn cuối cùng</system:String>
<system:String x:Key="LastQueryActionKeywordPreserved">Preserve Last Action Keyword</system:String>
<system:String x:Key="LastQueryActionKeywordSelected">Select Last Action Keyword</system:String>
<system:String x:Key="KeepMaxResults">Giữ nguyên chiều cao cửa sổ</system:String> <system:String x:Key="KeepMaxResults">Giữ nguyên chiều cao cửa sổ</system:String>
<system:String x:Key="KeepMaxResultsToolTip">Chiều cao cửa sổ không thể thay đổi bằng cách kéo.</system:String> <system:String x:Key="KeepMaxResultsToolTip">Chiều cao cửa sổ không thể thay đổi bằng cách kéo.</system:String>
<system:String x:Key="maxShowResults">Số kết quả tối đa</system:String> <system:String x:Key="maxShowResults">Số kết quả tối đa</system:String>

View file

@ -65,6 +65,8 @@
<system:String x:Key="LastQueryPreserved">保留上次搜索关键字</system:String> <system:String x:Key="LastQueryPreserved">保留上次搜索关键字</system:String>
<system:String x:Key="LastQuerySelected">选择上次搜索关键字</system:String> <system:String x:Key="LastQuerySelected">选择上次搜索关键字</system:String>
<system:String x:Key="LastQueryEmpty">清空上次搜索关键字</system:String> <system:String x:Key="LastQueryEmpty">清空上次搜索关键字</system:String>
<system:String x:Key="LastQueryActionKeywordPreserved">Preserve Last Action Keyword</system:String>
<system:String x:Key="LastQueryActionKeywordSelected">Select Last Action Keyword</system:String>
<system:String x:Key="KeepMaxResults">固定窗口高度</system:String> <system:String x:Key="KeepMaxResults">固定窗口高度</system:String>
<system:String x:Key="KeepMaxResultsToolTip">窗口高度不能通过拖动来调整。</system:String> <system:String x:Key="KeepMaxResultsToolTip">窗口高度不能通过拖动来调整。</system:String>
<system:String x:Key="maxShowResults">最大结果显示个数</system:String> <system:String x:Key="maxShowResults">最大结果显示个数</system:String>

View file

@ -65,6 +65,8 @@
<system:String x:Key="LastQueryPreserved">保留上一個查詢</system:String> <system:String x:Key="LastQueryPreserved">保留上一個查詢</system:String>
<system:String x:Key="LastQuerySelected">選擇上一個查詢</system:String> <system:String x:Key="LastQuerySelected">選擇上一個查詢</system:String>
<system:String x:Key="LastQueryEmpty">清空上次搜尋關鍵字</system:String> <system:String x:Key="LastQueryEmpty">清空上次搜尋關鍵字</system:String>
<system:String x:Key="LastQueryActionKeywordPreserved">Preserve Last Action Keyword</system:String>
<system:String x:Key="LastQueryActionKeywordSelected">Select Last Action Keyword</system:String>
<system:String x:Key="KeepMaxResults">Fixed Window Height</system:String> <system:String x:Key="KeepMaxResults">Fixed Window Height</system:String>
<system:String x:Key="KeepMaxResultsToolTip">The window height is not adjustable by dragging.</system:String> <system:String x:Key="KeepMaxResultsToolTip">The window height is not adjustable by dragging.</system:String>
<system:String x:Key="maxShowResults">最大結果顯示個數</system:String> <system:String x:Key="maxShowResults">最大結果顯示個數</system:String>

View file

@ -26,7 +26,7 @@ using System.Media;
using DataObject = System.Windows.DataObject; using DataObject = System.Windows.DataObject;
using System.Windows.Media; using System.Windows.Media;
using System.Windows.Interop; using System.Windows.Interop;
using System.Runtime.InteropServices; using Windows.Win32;
namespace Flow.Launcher namespace Flow.Launcher
{ {
@ -34,9 +34,6 @@ namespace Flow.Launcher
{ {
#region Private Fields #region Private Fields
[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
public static extern IntPtr SetForegroundWindow(IntPtr hwnd);
private readonly Storyboard _progressBarStoryboard = new Storyboard(); private readonly Storyboard _progressBarStoryboard = new Storyboard();
private bool isProgressBarStoryboardPaused; private bool isProgressBarStoryboardPaused;
private Settings _settings; private Settings _settings;
@ -81,21 +78,19 @@ namespace Flow.Launcher
InitializeComponent(); InitializeComponent();
} }
private const int WM_ENTERSIZEMOVE = 0x0231;
private const int WM_EXITSIZEMOVE = 0x0232;
private int _initialWidth; private int _initialWidth;
private int _initialHeight; private int _initialHeight;
private IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled) private IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
{ {
if (msg == WM_ENTERSIZEMOVE) if (msg == PInvoke.WM_ENTERSIZEMOVE)
{ {
_initialWidth = (int)Width; _initialWidth = (int)Width;
_initialHeight = (int)Height; _initialHeight = (int)Height;
handled = true; handled = true;
} }
if (msg == WM_EXITSIZEMOVE) if (msg == PInvoke.WM_EXITSIZEMOVE)
{ {
if (_initialHeight != (int)Height) if (_initialHeight != (int)Height)
{ {
@ -424,7 +419,7 @@ namespace Flow.Launcher
// Get context menu handle and bring it to the foreground // Get context menu handle and bring it to the foreground
if (PresentationSource.FromVisual(contextMenu) is HwndSource hwndSource) if (PresentationSource.FromVisual(contextMenu) is HwndSource hwndSource)
{ {
_ = SetForegroundWindow(hwndSource.Handle); PInvoke.SetForegroundWindow(new(hwndSource.Handle));
} }
contextMenu.Focus(); contextMenu.Focus();
@ -692,7 +687,7 @@ namespace Flow.Launcher
screen = Screen.PrimaryScreen; screen = Screen.PrimaryScreen;
break; break;
case SearchWindowScreens.Focus: case SearchWindowScreens.Focus:
IntPtr foregroundWindowHandle = WindowsInteropHelper.GetForegroundWindow(); var foregroundWindowHandle = PInvoke.GetForegroundWindow().Value;
screen = Screen.FromHandle(foregroundWindowHandle); screen = Screen.FromHandle(foregroundWindowHandle);
break; break;
case SearchWindowScreens.Custom: case SearchWindowScreens.Custom:

View file

@ -0,0 +1,17 @@
DwmSetWindowAttribute
DwmExtendFrameIntoClientArea
SystemParametersInfo
SetForegroundWindow
GetWindowLong
SetWindowLong
GetForegroundWindow
GetDesktopWindow
GetShellWindow
GetWindowRect
GetClassName
FindWindowEx
WINDOW_STYLE
WM_ENTERSIZEMOVE
WM_EXITSIZEMOVE

View file

@ -0,0 +1,130 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" id="root">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace"/>
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0"/>
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string"/>
<xsd:attribute name="type" type="xsd:string"/>
<xsd:attribute name="mimetype" type="xsd:string"/>
<xsd:attribute ref="xml:space"/>
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string"/>
<xsd:attribute name="name" type="xsd:string"/>
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1"/>
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2"/>
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1"/>
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3"/>
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4"/>
<xsd:attribute ref="xml:space"/>
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1"/>
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required"/>
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/>
<data name="app" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\app.ico;System.Drawing.Icon, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="dev" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Images\dev.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="gamemode" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Images\gamemode.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
</root>

View file

@ -1,4 +1,4 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Net; using System.Net;
@ -117,35 +117,38 @@ namespace Flow.Launcher
ShellCommand.Execute(startInfo); ShellCommand.Execute(startInfo);
} }
public void CopyToClipboard(string stringToCopy, bool directCopy = false, bool showDefaultNotification = true) public async void CopyToClipboard(string stringToCopy, bool directCopy = false, bool showDefaultNotification = true)
{ {
if (string.IsNullOrEmpty(stringToCopy)) if (string.IsNullOrEmpty(stringToCopy))
return; return;
var isFile = File.Exists(stringToCopy); await Win32Helper.StartSTATaskAsync(() =>
if (directCopy && (isFile || Directory.Exists(stringToCopy)))
{ {
var paths = new StringCollection var isFile = File.Exists(stringToCopy);
if (directCopy && (isFile || Directory.Exists(stringToCopy)))
{ {
stringToCopy var paths = new StringCollection
}; {
stringToCopy
};
Clipboard.SetFileDropList(paths); Clipboard.SetFileDropList(paths);
if (showDefaultNotification) if (showDefaultNotification)
ShowMsg( ShowMsg(
$"{GetTranslation("copy")} {(isFile ? GetTranslation("fileTitle") : GetTranslation("folderTitle"))}", $"{GetTranslation("copy")} {(isFile ? GetTranslation("fileTitle") : GetTranslation("folderTitle"))}",
GetTranslation("completedSuccessfully")); GetTranslation("completedSuccessfully"));
} }
else else
{ {
Clipboard.SetDataObject(stringToCopy); Clipboard.SetDataObject(stringToCopy);
if (showDefaultNotification) if (showDefaultNotification)
ShowMsg( ShowMsg(
$"{GetTranslation("copy")} {GetTranslation("textTitle")}", $"{GetTranslation("copy")} {GetTranslation("textTitle")}",
GetTranslation("completedSuccessfully")); GetTranslation("completedSuccessfully"));
} }
});
} }
public void StartLoadingBar() => _mainVM.ProgressBarVisibility = Visibility.Visible; public void StartLoadingBar() => _mainVM.ProgressBarVisibility = Visibility.Visible;

View file

@ -16,7 +16,7 @@
<system:String x:Key="flowlauncher_plugin_browserbookmark_copyurl_subtitle">URL des Lesezeichens in Zwischenablage kopieren</system:String> <system:String x:Key="flowlauncher_plugin_browserbookmark_copyurl_subtitle">URL des Lesezeichens in Zwischenablage kopieren</system:String>
<system:String x:Key="flowlauncher_plugin_browserbookmark_loadBrowserFrom">Browser laden aus:</system:String> <system:String x:Key="flowlauncher_plugin_browserbookmark_loadBrowserFrom">Browser laden aus:</system:String>
<system:String x:Key="flowlauncher_plugin_browserbookmark_browserName">Browser-Name</system:String> <system:String x:Key="flowlauncher_plugin_browserbookmark_browserName">Browser-Name</system:String>
<system:String x:Key="flowlauncher_plugin_browserbookmark_browserBookmarkDataDirectory">URL des Lesezeichens in Zwischenablage kopieren</system:String> <system:String x:Key="flowlauncher_plugin_browserbookmark_browserBookmarkDataDirectory">Pfad zu Datenverzeichnis</system:String>
<system:String x:Key="flowlauncher_plugin_browserbookmark_addBrowserBookmark">Hinzufügen</system:String> <system:String x:Key="flowlauncher_plugin_browserbookmark_addBrowserBookmark">Hinzufügen</system:String>
<system:String x:Key="flowlauncher_plugin_browserbookmark_editBrowserBookmark">Bearbeiten</system:String> <system:String x:Key="flowlauncher_plugin_browserbookmark_editBrowserBookmark">Bearbeiten</system:String>
<system:String x:Key="flowlauncher_plugin_browserbookmark_removeBrowserBookmark">Löschen</system:String> <system:String x:Key="flowlauncher_plugin_browserbookmark_removeBrowserBookmark">Löschen</system:String>

View file

@ -23,6 +23,6 @@
<system:String x:Key="flowlauncher_plugin_browserbookmark_browseBrowserBookmark">Navegar</system:String> <system:String x:Key="flowlauncher_plugin_browserbookmark_browseBrowserBookmark">Navegar</system:String>
<system:String x:Key="flowlauncher_plugin_browserbookmark_others">Otros</system:String> <system:String x:Key="flowlauncher_plugin_browserbookmark_others">Otros</system:String>
<system:String x:Key="flowlauncher_plugin_browserbookmark_browserEngine">Motor del navegador</system:String> <system:String x:Key="flowlauncher_plugin_browserbookmark_browserEngine">Motor del navegador</system:String>
<system:String x:Key="flowlauncher_plugin_browserbookmark_guideMessage01">Si no está utilizando Chrome, Firefox o Edge, o si está utilizando su versión portátil, debe añadir el directorio de datos de los marcadores y seleccionar el motor del navegador correcto para que este complemento funcione.</system:String> <system:String x:Key="flowlauncher_plugin_browserbookmark_guideMessage01">Si no está utilizando Chrome, Firefox o Edge, o si está utilizando su versión portable, debe añadir el directorio de datos de los marcadores y seleccionar el motor del navegador correcto para que este complemento funcione.</system:String>
<system:String x:Key="flowlauncher_plugin_browserbookmark_guideMessage02">Por ejemplo: El motor de Brave es Chromium; y la ubicación por defecto de los datos de los marcadores es: &quot;%LOCALAPPDATA%\BraveSoftware\Brave-Browser\UserData&quot;. Para el motor de Firefox, el directorio de los marcadores es la carpeta de datos del usuario que contiene el archivo places.sqlite.</system:String> <system:String x:Key="flowlauncher_plugin_browserbookmark_guideMessage02">Por ejemplo: El motor de Brave es Chromium; y la ubicación por defecto de los datos de los marcadores es: &quot;%LOCALAPPDATA%\BraveSoftware\Brave-Browser\UserData&quot;. Para el motor de Firefox, el directorio de los marcadores es la carpeta de datos del usuario que contiene el archivo places.sqlite.</system:String>
</ResourceDictionary> </ResourceDictionary>

View file

@ -0,0 +1,28 @@
<?xml version="1.0"?>
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:system="clr-namespace:System;assembly=mscorlib">
<!-- Plugin Info -->
<system:String x:Key="flowlauncher_plugin_browserbookmark_plugin_name">Browser Bookmarks</system:String>
<system:String x:Key="flowlauncher_plugin_browserbookmark_plugin_description">Search your browser bookmarks</system:String>
<!-- Settings -->
<system:String x:Key="flowlauncher_plugin_browserbookmark_bookmarkDataSetting">Bookmark Data</system:String>
<system:String x:Key="flowlauncher_plugin_browserbookmark_settings_openBookmarks">Open bookmarks in:</system:String>
<system:String x:Key="flowlauncher_plugin_browserbookmark_settings_newWindow">New window</system:String>
<system:String x:Key="flowlauncher_plugin_browserbookmark_settings_newTab">New tab</system:String>
<system:String x:Key="flowlauncher_plugin_browserbookmark_settings_setBrowserFromPath">Set browser from path:</system:String>
<system:String x:Key="flowlauncher_plugin_browserbookmark_settings_choose">Choose</system:String>
<system:String x:Key="flowlauncher_plugin_browserbookmark_copyurl_title">Copy url</system:String>
<system:String x:Key="flowlauncher_plugin_browserbookmark_copyurl_subtitle">Copy the bookmark's url to clipboard</system:String>
<system:String x:Key="flowlauncher_plugin_browserbookmark_loadBrowserFrom">Load Browser From:</system:String>
<system:String x:Key="flowlauncher_plugin_browserbookmark_browserName">Browser Name</system:String>
<system:String x:Key="flowlauncher_plugin_browserbookmark_browserBookmarkDataDirectory">Data Directory Path</system:String>
<system:String x:Key="flowlauncher_plugin_browserbookmark_addBrowserBookmark">הוסף</system:String>
<system:String x:Key="flowlauncher_plugin_browserbookmark_editBrowserBookmark">ערוך</system:String>
<system:String x:Key="flowlauncher_plugin_browserbookmark_removeBrowserBookmark">מחק</system:String>
<system:String x:Key="flowlauncher_plugin_browserbookmark_browseBrowserBookmark">Browse</system:String>
<system:String x:Key="flowlauncher_plugin_browserbookmark_others">Others</system:String>
<system:String x:Key="flowlauncher_plugin_browserbookmark_browserEngine">Browser Engine</system:String>
<system:String x:Key="flowlauncher_plugin_browserbookmark_guideMessage01">If you are not using Chrome, Firefox or Edge, or you are using their portable version, you need to add bookmarks data directory and select correct browser engine to make this plugin work.</system:String>
<system:String x:Key="flowlauncher_plugin_browserbookmark_guideMessage02">For example: Brave's engine is Chromium; and its default bookmarks data location is: &quot;%LOCALAPPDATA%\BraveSoftware\Brave-Browser\UserData&quot;. For Firefox engine, the bookmarks directory is the userdata folder contains the places.sqlite file.</system:String>
</ResourceDictionary>

View file

@ -2,8 +2,8 @@
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:system="clr-namespace:System;assembly=mscorlib"> <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:system="clr-namespace:System;assembly=mscorlib">
<system:String x:Key="flowlauncher_plugin_caculator_plugin_name">Rechner</system:String> <system:String x:Key="flowlauncher_plugin_caculator_plugin_name">Rechner</system:String>
<system:String x:Key="flowlauncher_plugin_caculator_plugin_description">Ermöglicht mathematische Berechnungen (z. B. 5*3-2 in Flow Launcher)</system:String> <system:String x:Key="flowlauncher_plugin_caculator_plugin_description">Ermöglicht mathematische Berechnungen. (Versuchen Sie 5*3-2 in Flow Launcher)</system:String>
<system:String x:Key="flowlauncher_plugin_calculator_not_a_number">Nicht eine Zahl (NaN)</system:String> <system:String x:Key="flowlauncher_plugin_calculator_not_a_number">Nicht eine Zahl (NaN)</system:String>
<system:String x:Key="flowlauncher_plugin_calculator_expression_not_complete">Ausdruck falsch oder unvollständig (Haben Sie einige Klammern vergessen?)</system:String> <system:String x:Key="flowlauncher_plugin_calculator_expression_not_complete">Ausdruck falsch oder unvollständig (Haben Sie einige Klammern vergessen?)</system:String>
<system:String x:Key="flowlauncher_plugin_calculator_copy_number_to_clipboard">Diese Zahl in die Zwischenablage kopieren</system:String> <system:String x:Key="flowlauncher_plugin_calculator_copy_number_to_clipboard">Diese Zahl in die Zwischenablage kopieren</system:String>
<system:String x:Key="flowlauncher_plugin_calculator_output_decimal_seperator">Dezimaltrennzeichen</system:String> <system:String x:Key="flowlauncher_plugin_calculator_output_decimal_seperator">Dezimaltrennzeichen</system:String>

View file

@ -0,0 +1,15 @@
<?xml version="1.0"?>
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:system="clr-namespace:System;assembly=mscorlib">
<system:String x:Key="flowlauncher_plugin_caculator_plugin_name">Calculator</system:String>
<system:String x:Key="flowlauncher_plugin_caculator_plugin_description">Allows to do mathematical calculations.(Try 5*3-2 in Flow Launcher)</system:String>
<system:String x:Key="flowlauncher_plugin_calculator_not_a_number">Not a number (NaN)</system:String>
<system:String x:Key="flowlauncher_plugin_calculator_expression_not_complete">Expression wrong or incomplete (Did you forget some parentheses?)</system:String>
<system:String x:Key="flowlauncher_plugin_calculator_copy_number_to_clipboard">Copy this number to the clipboard</system:String>
<system:String x:Key="flowlauncher_plugin_calculator_output_decimal_seperator">Decimal separator</system:String>
<system:String x:Key="flowlauncher_plugin_calculator_output_decimal_seperator_help">The decimal separator to be used in the output.</system:String>
<system:String x:Key="flowlauncher_plugin_calculator_decimal_seperator_use_system_locale">Use system locale</system:String>
<system:String x:Key="flowlauncher_plugin_calculator_decimal_seperator_comma">Comma (,)</system:String>
<system:String x:Key="flowlauncher_plugin_calculator_decimal_seperator_dot">Dot (.)</system:String>
<system:String x:Key="flowlauncher_plugin_calculator_max_decimal_places">Max. decimal places</system:String>
</ResourceDictionary>

View file

@ -2,7 +2,7 @@
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:system="clr-namespace:System;assembly=mscorlib"> <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:system="clr-namespace:System;assembly=mscorlib">
<!-- Dialogues --> <!-- Dialogues -->
<system:String x:Key="plugin_explorer_make_selection_warning">Bitte treffen Sie zuerst eine Auswahl.</system:String> <system:String x:Key="plugin_explorer_make_selection_warning">Bitte treffen Sie zuerst eine Auswahl</system:String>
<system:String x:Key="plugin_explorer_select_folder_link_warning">Bitte wählen Sie einen Ordner-Link aus</system:String> <system:String x:Key="plugin_explorer_select_folder_link_warning">Bitte wählen Sie einen Ordner-Link aus</system:String>
<system:String x:Key="plugin_explorer_delete_folder_link">Sind Sie sicher, dass Sie {0} löschen wollen?</system:String> <system:String x:Key="plugin_explorer_delete_folder_link">Sind Sie sicher, dass Sie {0} löschen wollen?</system:String>
<system:String x:Key="plugin_explorer_deletefileconfirm">Sind Sie sicher, dass Sie diese Datei dauerhaft löschen möchten?</system:String> <system:String x:Key="plugin_explorer_deletefileconfirm">Sind Sie sicher, dass Sie diese Datei dauerhaft löschen möchten?</system:String>
@ -40,8 +40,8 @@
<system:String x:Key="plugin_explorer_shell_path">Shell-Pfad</system:String> <system:String x:Key="plugin_explorer_shell_path">Shell-Pfad</system:String>
<system:String x:Key="plugin_explorer_indexsearchexcludedpaths_header">Indexsuche ausgeschlossene Pfade</system:String> <system:String x:Key="plugin_explorer_indexsearchexcludedpaths_header">Indexsuche ausgeschlossene Pfade</system:String>
<system:String x:Key="plugin_explorer_use_location_as_working_dir">Ort des Suchergebnisses als Arbeitsverzeichnis der ausführbaren Datei verwenden</system:String> <system:String x:Key="plugin_explorer_use_location_as_working_dir">Ort des Suchergebnisses als Arbeitsverzeichnis der ausführbaren Datei verwenden</system:String>
<system:String x:Key="plugin_explorer_default_open_in_file_manager">Drücken Sie die Enter, um den Ordner im Default-Dateimanager zu öffnen</system:String> <system:String x:Key="plugin_explorer_default_open_in_file_manager">Drücken Sie Enter, um Ordner im Default-Dateimanager zu öffnen</system:String>
<system:String x:Key="plugin_explorer_usewindowsindexfordirectorysearch">Use Index Search For Path Search</system:String> <system:String x:Key="plugin_explorer_usewindowsindexfordirectorysearch">Indexsuche für Pfadsuche verwenden</system:String>
<system:String x:Key="plugin_explorer_manageindexoptions">Indexierungsoptionen</system:String> <system:String x:Key="plugin_explorer_manageindexoptions">Indexierungsoptionen</system:String>
<system:String x:Key="plugin_explorer_actionkeywordview_search">Suche:</system:String> <system:String x:Key="plugin_explorer_actionkeywordview_search">Suche:</system:String>
<system:String x:Key="plugin_explorer_actionkeywordview_pathsearch">Pfad-Suche:</system:String> <system:String x:Key="plugin_explorer_actionkeywordview_pathsearch">Pfad-Suche:</system:String>
@ -60,10 +60,10 @@
<system:String x:Key="plugin_explorer_enabled">Aktiviert</system:String> <system:String x:Key="plugin_explorer_enabled">Aktiviert</system:String>
<system:String x:Key="plugin_explorer_disabled">Deaktiviert</system:String> <system:String x:Key="plugin_explorer_disabled">Deaktiviert</system:String>
<system:String x:Key="plugin_explorer_Content_Search_Engine">Content Search Engine</system:String> <system:String x:Key="plugin_explorer_Content_Search_Engine">Content-Suchmaschine</system:String>
<system:String x:Key="plugin_explorer_Directory_Recursive_Search_Engine">Directory Recursive Search Engine</system:String> <system:String x:Key="plugin_explorer_Directory_Recursive_Search_Engine">Verzeichnis Rekursive Suchmaschine</system:String>
<system:String x:Key="plugin_explorer_Index_Search_Engine">Index Search Engine</system:String> <system:String x:Key="plugin_explorer_Index_Search_Engine">Suchmaschine indizieren</system:String>
<system:String x:Key="plugin_explorer_Open_Window_Index_Option">Open Windows Index Option</system:String> <system:String x:Key="plugin_explorer_Open_Window_Index_Option">Windows-Indexierungsoptionen öffnen</system:String>
<system:String x:Key="plugin_explorer_Excluded_File_Types">Ausgeschlossene Dateitypen (durch Komma getrennt)</system:String> <system:String x:Key="plugin_explorer_Excluded_File_Types">Ausgeschlossene Dateitypen (durch Komma getrennt)</system:String>
<system:String x:Key="plugin_explorer_Excluded_File_Types_Tooltip">Zum Beispiel: exe,jpg,png</system:String> <system:String x:Key="plugin_explorer_Excluded_File_Types_Tooltip">Zum Beispiel: exe,jpg,png</system:String>
<system:String x:Key="plugin_explorer_Maximum_Results">Maximale Ergebnisse</system:String> <system:String x:Key="plugin_explorer_Maximum_Results">Maximale Ergebnisse</system:String>
@ -131,12 +131,12 @@
<system:String x:Key="flowlauncher_plugin_everything_sort_by_path">Pfad</system:String> <system:String x:Key="flowlauncher_plugin_everything_sort_by_path">Pfad</system:String>
<system:String x:Key="flowlauncher_plugin_everything_sort_by_size">Größe</system:String> <system:String x:Key="flowlauncher_plugin_everything_sort_by_size">Größe</system:String>
<system:String x:Key="flowlauncher_plugin_everything_sort_by_extension">Extension</system:String> <system:String x:Key="flowlauncher_plugin_everything_sort_by_extension">Extension</system:String>
<system:String x:Key="flowlauncher_plugin_everything_sort_by_type_name">Type Name</system:String> <system:String x:Key="flowlauncher_plugin_everything_sort_by_type_name">Typname</system:String>
<system:String x:Key="flowlauncher_plugin_everything_sort_by_date_created">Erstellungsdatum</system:String> <system:String x:Key="flowlauncher_plugin_everything_sort_by_date_created">Erstellungsdatum</system:String>
<system:String x:Key="flowlauncher_plugin_everything_sort_by_date_modified">Änderungsdatum</system:String> <system:String x:Key="flowlauncher_plugin_everything_sort_by_date_modified">Änderungsdatum</system:String>
<system:String x:Key="flowlauncher_plugin_everything_sort_by_attributes">Attribute</system:String> <system:String x:Key="flowlauncher_plugin_everything_sort_by_attributes">Attribute</system:String>
<system:String x:Key="flowlauncher_plugin_everything_sort_by_file_list_filename">File List FileName</system:String> <system:String x:Key="flowlauncher_plugin_everything_sort_by_file_list_filename">Dateilistenname</system:String>
<system:String x:Key="flowlauncher_plugin_everything_sort_by_run_count">Run Count</system:String> <system:String x:Key="flowlauncher_plugin_everything_sort_by_run_count">Ausführungszahl</system:String>
<system:String x:Key="flowlauncher_plugin_everything_sort_by_date_recently_changed">Datum kürzlich geändert</system:String> <system:String x:Key="flowlauncher_plugin_everything_sort_by_date_recently_changed">Datum kürzlich geändert</system:String>
<system:String x:Key="flowlauncher_plugin_everything_sort_by_date_accessed">Zugriffsdatum</system:String> <system:String x:Key="flowlauncher_plugin_everything_sort_by_date_accessed">Zugriffsdatum</system:String>
<system:String x:Key="flowlauncher_plugin_everything_sort_by_date_run">Ausführungsdatum</system:String> <system:String x:Key="flowlauncher_plugin_everything_sort_by_date_run">Ausführungsdatum</system:String>
@ -145,7 +145,7 @@
<system:String x:Key="flowlauncher_plugin_everything_nonfastsort_warning">Warnung: Dies ist keine Schnellsortieroption, Suchen können langsam sein</system:String> <system:String x:Key="flowlauncher_plugin_everything_nonfastsort_warning">Warnung: Dies ist keine Schnellsortieroption, Suchen können langsam sein</system:String>
<system:String x:Key="flowlauncher_plugin_everything_search_fullpath">Vollständigen Pfad suchen</system:String> <system:String x:Key="flowlauncher_plugin_everything_search_fullpath">Vollständigen Pfad suchen</system:String>
<system:String x:Key="flowlauncher_plugin_everything_enable_run_count">Enable File/Folder Run Count</system:String> <system:String x:Key="flowlauncher_plugin_everything_enable_run_count">Datei-/Ordnerlaufzähler aktivieren</system:String>
<system:String x:Key="flowlauncher_plugin_everything_click_to_launch_or_install">Klicken, um Everything zu starten oder zu installieren</system:String> <system:String x:Key="flowlauncher_plugin_everything_click_to_launch_or_install">Klicken, um Everything zu starten oder zu installieren</system:String>
<system:String x:Key="flowlauncher_plugin_everything_installing_title">Everything-Installation</system:String> <system:String x:Key="flowlauncher_plugin_everything_installing_title">Everything-Installation</system:String>

View file

@ -0,0 +1,165 @@
<?xml version="1.0"?>
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:system="clr-namespace:System;assembly=mscorlib">
<!-- Dialogues -->
<system:String x:Key="plugin_explorer_make_selection_warning">Please make a selection first</system:String>
<system:String x:Key="plugin_explorer_select_folder_link_warning">Please select a folder link</system:String>
<system:String x:Key="plugin_explorer_delete_folder_link">Are you sure you want to delete {0}?</system:String>
<system:String x:Key="plugin_explorer_deletefileconfirm">Are you sure you want to permanently delete this file?</system:String>
<system:String x:Key="plugin_explorer_deletefilefolderconfirm">Are you sure you want to permanently delete this file/folder?</system:String>
<system:String x:Key="plugin_explorer_deletefilefoldersuccess">Deletion successful</system:String>
<system:String x:Key="plugin_explorer_deletefilefoldersuccess_detail">Successfully deleted {0}</system:String>
<system:String x:Key="plugin_explorer_globalActionKeywordInvalid">Assigning the global action keyword could bring up too many results during search. Please choose a specific action keyword</system:String>
<system:String x:Key="plugin_explorer_quickaccess_globalActionKeywordInvalid">Quick Access can not be set to the global action keyword when enabled. Please choose a specific action keyword</system:String>
<system:String x:Key="plugin_explorer_windowsSearchServiceNotRunning">The required service for Windows Index Search does not appear to be running</system:String>
<system:String x:Key="plugin_explorer_windowsSearchServiceFix">To fix this, start the Windows Search service. Select here to remove this warning</system:String>
<system:String x:Key="plugin_explorer_alternative">The warning message has been switched off. As an alternative for searching files and folders, would you like to install Everything plugin?{0}{0}Select 'Yes' to install Everything plugin, or 'No' to return</system:String>
<system:String x:Key="plugin_explorer_alternative_title">Explorer Alternative</system:String>
<system:String x:Key="plugin_explorer_directoryinfosearch_error">Error occurred during search: {0}</system:String>
<system:String x:Key="plugin_explorer_opendir_error">Could not open folder</system:String>
<system:String x:Key="plugin_explorer_openfile_error">Could not open file</system:String>
<!-- Controls -->
<system:String x:Key="plugin_explorer_delete">מחק</system:String>
<system:String x:Key="plugin_explorer_edit">ערוך</system:String>
<system:String x:Key="plugin_explorer_add">הוסף</system:String>
<system:String x:Key="plugin_explorer_generalsetting_header">General Setting</system:String>
<system:String x:Key="plugin_explorer_manageactionkeywords_header">Customise Action Keywords</system:String>
<system:String x:Key="plugin_explorer_quickaccesslinks_header">Quick Access Links</system:String>
<system:String x:Key="plugin_explorer_everything_setting_header">Everything Setting</system:String>
<system:String x:Key="plugin_explorer_previewpanel_setting_header">Preview Panel</system:String>
<system:String x:Key="plugin_explorer_previewpanel_display_file_size_checkbox">Size</system:String>
<system:String x:Key="plugin_explorer_previewpanel_display_file_creation_checkbox">Date Created</system:String>
<system:String x:Key="plugin_explorer_previewpanel_display_file_modification_checkbox">Date Modified</system:String>
<system:String x:Key="plugin_explorer_previewpanel_file_info_label">Display File Info</system:String>
<system:String x:Key="plugin_explorer_previewpanel_date_and_time_format_label">Date and time format</system:String>
<system:String x:Key="plugin_explorer_everything_sort_option">Sort Option:</system:String>
<system:String x:Key="plugin_explorer_everything_installed_path">Everything Path:</system:String>
<system:String x:Key="plugin_explorer_launch_hidden">Launch Hidden</system:String>
<system:String x:Key="plugin_explorer_editor_path">Editor Path</system:String>
<system:String x:Key="plugin_explorer_shell_path">Shell Path</system:String>
<system:String x:Key="plugin_explorer_indexsearchexcludedpaths_header">Index Search Excluded Paths</system:String>
<system:String x:Key="plugin_explorer_use_location_as_working_dir">Use search result's location as the working directory of the executable</system:String>
<system:String x:Key="plugin_explorer_default_open_in_file_manager">Hit Enter to open folder in Default File Manager</system:String>
<system:String x:Key="plugin_explorer_usewindowsindexfordirectorysearch">Use Index Search For Path Search</system:String>
<system:String x:Key="plugin_explorer_manageindexoptions">Indexing Options</system:String>
<system:String x:Key="plugin_explorer_actionkeywordview_search">Search:</system:String>
<system:String x:Key="plugin_explorer_actionkeywordview_pathsearch">Path Search:</system:String>
<system:String x:Key="plugin_explorer_actionkeywordview_filecontentsearch">File Content Search:</system:String>
<system:String x:Key="plugin_explorer_actionkeywordview_indexsearch">Index Search:</system:String>
<system:String x:Key="plugin_explorer_actionkeywordview_quickaccess">Quick Access:</system:String>
<system:String x:Key="plugin_explorer_actionkeyword_current">Current Action Keyword</system:String>
<system:String x:Key="plugin_explorer_actionkeyword_done">בוצע</system:String>
<system:String x:Key="plugin_explorer_actionkeyword_enabled">Enabled</system:String>
<system:String x:Key="plugin_explorer_actionkeyword_enabled_tooltip">When disabled Flow will not execute this search option, and will additionally revert back to '*' to free up the action keyword</system:String>
<system:String x:Key="plugin_explorer_engine_everything">Everything</system:String>
<system:String x:Key="plugin_explorer_engine_windows_index">Windows Index</system:String>
<system:String x:Key="plugin_explorer_path_enumeration_engine_none">Direct Enumeration</system:String>
<system:String x:Key="plugin_explorer_file_editor_path">File Editor Path</system:String>
<system:String x:Key="plugin_explorer_folder_editor_path">Folder Editor Path</system:String>
<system:String x:Key="plugin_explorer_enabled">Enabled</system:String>
<system:String x:Key="plugin_explorer_disabled">Disabled</system:String>
<system:String x:Key="plugin_explorer_Content_Search_Engine">Content Search Engine</system:String>
<system:String x:Key="plugin_explorer_Directory_Recursive_Search_Engine">Directory Recursive Search Engine</system:String>
<system:String x:Key="plugin_explorer_Index_Search_Engine">Index Search Engine</system:String>
<system:String x:Key="plugin_explorer_Open_Window_Index_Option">Open Windows Index Option</system:String>
<system:String x:Key="plugin_explorer_Excluded_File_Types">Excluded File Types (comma seperated)</system:String>
<system:String x:Key="plugin_explorer_Excluded_File_Types_Tooltip">For example: exe,jpg,png</system:String>
<system:String x:Key="plugin_explorer_Maximum_Results">Maximum results</system:String>
<system:String x:Key="plugin_explorer_Maximum_Results_Tooltip">The maximum number of results requested from active search engine</system:String>
<!-- Plugin Infos -->
<system:String x:Key="plugin_explorer_plugin_name">Explorer</system:String>
<system:String x:Key="plugin_explorer_plugin_description">Find and manage files and folders via Windows Search or Everything</system:String>
<!-- Plugin Tooltip -->
<system:String x:Key="plugin_explorer_plugin_ToolTipOpenDirectory">Ctrl + Enter to open the directory</system:String>
<system:String x:Key="plugin_explorer_plugin_ToolTipOpenContainingFolder">Ctrl + Enter to open the containing folder</system:String>
<!-- Context menu items -->
<system:String x:Key="plugin_explorer_copypath">Copy path</system:String>
<system:String x:Key="plugin_explorer_copypath_subtitle">Copy path of current item to clipboard</system:String>
<system:String x:Key="plugin_explorer_copyfilefolder">Copy</system:String>
<system:String x:Key="plugin_explorer_copyfile_subtitle">Copy current file to clipboard</system:String>
<system:String x:Key="plugin_explorer_copyfolder_subtitle">Copy current folder to clipboard</system:String>
<system:String x:Key="plugin_explorer_deletefilefolder">מחק</system:String>
<system:String x:Key="plugin_explorer_deletefile_subtitle">Permanently delete current file</system:String>
<system:String x:Key="plugin_explorer_deletefolder_subtitle">Permanently delete current folder</system:String>
<system:String x:Key="plugin_explorer_path">Path:</system:String>
<system:String x:Key="plugin_explorer_deletefilefolder_subtitle">Delete the selected</system:String>
<system:String x:Key="plugin_explorer_runasdifferentuser">Run as different user</system:String>
<system:String x:Key="plugin_explorer_runasdifferentuser_subtitle">Run the selected using a different user account</system:String>
<system:String x:Key="plugin_explorer_opencontainingfolder">Open containing folder</system:String>
<system:String x:Key="plugin_explorer_opencontainingfolder_subtitle">Open the location that contains current item</system:String>
<system:String x:Key="plugin_explorer_openwitheditor">Open With Editor:</system:String>
<system:String x:Key="plugin_explorer_openwitheditor_error">Failed to open file at {0} with Editor {1} at {2}</system:String>
<system:String x:Key="plugin_explorer_openwithshell">Open With Shell:</system:String>
<system:String x:Key="plugin_explorer_openwithshell_error">Failed to open folder {0} with Shell {1} at {2}</system:String>
<system:String x:Key="plugin_explorer_excludefromindexsearch">Exclude current and sub-directories from Index Search</system:String>
<system:String x:Key="plugin_explorer_excludedfromindexsearch_msg">Excluded from Index Search</system:String>
<system:String x:Key="plugin_explorer_openindexingoptions">Open Windows Indexing Options</system:String>
<system:String x:Key="plugin_explorer_openindexingoptions_subtitle">Manage indexed files and folders</system:String>
<system:String x:Key="plugin_explorer_openindexingoptions_errormsg">Failed to open Windows Indexing Options</system:String>
<system:String x:Key="plugin_explorer_add_to_quickaccess_title">Add to Quick Access</system:String>
<system:String x:Key="plugin_explorer_add_to_quickaccess_subtitle">Add current item to Quick Access</system:String>
<system:String x:Key="plugin_explorer_addfilefoldersuccess">Successfully Added</system:String>
<system:String x:Key="plugin_explorer_addfilefoldersuccess_detail">Successfully added to Quick Access</system:String>
<system:String x:Key="plugin_explorer_removefilefoldersuccess">Successfully Removed</system:String>
<system:String x:Key="plugin_explorer_removefilefoldersuccess_detail">Successfully removed from Quick Access</system:String>
<system:String x:Key="plugin_explorer_contextmenu_titletooltip">Add to Quick Access so it can be opened with Explorer's Search Activation action keyword</system:String>
<system:String x:Key="plugin_explorer_contextmenu_remove_titletooltip">Remove from Quick Access</system:String>
<system:String x:Key="plugin_explorer_remove_from_quickaccess_title">Remove from Quick Access</system:String>
<system:String x:Key="plugin_explorer_remove_from_quickaccess_subtitle">Remove current item from Quick Access</system:String>
<system:String x:Key="plugin_explorer_show_contextmenu_title">Show Windows Context Menu</system:String>
<system:String x:Key="plugin_explorer_openwith">Open With</system:String>
<system:String x:Key="plugin_explorer_openwith_subtitle">Select a program to open with</system:String>
<!-- Special Results -->
<system:String x:Key="plugin_explorer_diskfreespace">{0} free of {1}</system:String>
<system:String x:Key="plugin_explorer_openresultfolder">Open in Default File Manager</system:String>
<system:String x:Key="plugin_explorer_openresultfolder_subtitle">
Use '&gt;' to search in this directory, '*' to search for file extensions or '&gt;*' to combine both searches.
</system:String>
<!-- Everything -->
<system:String x:Key="flowlauncher_plugin_everything_sdk_issue">Failed to load Everything SDK</system:String>
<system:String x:Key="flowlauncher_plugin_everything_is_not_running">אזהרה: שירות Everything אינו פועל</system:String>
<system:String x:Key="flowlauncher_plugin_everything_query_error">שגיאה במהלך שאילתה לEverything</system:String>
<system:String x:Key="flowlauncher_plugin_everything_sort_by">Sort By</system:String>
<system:String x:Key="flowlauncher_plugin_everything_sort_by_name">Name</system:String>
<system:String x:Key="flowlauncher_plugin_everything_sort_by_path">Path</system:String>
<system:String x:Key="flowlauncher_plugin_everything_sort_by_size">Size</system:String>
<system:String x:Key="flowlauncher_plugin_everything_sort_by_extension">Extension</system:String>
<system:String x:Key="flowlauncher_plugin_everything_sort_by_type_name">Type Name</system:String>
<system:String x:Key="flowlauncher_plugin_everything_sort_by_date_created">Date Created</system:String>
<system:String x:Key="flowlauncher_plugin_everything_sort_by_date_modified">Date Modified</system:String>
<system:String x:Key="flowlauncher_plugin_everything_sort_by_attributes">Attributes</system:String>
<system:String x:Key="flowlauncher_plugin_everything_sort_by_file_list_filename">File List FileName</system:String>
<system:String x:Key="flowlauncher_plugin_everything_sort_by_run_count">Run Count</system:String>
<system:String x:Key="flowlauncher_plugin_everything_sort_by_date_recently_changed">Date Recently Changed</system:String>
<system:String x:Key="flowlauncher_plugin_everything_sort_by_date_accessed">Date Accessed</system:String>
<system:String x:Key="flowlauncher_plugin_everything_sort_by_date_run">Date Run</system:String>
<system:String x:Key="flowlauncher_plugin_everything_sort_by_ascending">↑</system:String>
<system:String x:Key="flowlauncher_plugin_everything_sort_by_descending">↓</system:String>
<system:String x:Key="flowlauncher_plugin_everything_nonfastsort_warning">Warning: This is not a Fast Sort option, searches may be slow</system:String>
<system:String x:Key="flowlauncher_plugin_everything_search_fullpath">Search Full Path</system:String>
<system:String x:Key="flowlauncher_plugin_everything_enable_run_count">Enable File/Folder Run Count</system:String>
<system:String x:Key="flowlauncher_plugin_everything_click_to_launch_or_install">Click to launch or install Everything</system:String>
<system:String x:Key="flowlauncher_plugin_everything_installing_title">Everything Installation</system:String>
<system:String x:Key="flowlauncher_plugin_everything_installing_subtitle">Installing Everything service. Please wait...</system:String>
<system:String x:Key="flowlauncher_plugin_everything_installationsuccess_subtitle">Successfully installed Everything service</system:String>
<system:String x:Key="flowlauncher_plugin_everything_installationfailed_subtitle">Failed to automatically install Everything service. Please manually install it from https://www.voidtools.com</system:String>
<system:String x:Key="flowlauncher_plugin_everything_run_service">Click here to start it</system:String>
<system:String x:Key="flowlauncher_plugin_everything_installing_select">Unable to find an Everything installation, would you like to manually select a location?{0}{0}Click no and Everything will be automatically installed for you</system:String>
<system:String x:Key="flowlauncher_plugin_everything_enable_content_search">Do you want to enable content search for Everything?</system:String>
<system:String x:Key="flowlauncher_plugin_everything_enable_content_search_tips">It can be very slow without index (which is only supported in Everything v1.5+)</system:String>
<!-- Native Context Menu -->
<system:String x:Key="plugin_explorer_native_context_menu_header">Native Context Menu</system:String>
<system:String x:Key="plugin_explorer_native_context_menu_display_context_menu">Display native context menu (experimental)</system:String>
<system:String x:Key="plugin_explorer_native_context_menu_include_patterns_guide">Below you can specify items you want to include in the context menu, they can be partial (e.g. 'pen wit') or complete ('Open with').</system:String>
<system:String x:Key="plugin_explorer_native_context_menu_exclude_patterns_guide">Below you can specify items you want to exclude from context menu, they can be partial (e.g. 'pen wit') or complete ('Open with').</system:String>
</ResourceDictionary>

View file

@ -43,7 +43,7 @@
<system:String x:Key="plugin_explorer_default_open_in_file_manager">Hit Enter to open folder in Default File Manager</system:String> <system:String x:Key="plugin_explorer_default_open_in_file_manager">Hit Enter to open folder in Default File Manager</system:String>
<system:String x:Key="plugin_explorer_usewindowsindexfordirectorysearch">Use Index Search For Path Search</system:String> <system:String x:Key="plugin_explorer_usewindowsindexfordirectorysearch">Use Index Search For Path Search</system:String>
<system:String x:Key="plugin_explorer_manageindexoptions">Indexing Options</system:String> <system:String x:Key="plugin_explorer_manageindexoptions">Indexing Options</system:String>
<system:String x:Key="plugin_explorer_actionkeywordview_search">Search:</system:String> <system:String x:Key="plugin_explorer_actionkeywordview_search">Поиск:</system:String>
<system:String x:Key="plugin_explorer_actionkeywordview_pathsearch">Path Search:</system:String> <system:String x:Key="plugin_explorer_actionkeywordview_pathsearch">Path Search:</system:String>
<system:String x:Key="plugin_explorer_actionkeywordview_filecontentsearch">File Content Search:</system:String> <system:String x:Key="plugin_explorer_actionkeywordview_filecontentsearch">File Content Search:</system:String>
<system:String x:Key="plugin_explorer_actionkeywordview_indexsearch">Index Search:</system:String> <system:String x:Key="plugin_explorer_actionkeywordview_indexsearch">Index Search:</system:String>
@ -78,17 +78,17 @@
<system:String x:Key="plugin_explorer_plugin_ToolTipOpenContainingFolder">Ctrl + Enter to open the containing folder</system:String> <system:String x:Key="plugin_explorer_plugin_ToolTipOpenContainingFolder">Ctrl + Enter to open the containing folder</system:String>
<!-- Context menu items --> <!-- Context menu items -->
<system:String x:Key="plugin_explorer_copypath">Copy path</system:String> <system:String x:Key="plugin_explorer_copypath">Скопировать путь</system:String>
<system:String x:Key="plugin_explorer_copypath_subtitle">Copy path of current item to clipboard</system:String> <system:String x:Key="plugin_explorer_copypath_subtitle">Copy path of current item to clipboard</system:String>
<system:String x:Key="plugin_explorer_copyfilefolder">Copy</system:String> <system:String x:Key="plugin_explorer_copyfilefolder">Скопировать</system:String>
<system:String x:Key="plugin_explorer_copyfile_subtitle">Copy current file to clipboard</system:String> <system:String x:Key="plugin_explorer_copyfile_subtitle">Copy current file to clipboard</system:String>
<system:String x:Key="plugin_explorer_copyfolder_subtitle">Copy current folder to clipboard</system:String> <system:String x:Key="plugin_explorer_copyfolder_subtitle">Copy current folder to clipboard</system:String>
<system:String x:Key="plugin_explorer_deletefilefolder">Удалить</system:String> <system:String x:Key="plugin_explorer_deletefilefolder">Удалить</system:String>
<system:String x:Key="plugin_explorer_deletefile_subtitle">Permanently delete current file</system:String> <system:String x:Key="plugin_explorer_deletefile_subtitle">Permanently delete current file</system:String>
<system:String x:Key="plugin_explorer_deletefolder_subtitle">Permanently delete current folder</system:String> <system:String x:Key="plugin_explorer_deletefolder_subtitle">Permanently delete current folder</system:String>
<system:String x:Key="plugin_explorer_path">Path:</system:String> <system:String x:Key="plugin_explorer_path">Путь:</system:String>
<system:String x:Key="plugin_explorer_deletefilefolder_subtitle">Delete the selected</system:String> <system:String x:Key="plugin_explorer_deletefilefolder_subtitle">Delete the selected</system:String>
<system:String x:Key="plugin_explorer_runasdifferentuser">Run as different user</system:String> <system:String x:Key="plugin_explorer_runasdifferentuser">Запустить от имени другого пользователя</system:String>
<system:String x:Key="plugin_explorer_runasdifferentuser_subtitle">Run the selected using a different user account</system:String> <system:String x:Key="plugin_explorer_runasdifferentuser_subtitle">Run the selected using a different user account</system:String>
<system:String x:Key="plugin_explorer_opencontainingfolder">Open containing folder</system:String> <system:String x:Key="plugin_explorer_opencontainingfolder">Open containing folder</system:String>
<system:String x:Key="plugin_explorer_opencontainingfolder_subtitle">Open the location that contains current item</system:String> <system:String x:Key="plugin_explorer_opencontainingfolder_subtitle">Open the location that contains current item</system:String>

View file

@ -1,9 +1,9 @@
<?xml version="1.0"?> <?xml version="1.0"?>
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:system="clr-namespace:System;assembly=mscorlib"> <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:system="clr-namespace:System;assembly=mscorlib">
<system:String x:Key="flowlauncher_plugin_pluginindicator_result_subtitle">Plug-in-Aktions-Schlüsselwort {0} aktivieren</system:String> <system:String x:Key="flowlauncher_plugin_pluginindicator_result_subtitle">Aktions-Schlüsselwort für Plug-in {0} aktivieren</system:String>
<system:String x:Key="flowlauncher_plugin_pluginindicator_plugin_name">Plug-in-Indikator</system:String> <system:String x:Key="flowlauncher_plugin_pluginindicator_plugin_name">Plug-in-Indikator</system:String>
<system:String x:Key="flowlauncher_plugin_pluginindicator_plugin_description">Bietet Vorschläge für Aktionswörter für Plug-ins</system:String> <system:String x:Key="flowlauncher_plugin_pluginindicator_plugin_description">Bietet Vorschläge für Aktions-Schlüsselwörter für Plug-ins</system:String>
</ResourceDictionary> </ResourceDictionary>

View file

@ -0,0 +1,9 @@
<?xml version="1.0"?>
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:system="clr-namespace:System;assembly=mscorlib">
<system:String x:Key="flowlauncher_plugin_pluginindicator_result_subtitle">Activate {0} plugin action keyword</system:String>
<system:String x:Key="flowlauncher_plugin_pluginindicator_plugin_name">Plugin Indicator</system:String>
<system:String x:Key="flowlauncher_plugin_pluginindicator_plugin_description">Provides plugins action words suggestions</system:String>
</ResourceDictionary>

View file

@ -0,0 +1,63 @@
<?xml version="1.0"?>
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:system="clr-namespace:System;assembly=mscorlib">
<!-- Dialogues -->
<system:String x:Key="plugin_pluginsmanager_downloading_plugin">Downloading plugin</system:String>
<system:String x:Key="plugin_pluginsmanager_download_success">Successfully downloaded {0}</system:String>
<system:String x:Key="plugin_pluginsmanager_download_error">Error: Unable to download the plugin</system:String>
<system:String x:Key="plugin_pluginsmanager_uninstall_prompt">{0} by {1} {2}{3}Would you like to uninstall this plugin? After the uninstallation Flow will automatically restart.</system:String>
<system:String x:Key="plugin_pluginsmanager_uninstall_prompt_no_restart">{0} by {1} {2}{2}Would you like to uninstall this plugin?</system:String>
<system:String x:Key="plugin_pluginsmanager_install_prompt">{0} by {1} {2}{3}Would you like to install this plugin? After the installation Flow will automatically restart.</system:String>
<system:String x:Key="plugin_pluginsmanager_install_prompt_no_restart">{0} by {1} {2}{2}Would you like to install this plugin?</system:String>
<system:String x:Key="plugin_pluginsmanager_install_title">Plugin Install</system:String>
<system:String x:Key="plugin_pluginsmanager_installing_plugin">Installing Plugin</system:String>
<system:String x:Key="plugin_pluginsmanager_install_from_web">Download and install {0}</system:String>
<system:String x:Key="plugin_pluginsmanager_uninstall_title">Plugin Uninstall</system:String>
<system:String x:Key="plugin_pluginsmanager_install_success_restart">Plugin {0} successfully installed. Restarting Flow, please wait...</system:String>
<system:String x:Key="plugin_pluginsmanager_install_errormetadatafile">Unable to find the plugin.json metadata file from the extracted zip file.</system:String>
<system:String x:Key="plugin_pluginsmanager_install_error_duplicate">Error: A plugin which has the same or greater version with {0} already exists.</system:String>
<system:String x:Key="plugin_pluginsmanager_install_error_title">Error installing plugin</system:String>
<system:String x:Key="plugin_pluginsmanager_install_error_subtitle">Error occurred while trying to install {0}</system:String>
<system:String x:Key="plugin_pluginsmanager_uninstall_error_title">Error uninstalling plugin</system:String>
<system:String x:Key="plugin_pluginsmanager_update_noresult_title">No update available</system:String>
<system:String x:Key="plugin_pluginsmanager_update_noresult_subtitle">All plugins are up to date</system:String>
<system:String x:Key="plugin_pluginsmanager_update_prompt">{0} by {1} {2}{3}Would you like to update this plugin? After the update Flow will automatically restart.</system:String>
<system:String x:Key="plugin_pluginsmanager_update_prompt_no_restart">{0} by {1} {2}{2}Would you like to update this plugin?</system:String>
<system:String x:Key="plugin_pluginsmanager_update_title">Plugin Update</system:String>
<system:String x:Key="plugin_pluginsmanager_update_alreadyexists">This plugin is already installed</system:String>
<system:String x:Key="plugin_pluginsmanager_update_failed_title">Plugin Manifest Download Failed</system:String>
<system:String x:Key="plugin_pluginsmanager_update_failed_subtitle">Please check if you can connect to github.com. This error means you may not be able to install or update plugins.</system:String>
<system:String x:Key="plugin_pluginsmanager_update_all_title">Update all plugins</system:String>
<system:String x:Key="plugin_pluginsmanager_update_all_subtitle">Would you like to update all plugins?</system:String>
<system:String x:Key="plugin_pluginsmanager_update_all_prompt">Would you like to update {0} plugins?{1}Flow Launcher will restart after updating all plugins.</system:String>
<system:String x:Key="plugin_pluginsmanager_update_all_prompt_no_restart">Would you like to update {0} plugins?</system:String>
<system:String x:Key="plugin_pluginsmanager_update_all_success_restart">{0} plugins successfully updated. Restarting Flow, please wait...</system:String>
<system:String x:Key="plugin_pluginsmanager_update_success_restart">Plugin {0} successfully updated. Restarting Flow, please wait...</system:String>
<system:String x:Key="plugin_pluginsmanager_install_unknown_source_warning_title">Installing from an unknown source</system:String>
<system:String x:Key="plugin_pluginsmanager_install_unknown_source_warning">You are installing this plugin from an unknown source and it may contain potential risks!{0}{0}Please ensure you understand where this plugin is from and that it is safe.{0}{0}Would you like to continue still?{0}{0}(You can switch off this warning via settings)</system:String>
<system:String x:Key="plugin_pluginsmanager_install_success_no_restart">Plugin {0} successfully installed. Please restart Flow.</system:String>
<system:String x:Key="plugin_pluginsmanager_uninstall_success_no_restart">Plugin {0} successfully uninstalled. Please restart Flow.</system:String>
<system:String x:Key="plugin_pluginsmanager_update_success_no_restart">Plugin {0} successfully updated. Please restart Flow.</system:String>
<system:String x:Key="plugin_pluginsmanager_update_all_success_no_restart">{0} plugins successfully updated. Please restart Flow.</system:String>
<system:String x:Key="plugin_pluginsmanager_plugin_modified_error">Plugin {0} has already been modified. Please restart Flow before making any further changes.</system:String>
<!-- Plugin Infos -->
<system:String x:Key="plugin_pluginsmanager_plugin_name">Plugins Manager</system:String>
<system:String x:Key="plugin_pluginsmanager_plugin_description">Management of installing, uninstalling or updating Flow Launcher plugins</system:String>
<system:String x:Key="plugin_pluginsmanager_unknown_author">Unknown Author</system:String>
<!-- Context menu items -->
<system:String x:Key="plugin_pluginsmanager_plugin_contextmenu_openwebsite_title">Open website</system:String>
<system:String x:Key="plugin_pluginsmanager_plugin_contextmenu_openwebsite_subtitle">Visit the plugin's website</system:String>
<system:String x:Key="plugin_pluginsmanager_plugin_contextmenu_gotosourcecode_title">See source code</system:String>
<system:String x:Key="plugin_pluginsmanager_plugin_contextmenu_gotosourcecode_subtitle">See the plugin's source code</system:String>
<system:String x:Key="plugin_pluginsmanager_plugin_contextmenu_newissue_title">Suggest an enhancement or submit an issue</system:String>
<system:String x:Key="plugin_pluginsmanager_plugin_contextmenu_newissue_subtitle">Suggest an enhancement or submit an issue to the plugin developer</system:String>
<system:String x:Key="plugin_pluginsmanager_plugin_contextmenu_pluginsmanifest_title">Go to Flow's plugins repository</system:String>
<system:String x:Key="plugin_pluginsmanager_plugin_contextmenu_pluginsmanifest_subtitle">Visit the PluginsManifest repository to see community-made plugin submissions</system:String>
<!-- Settings menu items -->
<system:String x:Key="plugin_pluginsmanager_plugin_settings_unknown_source">Install from unknown source warning</system:String>
<system:String x:Key="plugin_pluginsmanager_plugin_settings_auto_restart">Automatically restart Flow Launcher after installing/uninstalling/updating plugins</system:String>
</ResourceDictionary>

View file

@ -50,6 +50,13 @@
</Content> </Content>
</ItemGroup> </ItemGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Windows.CsWin32" Version="0.3.106">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
</ItemGroup>
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\..\Flow.Launcher.Infrastructure\Flow.Launcher.Infrastructure.csproj" /> <ProjectReference Include="..\..\Flow.Launcher.Infrastructure\Flow.Launcher.Infrastructure.csproj" />
<ProjectReference Include="..\..\Flow.Launcher.Plugin\Flow.Launcher.Plugin.csproj" /> <ProjectReference Include="..\..\Flow.Launcher.Plugin\Flow.Launcher.Plugin.csproj" />

View file

@ -1,11 +1,11 @@
<?xml version="1.0"?> <?xml version="1.0"?>
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:system="clr-namespace:System;assembly=mscorlib"> <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:system="clr-namespace:System;assembly=mscorlib">
<system:String x:Key="flowlauncher_plugin_processkiller_plugin_name">Prozesskiller</system:String> <system:String x:Key="flowlauncher_plugin_processkiller_plugin_name">Process Killer</system:String>
<system:String x:Key="flowlauncher_plugin_processkiller_plugin_description">Beende laufende Prozesse durch Flow Launcher</system:String> <system:String x:Key="flowlauncher_plugin_processkiller_plugin_description">Laufende Prozesse aus Flow Launcher beenden</system:String>
<system:String x:Key="flowlauncher_plugin_processkiller_kill_all">alle Instanzen von &quot;{0} &quot; beenden</system:String> <system:String x:Key="flowlauncher_plugin_processkiller_kill_all">Alle Instanzen von &quot;{0}&quot; beenden</system:String>
<system:String x:Key="flowlauncher_plugin_processkiller_kill_all_count">beende {0} Prozesse</system:String> <system:String x:Key="flowlauncher_plugin_processkiller_kill_all_count">{0} Prozesse beenden</system:String>
<system:String x:Key="flowlauncher_plugin_processkiller_kill_instances">alle Instanzen beenden</system:String> <system:String x:Key="flowlauncher_plugin_processkiller_kill_instances">Alle Instanzen beenden</system:String>
</ResourceDictionary> </ResourceDictionary>

View file

@ -0,0 +1,11 @@
<?xml version="1.0"?>
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:system="clr-namespace:System;assembly=mscorlib">
<system:String x:Key="flowlauncher_plugin_processkiller_plugin_name">Process Killer</system:String>
<system:String x:Key="flowlauncher_plugin_processkiller_plugin_description">Kill running processes from Flow Launcher</system:String>
<system:String x:Key="flowlauncher_plugin_processkiller_kill_all">kill all instances of &quot;{0}&quot;</system:String>
<system:String x:Key="flowlauncher_plugin_processkiller_kill_all_count">kill {0} processes</system:String>
<system:String x:Key="flowlauncher_plugin_processkiller_kill_instances">kill all instances</system:String>
</ResourceDictionary>

View file

@ -0,0 +1,2 @@
QueryFullProcessImageName
OpenProcess

View file

@ -1,11 +1,13 @@
using Flow.Launcher.Infrastructure; using Flow.Launcher.Infrastructure;
using Flow.Launcher.Infrastructure.Logger; using Flow.Launcher.Infrastructure.Logger;
using Microsoft.Win32.SafeHandles;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Diagnostics; using System.Diagnostics;
using System.Linq; using System.Linq;
using System.Runtime.InteropServices; using Windows.Win32;
using System.Text; using Windows.Win32.Foundation;
using Windows.Win32.System.Threading;
namespace Flow.Launcher.Plugin.ProcessKiller namespace Flow.Launcher.Plugin.ProcessKiller
{ {
@ -84,43 +86,33 @@ namespace Flow.Launcher.Plugin.ProcessKiller
} }
} }
public string TryGetProcessFilename(Process p) public unsafe string TryGetProcessFilename(Process p)
{ {
try try
{ {
int capacity = 2000; var handle = PInvoke.OpenProcess(PROCESS_ACCESS_RIGHTS.PROCESS_QUERY_LIMITED_INFORMATION, false, (uint)p.Id);
StringBuilder builder = new StringBuilder(capacity); if (handle.Value == IntPtr.Zero)
IntPtr ptr = OpenProcess(ProcessAccessFlags.QueryLimitedInformation, false, p.Id);
if (!QueryFullProcessImageName(ptr, 0, builder, ref capacity))
{ {
return String.Empty; return string.Empty;
} }
return builder.ToString(); using var safeHandle = new SafeProcessHandle(handle.Value, true);
uint capacity = 2000;
Span<char> buffer = new char[capacity];
fixed (char* pBuffer = buffer)
{
if (!PInvoke.QueryFullProcessImageName(safeHandle, PROCESS_NAME_FORMAT.PROCESS_NAME_WIN32, (PWSTR)pBuffer, ref capacity))
{
return string.Empty;
}
return buffer[..(int)capacity].ToString();
}
} }
catch catch
{ {
return ""; return string.Empty;
} }
} }
[Flags]
private enum ProcessAccessFlags : uint
{
QueryLimitedInformation = 0x00001000
}
[DllImport("kernel32.dll", SetLastError = true)]
private static extern bool QueryFullProcessImageName(
[In] IntPtr hProcess,
[In] int dwFlags,
[Out] StringBuilder lpExeName,
ref int lpdwSize);
[DllImport("kernel32.dll", SetLastError = true)]
private static extern IntPtr OpenProcess(
ProcessAccessFlags processAccess,
bool bInheritHandle,
int processId);
} }
} }

View file

@ -52,6 +52,10 @@
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content> </Content>
</ItemGroup> </ItemGroup>
<ItemGroup>
<AdditionalFiles Include="NativeMethods.txt" />
</ItemGroup>
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\..\Flow.Launcher.Infrastructure\Flow.Launcher.Infrastructure.csproj" /> <ProjectReference Include="..\..\Flow.Launcher.Infrastructure\Flow.Launcher.Infrastructure.csproj" />
@ -61,6 +65,10 @@
<ItemGroup> <ItemGroup>
<PackageReference Include="ini-parser" Version="2.5.2" /> <PackageReference Include="ini-parser" Version="2.5.2" />
<PackageReference Include="Microsoft.Extensions.Caching.Memory" Version="9.0.0" /> <PackageReference Include="Microsoft.Extensions.Caching.Memory" Version="9.0.0" />
<PackageReference Include="Microsoft.Windows.CsWin32" Version="0.3.106">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
</ItemGroup> </ItemGroup>
</Project> </Project>

View file

@ -31,7 +31,7 @@
<system:String x:Key="flowlauncher_plugin_program_enable_hidelnkpath">App-Pfad ausblenden</system:String> <system:String x:Key="flowlauncher_plugin_program_enable_hidelnkpath">App-Pfad ausblenden</system:String>
<system:String x:Key="flowlauncher_plugin_program_enable_hidelnkpath_tooltip">Für ausführbare Dateien wie UWP oder lnk den Dateipfad nicht mehr sichtbar machen</system:String> <system:String x:Key="flowlauncher_plugin_program_enable_hidelnkpath_tooltip">Für ausführbare Dateien wie UWP oder lnk den Dateipfad nicht mehr sichtbar machen</system:String>
<system:String x:Key="flowlauncher_plugin_program_enable_hideuninstallers">Uninstaller ausblenden</system:String> <system:String x:Key="flowlauncher_plugin_program_enable_hideuninstallers">Uninstaller ausblenden</system:String>
<system:String x:Key="flowlauncher_plugin_program_enable_hideuninstallers_tooltip">Versteckt Programme mit gängigen Uninstaller-Namen, wie unins000.exe</system:String> <system:String x:Key="flowlauncher_plugin_program_enable_hideuninstallers_tooltip">Blendet Programme mit gängigen Uninstaller-Namen aus, wie unins000.exe</system:String>
<system:String x:Key="flowlauncher_plugin_program_enable_description">In Programmbeschreibung suchen</system:String> <system:String x:Key="flowlauncher_plugin_program_enable_description">In Programmbeschreibung suchen</system:String>
<system:String x:Key="flowlauncher_plugin_program_enable_description_tooltip">Flow wird in Programmbeschreibung suchen</system:String> <system:String x:Key="flowlauncher_plugin_program_enable_description_tooltip">Flow wird in Programmbeschreibung suchen</system:String>
<system:String x:Key="flowlauncher_plugin_program_suffixes_header">Suffixe</system:String> <system:String x:Key="flowlauncher_plugin_program_suffixes_header">Suffixe</system:String>

View file

@ -75,7 +75,7 @@
<system:String x:Key="flowlauncher_plugin_program_disable_program">Masquer ce programme des résultats</system:String> <system:String x:Key="flowlauncher_plugin_program_disable_program">Masquer ce programme des résultats</system:String>
<system:String x:Key="flowlauncher_plugin_program_open_target_folder">Ouvrir le répertoire cible</system:String> <system:String x:Key="flowlauncher_plugin_program_open_target_folder">Ouvrir le répertoire cible</system:String>
<system:String x:Key="flowlauncher_plugin_program_plugin_name">Programme</system:String> <system:String x:Key="flowlauncher_plugin_program_plugin_name">Programmes</system:String>
<system:String x:Key="flowlauncher_plugin_program_plugin_description">Rechercher des programmes dans Flow Launcher</system:String> <system:String x:Key="flowlauncher_plugin_program_plugin_description">Rechercher des programmes dans Flow Launcher</system:String>
<system:String x:Key="flowlauncher_plugin_program_invalid_path">Chemin d'accès invalide</system:String> <system:String x:Key="flowlauncher_plugin_program_invalid_path">Chemin d'accès invalide</system:String>

View file

@ -0,0 +1,95 @@
<?xml version="1.0"?>
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:system="clr-namespace:System;assembly=mscorlib">
<!-- Program setting -->
<system:String x:Key="flowlauncher_plugin_program_reset">Reset Default</system:String>
<system:String x:Key="flowlauncher_plugin_program_delete">מחק</system:String>
<system:String x:Key="flowlauncher_plugin_program_edit">ערוך</system:String>
<system:String x:Key="flowlauncher_plugin_program_add">הוסף</system:String>
<system:String x:Key="flowlauncher_plugin_program_name">Name</system:String>
<system:String x:Key="flowlauncher_plugin_program_enable">Enable</system:String>
<system:String x:Key="flowlauncher_plugin_program_enabled">Enabled</system:String>
<system:String x:Key="flowlauncher_plugin_program_disable">Disable</system:String>
<system:String x:Key="flowlauncher_plugin_program_status">Status</system:String>
<system:String x:Key="flowlauncher_plugin_program_true">Enabled</system:String>
<system:String x:Key="flowlauncher_plugin_program_false">Disabled</system:String>
<system:String x:Key="flowlauncher_plugin_program_location">Location</system:String>
<system:String x:Key="flowlauncher_plugin_program_all_programs">All Programs</system:String>
<system:String x:Key="flowlauncher_plugin_program_suffixes">File Type</system:String>
<system:String x:Key="flowlauncher_plugin_program_reindex">Reindex</system:String>
<system:String x:Key="flowlauncher_plugin_program_indexing">Indexing</system:String>
<system:String x:Key="flowlauncher_plugin_program_index_source">Index Sources</system:String>
<system:String x:Key="flowlauncher_plugin_program_index_option">Options</system:String>
<system:String x:Key="flowlauncher_plugin_program_index_uwp">UWP Apps</system:String>
<system:String x:Key="flowlauncher_plugin_program_index_uwp_tooltip">When enabled, Flow will load UWP Applications</system:String>
<system:String x:Key="flowlauncher_plugin_program_index_start">Start Menu</system:String>
<system:String x:Key="flowlauncher_plugin_program_index_start_tooltip">When enabled, Flow will load programs from the start menu</system:String>
<system:String x:Key="flowlauncher_plugin_program_index_registry">Registry</system:String>
<system:String x:Key="flowlauncher_plugin_program_index_registry_tooltip">When enabled, Flow will load programs from the registry</system:String>
<system:String x:Key="flowlauncher_plugin_program_index_PATH">PATH</system:String>
<system:String x:Key="flowlauncher_plugin_program_index_PATH_tooltip">When enabled, Flow will load programs from the PATH environment variable</system:String>
<system:String x:Key="flowlauncher_plugin_program_enable_hidelnkpath">Hide app path</system:String>
<system:String x:Key="flowlauncher_plugin_program_enable_hidelnkpath_tooltip">For executable files such as UWP or lnk, hide the file path from being visible</system:String>
<system:String x:Key="flowlauncher_plugin_program_enable_hideuninstallers">Hide uninstallers</system:String>
<system:String x:Key="flowlauncher_plugin_program_enable_hideuninstallers_tooltip">Hides programs with common uninstaller names, such as unins000.exe</system:String>
<system:String x:Key="flowlauncher_plugin_program_enable_description">Search in Program Description</system:String>
<system:String x:Key="flowlauncher_plugin_program_enable_description_tooltip">Flow will search program's description</system:String>
<system:String x:Key="flowlauncher_plugin_program_suffixes_header">Suffixes</system:String>
<system:String x:Key="flowlauncher_plugin_program_max_depth_header">Max Depth</system:String>
<system:String x:Key="flowlauncher_plugin_program_directory">Directory</system:String>
<system:String x:Key="flowlauncher_plugin_program_browse">Browse</system:String>
<system:String x:Key="flowlauncher_plugin_program_file_suffixes">File Suffixes:</system:String>
<system:String x:Key="flowlauncher_plugin_program_max_search_depth">Maximum Search Depth (-1 is unlimited):</system:String>
<system:String x:Key="flowlauncher_plugin_program_pls_select_program_source">Please select a program source</system:String>
<system:String x:Key="flowlauncher_plugin_program_delete_program_source">Are you sure you want to delete the selected program sources?</system:String>
<system:String x:Key="flowlauncher_plugin_program_duplicate_program_source">Another program source with the same location already exists.</system:String>
<system:String x:Key="flowlauncher_plugin_program_edit_program_source_title">Program Source</system:String>
<system:String x:Key="flowlauncher_plugin_program_edit_program_source_tips">Edit directory and status of this program source.</system:String>
<system:String x:Key="flowlauncher_plugin_program_update">עדכון</system:String>
<system:String x:Key="flowlauncher_plugin_program_only_index_tip">Program Plugin will only index files with selected suffixes and .url files with selected protocols.</system:String>
<system:String x:Key="flowlauncher_plugin_program_update_file_suffixes">Successfully updated file suffixes</system:String>
<system:String x:Key="flowlauncher_plugin_program_suffixes_cannot_empty">File suffixes can't be empty</system:String>
<system:String x:Key="flowlauncher_plugin_protocols_cannot_empty">Protocols can't be empty</system:String>
<system:String x:Key="flowlauncher_plugin_program_suffixes_executable_types">File Suffixes</system:String>
<system:String x:Key="flowlauncher_plugin_program_suffixes_URL_types">URL Protocols</system:String>
<system:String x:Key="flowlauncher_plugin_program_suffixes_URL_steam">Steam Games</system:String>
<system:String x:Key="flowlauncher_plugin_program_suffixes_URL_epic">Epic Games</system:String>
<system:String x:Key="flowlauncher_plugin_program_suffixes_URL_http">Http/Https</system:String>
<system:String x:Key="flowlauncher_plugin_program_suffixes_custom_urls">Custom URL Protocols</system:String>
<system:String x:Key="flowlauncher_plugin_program_suffixes_custom_file_types">Custom File Suffixes</system:String>
<system:String x:Key="flowlauncher_plugin_program_suffixes_tooltip">
Insert file suffixes you want to index. Suffixes should be separated by ';'. (ex&gt;bat;py)
</system:String>
<system:String x:Key="flowlauncher_plugin_program_protocol_tooltip">
Insert protocols of .url files you want to index. Protocols should be separated by ';', and should end with &quot;://&quot;. (ex&gt;ftp://;mailto://)
</system:String>
<system:String x:Key="flowlauncher_plugin_program_run_as_different_user">Run As Different User</system:String>
<system:String x:Key="flowlauncher_plugin_program_run_as_administrator">Run As Administrator</system:String>
<system:String x:Key="flowlauncher_plugin_program_open_containing_folder">Open containing folder</system:String>
<system:String x:Key="flowlauncher_plugin_program_disable_program">Disable this program from displaying</system:String>
<system:String x:Key="flowlauncher_plugin_program_open_target_folder">Open target folder</system:String>
<system:String x:Key="flowlauncher_plugin_program_plugin_name">Program</system:String>
<system:String x:Key="flowlauncher_plugin_program_plugin_description">Search programs in Flow Launcher</system:String>
<system:String x:Key="flowlauncher_plugin_program_invalid_path">Invalid Path</system:String>
<system:String x:Key="flowlauncher_plugin_program_customizedexplorer">Customized Explorer</system:String>
<system:String x:Key="flowlauncher_plugin_program_args">Args</system:String>
<system:String x:Key="flowlauncher_plugin_program_tooltip_customizedexplorer">You can customize the explorer used for opening the container folder by inputing the Environmental Variable of the explorer you want to use. It will be useful to use CMD to test whether the Environmental Variable is available.</system:String>
<system:String x:Key="flowlauncher_plugin_program_tooltip_args">Enter the customized args you want to add for your customized explorer. %s for parent directory, %f for full path (which only works for win32). Check the explorer's website for details.</system:String>
<!-- Dialogs -->
<system:String x:Key="flowlauncher_plugin_program_disable_dlgtitle_success">הצליח</system:String>
<system:String x:Key="flowlauncher_plugin_program_disable_dlgtitle_error">Error</system:String>
<system:String x:Key="flowlauncher_plugin_program_disable_dlgtitle_success_message">Successfully disabled this program from displaying in your query</system:String>
<system:String x:Key="flowlauncher_plugin_program_run_as_administrator_not_supported_message">This app is not intended to be run as administrator</system:String>
<system:String x:Key="flowlauncher_plugin_program_run_failed">Unable to run {0}</system:String>
</ResourceDictionary>

View file

@ -0,0 +1,10 @@
SHGetLocalizedName
LoadString
LoadLibraryEx
FreeLibrary
ExpandEnvironmentStrings
S_OK
SLGP_FLAGS
WIN32_FIND_DATAW
SLR_FLAGS
IShellLinkW

View file

@ -1,97 +1,17 @@
using System; using System;
using System.Text;
using System.Runtime.InteropServices; using System.Runtime.InteropServices;
using Accessibility;
using System.Runtime.InteropServices.ComTypes; using System.Runtime.InteropServices.ComTypes;
using Flow.Launcher.Plugin.Program.Logger; using Flow.Launcher.Plugin.Program.Logger;
using Windows.Win32.Foundation;
using Windows.Win32.UI.Shell;
using Windows.Win32.Storage.FileSystem;
namespace Flow.Launcher.Plugin.Program.Programs namespace Flow.Launcher.Plugin.Program.Programs
{ {
class ShellLinkHelper class ShellLinkHelper
{ {
[Flags()]
public enum SLGP_FLAGS
{
SLGP_SHORTPATH = 0x1,
SLGP_UNCPRIORITY = 0x2,
SLGP_RAWPATH = 0x4
}
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
public struct WIN32_FIND_DATAW
{
public uint dwFileAttributes;
public long ftCreationTime;
public long ftLastAccessTime;
public long ftLastWriteTime;
public uint nFileSizeHigh;
public uint nFileSizeLow;
public uint dwReserved0;
public uint dwReserved1;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)]
public string cFileName;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 14)]
public string cAlternateFileName;
}
[Flags()]
public enum SLR_FLAGS
{
SLR_NO_UI = 0x1,
SLR_ANY_MATCH = 0x2,
SLR_UPDATE = 0x4,
SLR_NOUPDATE = 0x8,
SLR_NOSEARCH = 0x10,
SLR_NOTRACK = 0x20,
SLR_NOLINKINFO = 0x40,
SLR_INVOKE_MSI = 0x80
}
// Reference : http://www.pinvoke.net/default.aspx/Interfaces.IShellLinkW // Reference : http://www.pinvoke.net/default.aspx/Interfaces.IShellLinkW
/// The IShellLink interface allows Shell links to be created, modified, and resolved
[ComImport(), InterfaceType(ComInterfaceType.InterfaceIsIUnknown), Guid("000214F9-0000-0000-C000-000000000046")]
interface IShellLinkW
{
/// <summary>Retrieves the path and file name of a Shell link object</summary>
void GetPath([Out(), MarshalAs(UnmanagedType.LPWStr)] StringBuilder pszFile, int cchMaxPath, ref WIN32_FIND_DATAW pfd, SLGP_FLAGS fFlags);
/// <summary>Retrieves the list of item identifiers for a Shell link object</summary>
void GetIDList(out IntPtr ppidl);
/// <summary>Sets the pointer to an item identifier list (PIDL) for a Shell link object.</summary>
void SetIDList(IntPtr pidl);
/// <summary>Retrieves the description string for a Shell link object</summary>
void GetDescription([Out(), MarshalAs(UnmanagedType.LPWStr)] StringBuilder pszName, int cchMaxName);
/// <summary>Sets the description for a Shell link object. The description can be any application-defined string</summary>
void SetDescription([MarshalAs(UnmanagedType.LPWStr)] string pszName);
/// <summary>Retrieves the name of the working directory for a Shell link object</summary>
void GetWorkingDirectory([Out(), MarshalAs(UnmanagedType.LPWStr)] StringBuilder pszDir, int cchMaxPath);
/// <summary>Sets the name of the working directory for a Shell link object</summary>
void SetWorkingDirectory([MarshalAs(UnmanagedType.LPWStr)] string pszDir);
/// <summary>Retrieves the command-line arguments associated with a Shell link object</summary>
void GetArguments([Out(), MarshalAs(UnmanagedType.LPWStr)] StringBuilder pszArgs, int cchMaxPath);
/// <summary>Sets the command-line arguments for a Shell link object</summary>
void SetArguments([MarshalAs(UnmanagedType.LPWStr)] string pszArgs);
/// <summary>Retrieves the hot key for a Shell link object</summary>
void GetHotkey(out short pwHotkey);
/// <summary>Sets a hot key for a Shell link object</summary>
void SetHotkey(short wHotkey);
/// <summary>Retrieves the show command for a Shell link object</summary>
void GetShowCmd(out int piShowCmd);
/// <summary>Sets the show command for a Shell link object. The show command sets the initial show state of the window.</summary>
void SetShowCmd(int iShowCmd);
/// <summary>Retrieves the location (path and index) of the icon for a Shell link object</summary>
void GetIconLocation([Out(), MarshalAs(UnmanagedType.LPWStr)] StringBuilder pszIconPath,
int cchIconPath, out int piIcon);
/// <summary>Sets the location (path and index) of the icon for a Shell link object</summary>
void SetIconLocation([MarshalAs(UnmanagedType.LPWStr)] string pszIconPath, int iIcon);
/// <summary>Sets the relative path to the Shell link object</summary>
void SetRelativePath([MarshalAs(UnmanagedType.LPWStr)] string pszPathRel, int dwReserved);
/// <summary>Attempts to find the target of a Shell link, even if it has been moved or renamed</summary>
void Resolve(ref Accessibility._RemotableHandle hwnd, SLR_FLAGS fFlags);
/// <summary>Sets the path and file name of a Shell link object</summary>
void SetPath([MarshalAs(UnmanagedType.LPWStr)] string pszFile);
}
[ComImport(), Guid("00021401-0000-0000-C000-000000000046")] [ComImport(), Guid("00021401-0000-0000-C000-000000000046")]
public class ShellLink public class ShellLink
{ {
@ -102,29 +22,43 @@ namespace Flow.Launcher.Plugin.Program.Programs
public string arguments = string.Empty; public string arguments = string.Empty;
// Retrieve the target path using Shell Link // Retrieve the target path using Shell Link
public string retrieveTargetPath(string path) public unsafe string retrieveTargetPath(string path)
{ {
var link = new ShellLink(); var link = new ShellLink();
const int STGM_READ = 0; const int STGM_READ = 0;
((IPersistFile)link).Load(path, STGM_READ); ((IPersistFile)link).Load(path, STGM_READ);
var hwnd = new _RemotableHandle(); var hwnd = new HWND(IntPtr.Zero);
((IShellLinkW)link).Resolve(ref hwnd, 0); ((IShellLinkW)link).Resolve(hwnd, 0);
const int MAX_PATH = 260; const int MAX_PATH = 260;
StringBuilder buffer = new StringBuilder(MAX_PATH); Span<char> buffer = stackalloc char[MAX_PATH];
var data = new WIN32_FIND_DATAW(); var data = new WIN32_FIND_DATAW();
((IShellLinkW)link).GetPath(buffer, buffer.Capacity, ref data, SLGP_FLAGS.SLGP_SHORTPATH); var target = string.Empty;
var target = buffer.ToString(); try
{
fixed (char* bufferPtr = buffer)
{
((IShellLinkW)link).GetPath((PWSTR)bufferPtr, MAX_PATH, &data, (uint)SLGP_FLAGS.SLGP_SHORTPATH);
target = MemoryMarshal.CreateReadOnlySpanFromNullTerminated(bufferPtr).ToString();
}
}
catch (COMException e)
{
ProgramLogger.LogException($"|IShellLinkW|retrieveTargetPath|{path}" +
"|Error occurred while getting program arguments", e);
}
// To set the app description // To set the app description
if (!String.IsNullOrEmpty(target)) if (!string.IsNullOrEmpty(target))
{ {
try try
{ {
buffer = new StringBuilder(MAX_PATH); fixed (char* bufferPtr = buffer)
((IShellLinkW)link).GetDescription(buffer, MAX_PATH); {
description = buffer.ToString(); ((IShellLinkW)link).GetDescription(bufferPtr, MAX_PATH);
description = MemoryMarshal.CreateReadOnlySpanFromNullTerminated(bufferPtr).ToString();
}
} }
catch (COMException e) catch (COMException e)
{ {
@ -134,15 +68,17 @@ namespace Flow.Launcher.Plugin.Program.Programs
e); e);
} }
buffer.Clear(); fixed (char* bufferPtr = buffer)
((IShellLinkW)link).GetArguments(buffer, MAX_PATH); {
arguments = buffer.ToString(); ((IShellLinkW)link).GetArguments(bufferPtr, MAX_PATH);
arguments = MemoryMarshal.CreateReadOnlySpanFromNullTerminated(bufferPtr).ToString();
}
} }
// To release unmanaged memory // To release unmanaged memory
Marshal.ReleaseComObject(link); Marshal.ReleaseComObject(link);
return target; return target;
} }
} }
} }

View file

@ -1,8 +1,9 @@
using System; using System;
using System.IO; using System.IO;
using System.Runtime.InteropServices; using System.Runtime.InteropServices;
using System.Text; using Windows.Win32;
using Windows.Win32.Foundation;
using Windows.Win32.System.LibraryLoader;
namespace Flow.Launcher.Plugin.Program.Programs namespace Flow.Launcher.Plugin.Program.Programs
{ {
@ -13,51 +14,41 @@ namespace Flow.Launcher.Plugin.Program.Programs
/// </summary> /// </summary>
public static class ShellLocalization public static class ShellLocalization
{ {
internal const uint DONTRESOLVEDLLREFERENCES = 0x00000001;
internal const uint LOADLIBRARYASDATAFILE = 0x00000002;
[DllImport("shell32.dll", CallingConvention = CallingConvention.Winapi, CharSet = CharSet.Unicode)]
internal static extern int SHGetLocalizedName(string pszPath, StringBuilder pszResModule, ref int cch, out int pidsRes);
[DllImport("user32.dll", EntryPoint = "LoadStringW", CallingConvention = CallingConvention.Winapi, CharSet = CharSet.Unicode)]
internal static extern int LoadString(IntPtr hModule, int resourceID, StringBuilder resourceValue, int len);
[DllImport("kernel32.dll", CharSet = CharSet.Unicode, ExactSpelling = true, EntryPoint = "LoadLibraryExW")]
internal static extern IntPtr LoadLibraryEx(string lpFileName, IntPtr hFile, uint dwFlags);
[DllImport("kernel32.dll", ExactSpelling = true)]
internal static extern int FreeLibrary(IntPtr hModule);
[DllImport("kernel32.dll", EntryPoint = "ExpandEnvironmentStringsW", CharSet = CharSet.Unicode, ExactSpelling = true)]
internal static extern uint ExpandEnvironmentStrings(string lpSrc, StringBuilder lpDst, int nSize);
/// <summary> /// <summary>
/// Returns the localized name of a shell item. /// Returns the localized name of a shell item.
/// </summary> /// </summary>
/// <param name="path">Path to the shell item (e. g. shortcut 'File Explorer.lnk').</param> /// <param name="path">Path to the shell item (e. g. shortcut 'File Explorer.lnk').</param>
/// <returns>The localized name as string or <see cref="string.Empty"/>.</returns> /// <returns>The localized name as string or <see cref="string.Empty"/>.</returns>
public static string GetLocalizedName(string path) public static unsafe string GetLocalizedName(string path)
{ {
StringBuilder resourcePath = new StringBuilder(1024); const int capacity = 1024;
StringBuilder localizedName = new StringBuilder(1024); Span<char> buffer = new char[capacity];
int len, id;
len = resourcePath.Capacity;
// If there is no resource to localize a file name the method returns a non zero value. // If there is no resource to localize a file name the method returns a non zero value.
if (SHGetLocalizedName(path, resourcePath, ref len, out id) == 0) fixed (char* bufferPtr = buffer)
{ {
_ = ExpandEnvironmentStrings(resourcePath.ToString(), resourcePath, resourcePath.Capacity); var result = PInvoke.SHGetLocalizedName(path, bufferPtr, capacity, out var id);
IntPtr hMod = LoadLibraryEx(resourcePath.ToString(), IntPtr.Zero, DONTRESOLVEDLLREFERENCES | LOADLIBRARYASDATAFILE); if (result != HRESULT.S_OK)
if (hMod != IntPtr.Zero)
{ {
if (LoadString(hMod, id, localizedName, localizedName.Capacity) != 0) return string.Empty;
{ }
string lString = localizedName.ToString();
_ = FreeLibrary(hMod);
return lString;
}
_ = FreeLibrary(hMod); var resourcePathStr = MemoryMarshal.CreateReadOnlySpanFromNullTerminated(bufferPtr).ToString();
_ = PInvoke.ExpandEnvironmentStrings(resourcePathStr, bufferPtr, capacity);
using var handle = PInvoke.LoadLibraryEx(resourcePathStr,
LOAD_LIBRARY_FLAGS.DONT_RESOLVE_DLL_REFERENCES | LOAD_LIBRARY_FLAGS.LOAD_LIBRARY_AS_DATAFILE);
if (handle.IsInvalid)
{
return string.Empty;
}
// not sure about the behavior of Pinvoke.LoadString, so we clear the buffer before using it (so it must be a null-terminated string)
buffer.Clear();
if (PInvoke.LoadString(handle, (uint)id, bufferPtr, capacity) != 0)
{
var lString = MemoryMarshal.CreateReadOnlySpanFromNullTerminated(bufferPtr).ToString();
return lString;
} }
} }

View file

@ -0,0 +1,17 @@
<?xml version="1.0"?>
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:system="clr-namespace:System;assembly=mscorlib">
<system:String x:Key="flowlauncher_plugin_cmd_relace_winr">Replace Win+R</system:String>
<system:String x:Key="flowlauncher_plugin_cmd_close_cmd_after_press">Close Command Prompt after pressing any key</system:String>
<system:String x:Key="flowlauncher_plugin_cmd_press_any_key_to_close">Press any key to close this window...</system:String>
<system:String x:Key="flowlauncher_plugin_cmd_leave_cmd_open">Do not close Command Prompt after command execution</system:String>
<system:String x:Key="flowlauncher_plugin_cmd_always_run_as_administrator">Always run as administrator</system:String>
<system:String x:Key="flowlauncher_plugin_cmd_run_as_different_user">Run as different user</system:String>
<system:String x:Key="flowlauncher_plugin_cmd_plugin_name">Shell</system:String>
<system:String x:Key="flowlauncher_plugin_cmd_plugin_description">Allows to execute system commands from Flow Launcher</system:String>
<system:String x:Key="flowlauncher_plugin_cmd_cmd_has_been_executed_times">this command has been executed {0} times</system:String>
<system:String x:Key="flowlauncher_plugin_cmd_execute_through_shell">execute command through command shell</system:String>
<system:String x:Key="flowlauncher_plugin_cmd_run_as_administrator">Run As Administrator</system:String>
<system:String x:Key="flowlauncher_plugin_cmd_copy">Copy the command</system:String>
<system:String x:Key="flowlauncher_plugin_cmd_history">Only show number of most used commands:</system:String>
</ResourceDictionary>

View file

@ -6,7 +6,7 @@
<system:String x:Key="flowlauncher_plugin_cmd_press_any_key_to_close">Press any key to close this window...</system:String> <system:String x:Key="flowlauncher_plugin_cmd_press_any_key_to_close">Press any key to close this window...</system:String>
<system:String x:Key="flowlauncher_plugin_cmd_leave_cmd_open">Не закрывать командную строку после выполнения команды</system:String> <system:String x:Key="flowlauncher_plugin_cmd_leave_cmd_open">Не закрывать командную строку после выполнения команды</system:String>
<system:String x:Key="flowlauncher_plugin_cmd_always_run_as_administrator">Всегда запускать с правами администратора</system:String> <system:String x:Key="flowlauncher_plugin_cmd_always_run_as_administrator">Всегда запускать с правами администратора</system:String>
<system:String x:Key="flowlauncher_plugin_cmd_run_as_different_user">Run as different user</system:String> <system:String x:Key="flowlauncher_plugin_cmd_run_as_different_user">Запустить от имени другого пользователя</system:String>
<system:String x:Key="flowlauncher_plugin_cmd_plugin_name">Оболочка</system:String> <system:String x:Key="flowlauncher_plugin_cmd_plugin_name">Оболочка</system:String>
<system:String x:Key="flowlauncher_plugin_cmd_plugin_description">Allows to execute system commands from Flow Launcher</system:String> <system:String x:Key="flowlauncher_plugin_cmd_plugin_description">Allows to execute system commands from Flow Launcher</system:String>
<system:String x:Key="flowlauncher_plugin_cmd_cmd_has_been_executed_times">эта команда была выполнена {0} раз</system:String> <system:String x:Key="flowlauncher_plugin_cmd_cmd_has_been_executed_times">эта команда была выполнена {0} раз</system:String>

View file

@ -57,4 +57,11 @@
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None> </None>
</ItemGroup> </ItemGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Windows.CsWin32" Version="0.3.106">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
</ItemGroup>
</Project> </Project>

View file

@ -46,7 +46,7 @@
<system:String x:Key="flowlauncher_plugin_sys_check_for_update">Busca actualizaciones de Flow Launcher</system:String> <system:String x:Key="flowlauncher_plugin_sys_check_for_update">Busca actualizaciones de Flow Launcher</system:String>
<system:String x:Key="flowlauncher_plugin_sys_open_docs_tips">Accede a la documentación de Flow Launcher para más ayuda y consejos de uso</system:String> <system:String x:Key="flowlauncher_plugin_sys_open_docs_tips">Accede a la documentación de Flow Launcher para más ayuda y consejos de uso</system:String>
<system:String x:Key="flowlauncher_plugin_sys_open_userdata_location">Abre la ubicación donde se almacena la configuración de Flow Launcher</system:String> <system:String x:Key="flowlauncher_plugin_sys_open_userdata_location">Abre la ubicación donde se almacena la configuración de Flow Launcher</system:String>
<system:String x:Key="flowlauncher_plugin_sys_toggle_game_mode">Cambia a Modo Juego</system:String> <system:String x:Key="flowlauncher_plugin_sys_toggle_game_mode">Cambiar a Modo Juego</system:String>
<!-- Dialogs --> <!-- Dialogs -->
<system:String x:Key="flowlauncher_plugin_sys_dlgtitle_success">Correcto</system:String> <system:String x:Key="flowlauncher_plugin_sys_dlgtitle_success">Correcto</system:String>

View file

@ -0,0 +1,63 @@
<?xml version="1.0"?>
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:system="clr-namespace:System;assembly=mscorlib">
<!-- Command List -->
<system:String x:Key="flowlauncher_plugin_sys_command">Command</system:String>
<system:String x:Key="flowlauncher_plugin_sys_desc">Description</system:String>
<system:String x:Key="flowlauncher_plugin_sys_shutdown_computer_cmd">Shutdown</system:String>
<system:String x:Key="flowlauncher_plugin_sys_restart_computer_cmd">Restart</system:String>
<system:String x:Key="flowlauncher_plugin_sys_restart_advanced_cmd">Restart With Advanced Boot Options</system:String>
<system:String x:Key="flowlauncher_plugin_sys_log_off_cmd">Log Off/Sign Out</system:String>
<system:String x:Key="flowlauncher_plugin_sys_lock_cmd">Lock</system:String>
<system:String x:Key="flowlauncher_plugin_sys_sleep_cmd">Sleep</system:String>
<system:String x:Key="flowlauncher_plugin_sys_hibernate_cmd">Hibernate</system:String>
<system:String x:Key="flowlauncher_plugin_sys_indexoption_cmd">Index Option</system:String>
<system:String x:Key="flowlauncher_plugin_sys_emptyrecyclebin_cmd">Empty Recycle Bin</system:String>
<system:String x:Key="flowlauncher_plugin_sys_openrecyclebin_cmd">Open Recycle Bin</system:String>
<system:String x:Key="flowlauncher_plugin_sys_exit_cmd">יציאה</system:String>
<system:String x:Key="flowlauncher_plugin_sys_save_all_settings_cmd">Save Settings</system:String>
<system:String x:Key="flowlauncher_plugin_sys_restart_cmd">Restart Flow Launcher</system:String>
<system:String x:Key="flowlauncher_plugin_sys_setting_cmd">הגדרות</system:String>
<system:String x:Key="flowlauncher_plugin_sys_reload_plugin_data_cmd">Reload Plugin Data</system:String>
<system:String x:Key="flowlauncher_plugin_sys_check_for_update_cmd">Check For Update</system:String>
<system:String x:Key="flowlauncher_plugin_sys_open_log_location_cmd">Open Log Location</system:String>
<system:String x:Key="flowlauncher_plugin_sys_open_docs_tips_cmd">Flow Launcher Tips</system:String>
<system:String x:Key="flowlauncher_plugin_sys_open_userdata_location_cmd">Flow Launcher UserData Folder</system:String>
<system:String x:Key="flowlauncher_plugin_sys_toggle_game_mode_cmd">Toggle Game Mode</system:String>
<!-- Command Descriptions -->
<system:String x:Key="flowlauncher_plugin_sys_shutdown_computer">Shutdown Computer</system:String>
<system:String x:Key="flowlauncher_plugin_sys_restart_computer">Restart Computer</system:String>
<system:String x:Key="flowlauncher_plugin_sys_restart_advanced">Restart the computer with Advanced Boot Options for Safe and Debugging modes, as well as other options</system:String>
<system:String x:Key="flowlauncher_plugin_sys_log_off">Log off</system:String>
<system:String x:Key="flowlauncher_plugin_sys_lock">Lock this computer</system:String>
<system:String x:Key="flowlauncher_plugin_sys_exit">Close Flow Launcher</system:String>
<system:String x:Key="flowlauncher_plugin_sys_restart">Restart Flow Launcher</system:String>
<system:String x:Key="flowlauncher_plugin_sys_setting">Tweak Flow Launcher's settings</system:String>
<system:String x:Key="flowlauncher_plugin_sys_sleep">Put computer to sleep</system:String>
<system:String x:Key="flowlauncher_plugin_sys_emptyrecyclebin">Empty recycle bin</system:String>
<system:String x:Key="flowlauncher_plugin_sys_openrecyclebin">Open recycle bin</system:String>
<system:String x:Key="flowlauncher_plugin_sys_indexoption">Indexing Options</system:String>
<system:String x:Key="flowlauncher_plugin_sys_hibernate">Hibernate computer</system:String>
<system:String x:Key="flowlauncher_plugin_sys_save_all_settings">Save all Flow Launcher settings</system:String>
<system:String x:Key="flowlauncher_plugin_sys_reload_plugin_data">Refreshes plugin data with new content</system:String>
<system:String x:Key="flowlauncher_plugin_sys_open_log_location">Open Flow Launcher's log location</system:String>
<system:String x:Key="flowlauncher_plugin_sys_check_for_update">Check for new Flow Launcher update</system:String>
<system:String x:Key="flowlauncher_plugin_sys_open_docs_tips">Visit Flow Launcher's documentation for more help and how to use tips</system:String>
<system:String x:Key="flowlauncher_plugin_sys_open_userdata_location">Open the location where Flow Launcher's settings are stored</system:String>
<system:String x:Key="flowlauncher_plugin_sys_toggle_game_mode">Toggle Game Mode</system:String>
<!-- Dialogs -->
<system:String x:Key="flowlauncher_plugin_sys_dlgtitle_success">הצליח</system:String>
<system:String x:Key="flowlauncher_plugin_sys_dlgtext_all_settings_saved">All Flow Launcher settings saved</system:String>
<system:String x:Key="flowlauncher_plugin_sys_dlgtext_all_applicableplugins_reloaded">Reloaded all applicable plugin data</system:String>
<system:String x:Key="flowlauncher_plugin_sys_dlgtext_shutdown_computer">Are you sure you want to shut the computer down?</system:String>
<system:String x:Key="flowlauncher_plugin_sys_dlgtext_restart_computer">Are you sure you want to restart the computer?</system:String>
<system:String x:Key="flowlauncher_plugin_sys_dlgtext_restart_computer_advanced">Are you sure you want to restart the computer with Advanced Boot Options?</system:String>
<system:String x:Key="flowlauncher_plugin_sys_dlgtext_logoff_computer">Are you sure you want to log off?</system:String>
<system:String x:Key="flowlauncher_plugin_sys_plugin_name">System Commands</system:String>
<system:String x:Key="flowlauncher_plugin_sys_plugin_description">Provides System related commands. e.g. shutdown, lock, settings etc.</system:String>
</ResourceDictionary>

View file

@ -2,17 +2,16 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.Diagnostics; using System.Diagnostics;
using System.IO; using System.IO;
using System.Runtime.InteropServices;
using System.Windows; using System.Windows;
using System.Windows.Forms;
using System.Windows.Interop;
using Flow.Launcher.Infrastructure; using Flow.Launcher.Infrastructure;
using Flow.Launcher.Infrastructure.Logger; using Flow.Launcher.Infrastructure.Logger;
using Flow.Launcher.Infrastructure.UserSettings; using Flow.Launcher.Infrastructure.UserSettings;
using Flow.Launcher.Plugin.SharedCommands; using Flow.Launcher.Plugin.SharedCommands;
using Windows.Win32;
using Windows.Win32.Foundation;
using Windows.Win32.System.Shutdown;
using Application = System.Windows.Application; using Application = System.Windows.Application;
using Control = System.Windows.Controls.Control; using Control = System.Windows.Controls.Control;
using FormsApplication = System.Windows.Forms.Application;
namespace Flow.Launcher.Plugin.Sys namespace Flow.Launcher.Plugin.Sys
{ {
@ -21,33 +20,6 @@ namespace Flow.Launcher.Plugin.Sys
private PluginInitContext context; private PluginInitContext context;
private Dictionary<string, string> KeywordTitleMappings = new Dictionary<string, string>(); private Dictionary<string, string> KeywordTitleMappings = new Dictionary<string, string>();
#region DllImport
internal const int EWX_LOGOFF = 0x00000000;
internal const int EWX_SHUTDOWN = 0x00000001;
internal const int EWX_REBOOT = 0x00000002;
internal const int EWX_FORCE = 0x00000004;
internal const int EWX_POWEROFF = 0x00000008;
internal const int EWX_FORCEIFHUNG = 0x00000010;
[DllImport("user32")]
private static extern bool ExitWindowsEx(uint uFlags, uint dwReason);
[DllImport("user32")]
private static extern void LockWorkStation();
[DllImport("Shell32.dll", CharSet = CharSet.Unicode)]
private static extern uint SHEmptyRecycleBin(IntPtr hWnd, uint dwFlags);
// http://www.pinvoke.net/default.aspx/Enums/HRESULT.html
private enum HRESULT : uint
{
S_FALSE = 0x0001,
S_OK = 0x0000
}
#endregion
public Control CreateSettingPanel() public Control CreateSettingPanel()
{ {
var results = Commands(); var results = Commands();
@ -209,7 +181,7 @@ namespace Flow.Launcher.Plugin.Sys
MessageBoxButton.YesNo, MessageBoxImage.Warning); MessageBoxButton.YesNo, MessageBoxImage.Warning);
if (result == MessageBoxResult.Yes) if (result == MessageBoxResult.Yes)
ExitWindowsEx(EWX_LOGOFF, 0); PInvoke.ExitWindowsEx(EXIT_WINDOWS_FLAGS.EWX_LOGOFF, 0);
return true; return true;
} }
@ -222,7 +194,7 @@ namespace Flow.Launcher.Plugin.Sys
IcoPath = "Images\\lock.png", IcoPath = "Images\\lock.png",
Action = c => Action = c =>
{ {
LockWorkStation(); PInvoke.LockWorkStation();
return true; return true;
} }
}, },
@ -232,7 +204,7 @@ namespace Flow.Launcher.Plugin.Sys
SubTitle = context.API.GetTranslation("flowlauncher_plugin_sys_sleep"), SubTitle = context.API.GetTranslation("flowlauncher_plugin_sys_sleep"),
Glyph = new GlyphInfo (FontFamily:"/Resources/#Segoe Fluent Icons", Glyph:"\xec46"), Glyph = new GlyphInfo (FontFamily:"/Resources/#Segoe Fluent Icons", Glyph:"\xec46"),
IcoPath = "Images\\sleep.png", IcoPath = "Images\\sleep.png",
Action = c => FormsApplication.SetSuspendState(PowerState.Suspend, false, false) Action = c => PInvoke.SetSuspendState(false, false, false)
}, },
new Result new Result
{ {
@ -277,11 +249,13 @@ namespace Flow.Launcher.Plugin.Sys
// http://www.pinvoke.net/default.aspx/shell32/SHEmptyRecycleBin.html // http://www.pinvoke.net/default.aspx/shell32/SHEmptyRecycleBin.html
// FYI, couldn't find documentation for this but if the recycle bin is already empty, it will return -2147418113 (0x8000FFFF (E_UNEXPECTED)) // FYI, couldn't find documentation for this but if the recycle bin is already empty, it will return -2147418113 (0x8000FFFF (E_UNEXPECTED))
// 0 for nothing // 0 for nothing
var result = SHEmptyRecycleBin(new WindowInteropHelper(Application.Current.MainWindow).Handle, 0); var result = PInvoke.SHEmptyRecycleBin(new(), string.Empty, 0);
if (result != (uint) HRESULT.S_OK && result != (uint) 0x8000FFFF) if (result != HRESULT.S_OK && result != HRESULT.E_UNEXPECTED)
{ {
context.API.ShowMsgBox($"Error emptying recycle bin, error code: {result}\n" + context.API.ShowMsgBox("Failed to empty the recycle bin. This might happen if:\n" +
"please refer to https://msdn.microsoft.com/en-us/library/windows/desktop/aa378137", "- A file in the recycle bin is in use\n" +
"- You don't have permission to delete some items\n" +
"Please close any applications that might be using these files and try again.",
"Error", "Error",
MessageBoxButton.OK, MessageBoxImage.Error); MessageBoxButton.OK, MessageBoxImage.Error);
} }

View file

@ -0,0 +1,6 @@
ExitWindowsEx
LockWorkStation
SHEmptyRecycleBin
S_OK
E_UNEXPECTED
SetSuspendState

View file

@ -5,13 +5,13 @@
<system:String x:Key="flowlauncher_plugin_new_window">Neues Fenster</system:String> <system:String x:Key="flowlauncher_plugin_new_window">Neues Fenster</system:String>
<system:String x:Key="flowlauncher_plugin_new_tab">Neuer Tab</system:String> <system:String x:Key="flowlauncher_plugin_new_tab">Neuer Tab</system:String>
<system:String x:Key="flowlauncher_plugin_url_open_url">Öffne URL:{0}</system:String> <system:String x:Key="flowlauncher_plugin_url_open_url">URL öffnen: {0}</system:String>
<system:String x:Key="flowlauncher_plugin_url_cannot_open_url">Kann URL nicht öffnen:{0}</system:String> <system:String x:Key="flowlauncher_plugin_url_cannot_open_url">URL kann nicht geöffnet werden: {0}</system:String>
<system:String x:Key="flowlauncher_plugin_url_plugin_name">URL</system:String> <system:String x:Key="flowlauncher_plugin_url_plugin_name">URL</system:String>
<system:String x:Key="flowlauncher_plugin_url_plugin_description">Öffne eine eingegebene URL mit Flow Launcher</system:String> <system:String x:Key="flowlauncher_plugin_url_plugin_description">Öffnen Sie die eingetippte URL in Flow Launcher</system:String>
<system:String x:Key="flowlauncher_plugin_url_plugin_set_tip">Bitte legen Sie Ihren Browser-Pfad fest:</system:String> <system:String x:Key="flowlauncher_plugin_url_plugin_set_tip">Bitte legen Sie Ihren Browser-Pfad fest:</system:String>
<system:String x:Key="flowlauncher_plugin_url_plugin_choose">Auswählen</system:String> <system:String x:Key="flowlauncher_plugin_url_plugin_choose">Wählen</system:String>
<system:String x:Key="flowlauncher_plugin_url_plugin_filter">URL öffnen: {0}</system:String> <system:String x:Key="flowlauncher_plugin_url_plugin_filter">Anwendung (*.exe)|*.exe|Alle Dateien|*.*</system:String>
</ResourceDictionary> </ResourceDictionary>

View file

@ -0,0 +1,17 @@
<?xml version="1.0"?>
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:system="clr-namespace:System;assembly=mscorlib">
<system:String x:Key="flowlauncher_plugin_url_open_search_in">Open search in:</system:String>
<system:String x:Key="flowlauncher_plugin_new_window">New Window</system:String>
<system:String x:Key="flowlauncher_plugin_new_tab">New Tab</system:String>
<system:String x:Key="flowlauncher_plugin_url_open_url">Open url:{0}</system:String>
<system:String x:Key="flowlauncher_plugin_url_cannot_open_url">Can't open url:{0}</system:String>
<system:String x:Key="flowlauncher_plugin_url_plugin_name">URL</system:String>
<system:String x:Key="flowlauncher_plugin_url_plugin_description">Open the typed URL from Flow Launcher</system:String>
<system:String x:Key="flowlauncher_plugin_url_plugin_set_tip">Please set your browser path:</system:String>
<system:String x:Key="flowlauncher_plugin_url_plugin_choose">Choose</system:String>
<system:String x:Key="flowlauncher_plugin_url_plugin_filter">Application(*.exe)|*.exe|All files|*.*</system:String>
</ResourceDictionary>

View file

@ -29,7 +29,8 @@
وبالتالي، فإن الصيغة العامة للبحث على نتفليكس هي https://www.netflix.com/search?q={q} وبالتالي، فإن الصيغة العامة للبحث على نتفليكس هي https://www.netflix.com/search?q={q}
</system:String> </system:String>
<system:String x:Key="flowlauncher_plugin_websearch_copyurl_title">Copy URL</system:String>
<system:String x:Key="flowlauncher_plugin_websearch_copyurl_subtitle">Copy search URL to clipboard</system:String>
<!-- web search edit --> <!-- web search edit -->
<system:String x:Key="flowlauncher_plugin_websearch_title">العنوان</system:String> <system:String x:Key="flowlauncher_plugin_websearch_title">العنوان</system:String>

View file

@ -29,7 +29,8 @@
Obecný vzorec pro vyhledávání Netflixu je tedy https://www.netflix.com/search?q={q} Obecný vzorec pro vyhledávání Netflixu je tedy https://www.netflix.com/search?q={q}
</system:String> </system:String>
<system:String x:Key="flowlauncher_plugin_websearch_copyurl_title">Copy URL</system:String>
<system:String x:Key="flowlauncher_plugin_websearch_copyurl_subtitle">Copy search URL to clipboard</system:String>
<!-- web search edit --> <!-- web search edit -->
<system:String x:Key="flowlauncher_plugin_websearch_title">Název</system:String> <system:String x:Key="flowlauncher_plugin_websearch_title">Název</system:String>

View file

@ -29,7 +29,8 @@
Thus, the generic formula for a search on Netflix is https://www.netflix.com/search?q={q} Thus, the generic formula for a search on Netflix is https://www.netflix.com/search?q={q}
</system:String> </system:String>
<system:String x:Key="flowlauncher_plugin_websearch_copyurl_title">Copy URL</system:String>
<system:String x:Key="flowlauncher_plugin_websearch_copyurl_subtitle">Copy search URL to clipboard</system:String>
<!-- web search edit --> <!-- web search edit -->
<system:String x:Key="flowlauncher_plugin_websearch_title">Title</system:String> <system:String x:Key="flowlauncher_plugin_websearch_title">Title</system:String>

View file

@ -6,7 +6,7 @@
<system:String x:Key="flowlauncher_plugin_websearch_new_window">Neues Fenster</system:String> <system:String x:Key="flowlauncher_plugin_websearch_new_window">Neues Fenster</system:String>
<system:String x:Key="flowlauncher_plugin_websearch_new_tab">Neuer Tab</system:String> <system:String x:Key="flowlauncher_plugin_websearch_new_tab">Neuer Tab</system:String>
<system:String x:Key="flowlaucnher_plugin_websearch_set_browser_path">Browser aus Pfad festlegen:</system:String> <system:String x:Key="flowlaucnher_plugin_websearch_set_browser_path">Browser aus Pfad festlegen:</system:String>
<system:String x:Key="flowlauncher_plugin_websearch_choose">Auswählen</system:String> <system:String x:Key="flowlauncher_plugin_websearch_choose">Wählen</system:String>
<system:String x:Key="flowlauncher_plugin_websearch_delete">Löschen</system:String> <system:String x:Key="flowlauncher_plugin_websearch_delete">Löschen</system:String>
<system:String x:Key="flowlauncher_plugin_websearch_edit">Bearbeiten</system:String> <system:String x:Key="flowlauncher_plugin_websearch_edit">Bearbeiten</system:String>
<system:String x:Key="flowlauncher_plugin_websearch_add">Hinzufügen</system:String> <system:String x:Key="flowlauncher_plugin_websearch_add">Hinzufügen</system:String>
@ -19,7 +19,7 @@
<system:String x:Key="flowlauncher_plugin_websearch_search">Suche</system:String> <system:String x:Key="flowlauncher_plugin_websearch_search">Suche</system:String>
<system:String x:Key="flowlauncher_plugin_websearch_enable_suggestion">Autovervollständigung von Suchanfragen verwenden:</system:String> <system:String x:Key="flowlauncher_plugin_websearch_enable_suggestion">Autovervollständigung von Suchanfragen verwenden:</system:String>
<system:String x:Key="flowlauncher_plugin_websearch_enable_suggestion_provider">Daten automatisch vervollständigen aus:</system:String> <system:String x:Key="flowlauncher_plugin_websearch_enable_suggestion_provider">Daten automatisch vervollständigen aus:</system:String>
<system:String x:Key="flowlauncher_plugin_websearch_pls_select_web_search">Bitte wähle einen Suchdienst</system:String> <system:String x:Key="flowlauncher_plugin_websearch_pls_select_web_search">Bitte wählen Sie eine Websuche aus</system:String>
<system:String x:Key="flowlauncher_plugin_websearch_delete_warning">Sind Sie sicher, dass Sie {0} löschen wollen?</system:String> <system:String x:Key="flowlauncher_plugin_websearch_delete_warning">Sind Sie sicher, dass Sie {0} löschen wollen?</system:String>
<system:String x:Key="flowlauncher_plugin_websearch_guide_1">Wenn Sie Flow eine Suche nach einer bestimmten Website hinzufügen möchten, geben Sie zunächst eine Dummy-Textzeichenfolge in die Suchleiste dieser Website ein und starten Sie die Suche. Kopieren Sie jetzt den Inhalt der Adressleiste des Browsers und fügen Sie ihn in das URL-Feld unten ein. Ersetzen Sie Ihre Testzeichenfolge durch {q}. Zum Beispiel, wenn Sie auf Netflix nach casino suchen, steht in der Adressleiste</system:String> <system:String x:Key="flowlauncher_plugin_websearch_guide_1">Wenn Sie Flow eine Suche nach einer bestimmten Website hinzufügen möchten, geben Sie zunächst eine Dummy-Textzeichenfolge in die Suchleiste dieser Website ein und starten Sie die Suche. Kopieren Sie jetzt den Inhalt der Adressleiste des Browsers und fügen Sie ihn in das URL-Feld unten ein. Ersetzen Sie Ihre Testzeichenfolge durch {q}. Zum Beispiel, wenn Sie auf Netflix nach casino suchen, steht in der Adressleiste</system:String>
<system:String x:Key="flowlauncher_plugin_websearch_guide_2">https://www.netflix.com/search?q=Casino</system:String> <system:String x:Key="flowlauncher_plugin_websearch_guide_2">https://www.netflix.com/search?q=Casino</system:String>
@ -30,23 +30,24 @@
https://www.netflix.com/search?q={q} https://www.netflix.com/search?q={q}
</system:String> </system:String>
<system:String x:Key="flowlauncher_plugin_websearch_copyurl_title">Copy URL</system:String>
<system:String x:Key="flowlauncher_plugin_websearch_copyurl_subtitle">Copy search URL to clipboard</system:String>
<!-- web search edit --> <!-- web search edit -->
<system:String x:Key="flowlauncher_plugin_websearch_title">Titel</system:String> <system:String x:Key="flowlauncher_plugin_websearch_title">Titel</system:String>
<system:String x:Key="flowlauncher_plugin_websearch_enable">Status</system:String> <system:String x:Key="flowlauncher_plugin_websearch_enable">Status</system:String>
<system:String x:Key="flowlauncher_plugin_websearch_select_icon">Wähle Symbol</system:String> <system:String x:Key="flowlauncher_plugin_websearch_select_icon">Icon auswählen</system:String>
<system:String x:Key="flowlauncher_plugin_websearch_icon">Symbol</system:String> <system:String x:Key="flowlauncher_plugin_websearch_icon">Icon</system:String>
<system:String x:Key="flowlauncher_plugin_websearch_cancel">Abbrechen</system:String> <system:String x:Key="flowlauncher_plugin_websearch_cancel">Abbrechen</system:String>
<system:String x:Key="flowlauncher_plugin_websearch_invalid_web_search">Ungültige Internetsuche</system:String> <system:String x:Key="flowlauncher_plugin_websearch_invalid_web_search">Ungültige Websuche</system:String>
<system:String x:Key="flowlauncher_plugin_websearch_input_title">Bitte Titel eingeben</system:String> <system:String x:Key="flowlauncher_plugin_websearch_input_title">Bitte geben Sie einen Titel ein</system:String>
<system:String x:Key="flowlauncher_plugin_websearch_input_action_keyword">Aktions-Schlüsselwort ist bereits vorhanden. Bitte geben Sie ein anderes ein.</system:String> <system:String x:Key="flowlauncher_plugin_websearch_input_action_keyword">Bitte geben Sie ein Aktions-Schlüsselwort ein</system:String>
<system:String x:Key="flowlauncher_plugin_websearch_input_url">Bitte URL eingeben</system:String> <system:String x:Key="flowlauncher_plugin_websearch_input_url">Bitte geben Sie eine URL ein</system:String>
<system:String x:Key="flowlauncher_plugin_websearch_action_keyword_exist">Aktionsschlüsselwort existiert bereits. Bitte gebe ein anderes ein.</system:String> <system:String x:Key="flowlauncher_plugin_websearch_action_keyword_exist">Aktions-Schlüsselwort ist bereits vorhanden. Bitte geben Sie ein anderes ein</system:String>
<system:String x:Key="flowlauncher_plugin_websearch_succeed">Erfolg</system:String> <system:String x:Key="flowlauncher_plugin_websearch_succeed">Erfolg</system:String>
<system:String x:Key="flowlauncher_plugin_websearch_iconpath_hint">Hinweis: Sie müssen keine benutzerdefinierten Bilder in diesem Verzeichnis ablegen, wenn die Version von Flow aktualisiert wird, gehen diese verloren. Flow kopiert automatisch jegliche Bilder außerhalb dieses Verzeichnisses herüber in den benutzerdefinierten Bildspeicherort von WebSearch.</system:String> <system:String x:Key="flowlauncher_plugin_websearch_iconpath_hint">Hinweis: Sie müssen keine benutzerdefinierten Bilder in diesem Verzeichnis ablegen, wenn die Version von Flow aktualisiert wird, gehen diese verloren. Flow kopiert automatisch jegliche Bilder außerhalb dieses Verzeichnisses herüber in den benutzerdefinierten Bildspeicherort von WebSearch.</system:String>
<system:String x:Key="flowlauncher_plugin_websearch_plugin_name">Internetsuche</system:String> <system:String x:Key="flowlauncher_plugin_websearch_plugin_name">Web-Suchen</system:String>
<system:String x:Key="flowlauncher_plugin_websearch_plugin_description">Ermöglicht die Durchführung von Web-Suchen</system:String> <system:String x:Key="flowlauncher_plugin_websearch_plugin_description">Ermöglicht die Durchführung von Web-Suchen</system:String>
</ResourceDictionary> </ResourceDictionary>

View file

@ -29,7 +29,8 @@
Thus, the generic formula for a search on Netflix is https://www.netflix.com/search?q={q} Thus, the generic formula for a search on Netflix is https://www.netflix.com/search?q={q}
</system:String> </system:String>
<system:String x:Key="flowlauncher_plugin_websearch_copyurl_title">Copy URL</system:String>
<system:String x:Key="flowlauncher_plugin_websearch_copyurl_subtitle">Copy search URL to clipboard</system:String>
<!-- web search edit --> <!-- web search edit -->
<system:String x:Key="flowlauncher_plugin_websearch_title">Título</system:String> <system:String x:Key="flowlauncher_plugin_websearch_title">Título</system:String>

View file

@ -29,7 +29,8 @@
De esta manera, la fórmula genérica para una búsqueda en Netflix será https://www.netflix.com/search?q={q} De esta manera, la fórmula genérica para una búsqueda en Netflix será https://www.netflix.com/search?q={q}
</system:String> </system:String>
<system:String x:Key="flowlauncher_plugin_websearch_copyurl_title">Copiar URL</system:String>
<system:String x:Key="flowlauncher_plugin_websearch_copyurl_subtitle">Copiar URL de búsqueda al portapapeles</system:String>
<!-- web search edit --> <!-- web search edit -->
<system:String x:Key="flowlauncher_plugin_websearch_title">Título</system:String> <system:String x:Key="flowlauncher_plugin_websearch_title">Título</system:String>

View file

@ -29,7 +29,8 @@
Ainsi, la formule générique pour une recherche Netflix est https://www.netflix.com/search?q={q} Ainsi, la formule générique pour une recherche Netflix est https://www.netflix.com/search?q={q}
</system:String> </system:String>
<system:String x:Key="flowlauncher_plugin_websearch_copyurl_title">Copier l'URL</system:String>
<system:String x:Key="flowlauncher_plugin_websearch_copyurl_subtitle">Copier l'URL de la recherche dans le presse-papiers</system:String>
<!-- web search edit --> <!-- web search edit -->
<system:String x:Key="flowlauncher_plugin_websearch_title">Titre</system:String> <system:String x:Key="flowlauncher_plugin_websearch_title">Titre</system:String>
@ -45,7 +46,7 @@
<system:String x:Key="flowlauncher_plugin_websearch_succeed">Ajout</system:String> <system:String x:Key="flowlauncher_plugin_websearch_succeed">Ajout</system:String>
<system:String x:Key="flowlauncher_plugin_websearch_iconpath_hint">Astuce : Vous n'avez pas besoin de placer des images personnalisées dans ce dossier, si la version de Flow est mise à jour, elles seront perdues. Flow copiera automatiquement toutes les images en dehors de ce dossier dans l'emplacement de l'image personnalisée de la Recherche Web.</system:String> <system:String x:Key="flowlauncher_plugin_websearch_iconpath_hint">Astuce : Vous n'avez pas besoin de placer des images personnalisées dans ce dossier, si la version de Flow est mise à jour, elles seront perdues. Flow copiera automatiquement toutes les images en dehors de ce dossier dans l'emplacement de l'image personnalisée de la Recherche Web.</system:String>
<system:String x:Key="flowlauncher_plugin_websearch_plugin_name">Recherches Web</system:String> <system:String x:Key="flowlauncher_plugin_websearch_plugin_name">Recherches web</system:String>
<system:String x:Key="flowlauncher_plugin_websearch_plugin_description">Permet d'effectuer des recherches web</system:String> <system:String x:Key="flowlauncher_plugin_websearch_plugin_description">Permet d'effectuer des recherches web</system:String>
</ResourceDictionary> </ResourceDictionary>

View file

@ -0,0 +1,52 @@
<?xml version="1.0"?>
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:system="clr-namespace:System;assembly=mscorlib">
<system:String x:Key="flowlauncher_plugin_websearch_window_title">Search Source Setting</system:String>
<system:String x:Key="flowlauncher_plugin_websearch_open_search_in">Open search in:</system:String>
<system:String x:Key="flowlauncher_plugin_websearch_new_window">New Window</system:String>
<system:String x:Key="flowlauncher_plugin_websearch_new_tab">New Tab</system:String>
<system:String x:Key="flowlaucnher_plugin_websearch_set_browser_path">Set browser from path:</system:String>
<system:String x:Key="flowlauncher_plugin_websearch_choose">Choose</system:String>
<system:String x:Key="flowlauncher_plugin_websearch_delete">מחק</system:String>
<system:String x:Key="flowlauncher_plugin_websearch_edit">ערוך</system:String>
<system:String x:Key="flowlauncher_plugin_websearch_add">הוסף</system:String>
<system:String x:Key="flowlauncher_plugin_websearch_enabled_label">Enabled</system:String>
<system:String x:Key="flowlauncher_plugin_websearch_true">Enabled</system:String>
<system:String x:Key="flowlauncher_plugin_websearch_false">Disabled</system:String>
<system:String x:Key="flowlauncher_plugin_websearch_confirm">Confirm</system:String>
<system:String x:Key="flowlauncher_plugin_websearch_action_keyword">Action Keyword</system:String>
<system:String x:Key="flowlauncher_plugin_websearch_url">URL</system:String>
<system:String x:Key="flowlauncher_plugin_websearch_search">Search</system:String>
<system:String x:Key="flowlauncher_plugin_websearch_enable_suggestion">Use Search Query Autocomplete:</system:String>
<system:String x:Key="flowlauncher_plugin_websearch_enable_suggestion_provider">Autocomplete Data from:</system:String>
<system:String x:Key="flowlauncher_plugin_websearch_pls_select_web_search">Please select a web search</system:String>
<system:String x:Key="flowlauncher_plugin_websearch_delete_warning">Are you sure you want to delete {0}?</system:String>
<system:String x:Key="flowlauncher_plugin_websearch_guide_1">If you want to add a search for a particular website to Flow, first enter a dummy text string in the search bar of that website, and launch the search. Now copy the contents of the browser's address bar, and paste it in the URL field below. Replace your test string with {q}. For example, if you search for casino on Netflix, its address bar reads</system:String>
<system:String x:Key="flowlauncher_plugin_websearch_guide_2">https://www.netflix.com/search?q=Casino</system:String>
<system:String x:Key="flowlauncher_plugin_websearch_guide_3">
Now copy this entire string and paste it in the URL field below.
Then replace casino with {q}.
Thus, the generic formula for a search on Netflix is https://www.netflix.com/search?q={q}
</system:String>
<system:String x:Key="flowlauncher_plugin_websearch_copyurl_title">Copy URL</system:String>
<system:String x:Key="flowlauncher_plugin_websearch_copyurl_subtitle">Copy search URL to clipboard</system:String>
<!-- web search edit -->
<system:String x:Key="flowlauncher_plugin_websearch_title">Title</system:String>
<system:String x:Key="flowlauncher_plugin_websearch_enable">Status</system:String>
<system:String x:Key="flowlauncher_plugin_websearch_select_icon">Select Icon</system:String>
<system:String x:Key="flowlauncher_plugin_websearch_icon">Icon</system:String>
<system:String x:Key="flowlauncher_plugin_websearch_cancel">ביטול</system:String>
<system:String x:Key="flowlauncher_plugin_websearch_invalid_web_search">Invalid web search</system:String>
<system:String x:Key="flowlauncher_plugin_websearch_input_title">Please enter a title</system:String>
<system:String x:Key="flowlauncher_plugin_websearch_input_action_keyword">Please enter an action keyword</system:String>
<system:String x:Key="flowlauncher_plugin_websearch_input_url">Please enter a URL</system:String>
<system:String x:Key="flowlauncher_plugin_websearch_action_keyword_exist">Action keyword already exists, please enter a different one</system:String>
<system:String x:Key="flowlauncher_plugin_websearch_succeed">הצליח</system:String>
<system:String x:Key="flowlauncher_plugin_websearch_iconpath_hint">Hint: You do not need to place custom images in this directory, if Flow's version is updated they will be lost. Flow will automatically copy any images outside of this directory across to WebSearch's custom image location.</system:String>
<system:String x:Key="flowlauncher_plugin_websearch_plugin_name">Web Searches</system:String>
<system:String x:Key="flowlauncher_plugin_websearch_plugin_description">Allows to perform web searches</system:String>
</ResourceDictionary>

View file

@ -29,7 +29,8 @@
Così la formula generica per una ricerca su Netflix è https://www.netflix.com/search?q={q} Così la formula generica per una ricerca su Netflix è https://www.netflix.com/search?q={q}
</system:String> </system:String>
<system:String x:Key="flowlauncher_plugin_websearch_copyurl_title">Copy URL</system:String>
<system:String x:Key="flowlauncher_plugin_websearch_copyurl_subtitle">Copy search URL to clipboard</system:String>
<!-- web search edit --> <!-- web search edit -->
<system:String x:Key="flowlauncher_plugin_websearch_title">Titolo</system:String> <system:String x:Key="flowlauncher_plugin_websearch_title">Titolo</system:String>

View file

@ -29,7 +29,8 @@
Thus, the generic formula for a search on Netflix is https://www.netflix.com/search?q={q} Thus, the generic formula for a search on Netflix is https://www.netflix.com/search?q={q}
</system:String> </system:String>
<system:String x:Key="flowlauncher_plugin_websearch_copyurl_title">Copy URL</system:String>
<system:String x:Key="flowlauncher_plugin_websearch_copyurl_subtitle">Copy search URL to clipboard</system:String>
<!-- web search edit --> <!-- web search edit -->
<system:String x:Key="flowlauncher_plugin_websearch_title">タイトル</system:String> <system:String x:Key="flowlauncher_plugin_websearch_title">タイトル</system:String>

View file

@ -29,7 +29,8 @@
Thus, the generic formula for a search on Netflix is https://www.netflix.com/search?q={q} Thus, the generic formula for a search on Netflix is https://www.netflix.com/search?q={q}
</system:String> </system:String>
<system:String x:Key="flowlauncher_plugin_websearch_copyurl_title">Copy URL</system:String>
<system:String x:Key="flowlauncher_plugin_websearch_copyurl_subtitle">Copy search URL to clipboard</system:String>
<!-- web search edit --> <!-- web search edit -->
<system:String x:Key="flowlauncher_plugin_websearch_title">이름</system:String> <system:String x:Key="flowlauncher_plugin_websearch_title">이름</system:String>

View file

@ -29,7 +29,8 @@
dvs. den generiske formelen for et søk på Netflix er https://www.netflix.com/search?q={q} dvs. den generiske formelen for et søk på Netflix er https://www.netflix.com/search?q={q}
</system:String> </system:String>
<system:String x:Key="flowlauncher_plugin_websearch_copyurl_title">Copy URL</system:String>
<system:String x:Key="flowlauncher_plugin_websearch_copyurl_subtitle">Copy search URL to clipboard</system:String>
<!-- web search edit --> <!-- web search edit -->
<system:String x:Key="flowlauncher_plugin_websearch_title">Tittel</system:String> <system:String x:Key="flowlauncher_plugin_websearch_title">Tittel</system:String>

View file

@ -29,7 +29,8 @@
Thus, the generic formula for a search on Netflix is https://www.netflix.com/search?q={q} Thus, the generic formula for a search on Netflix is https://www.netflix.com/search?q={q}
</system:String> </system:String>
<system:String x:Key="flowlauncher_plugin_websearch_copyurl_title">URL kopiëren</system:String>
<system:String x:Key="flowlauncher_plugin_websearch_copyurl_subtitle">Zoek-URL kopiëren naar klembord</system:String>
<!-- web search edit --> <!-- web search edit -->
<system:String x:Key="flowlauncher_plugin_websearch_title">Title</system:String> <system:String x:Key="flowlauncher_plugin_websearch_title">Title</system:String>

View file

@ -29,7 +29,8 @@
W ten sposób ogólna formuła wyszukiwania na Netflix to https://www.netflix.com/search?q={q} W ten sposób ogólna formuła wyszukiwania na Netflix to https://www.netflix.com/search?q={q}
</system:String> </system:String>
<system:String x:Key="flowlauncher_plugin_websearch_copyurl_title">Copy URL</system:String>
<system:String x:Key="flowlauncher_plugin_websearch_copyurl_subtitle">Copy search URL to clipboard</system:String>
<!-- web search edit --> <!-- web search edit -->
<system:String x:Key="flowlauncher_plugin_websearch_title">Tytuł</system:String> <system:String x:Key="flowlauncher_plugin_websearch_title">Tytuł</system:String>

View file

@ -29,7 +29,8 @@
Thus, the generic formula for a search on Netflix is https://www.netflix.com/search?q={q} Thus, the generic formula for a search on Netflix is https://www.netflix.com/search?q={q}
</system:String> </system:String>
<system:String x:Key="flowlauncher_plugin_websearch_copyurl_title">Copy URL</system:String>
<system:String x:Key="flowlauncher_plugin_websearch_copyurl_subtitle">Copy search URL to clipboard</system:String>
<!-- web search edit --> <!-- web search edit -->
<system:String x:Key="flowlauncher_plugin_websearch_title">Title</system:String> <system:String x:Key="flowlauncher_plugin_websearch_title">Title</system:String>

View file

@ -29,7 +29,8 @@
Assim, a fórmula genérica de uma pesquisa na Netflix é https://www.netflix.com/search?q={q} Assim, a fórmula genérica de uma pesquisa na Netflix é https://www.netflix.com/search?q={q}
</system:String> </system:String>
<system:String x:Key="flowlauncher_plugin_websearch_copyurl_title">Copiar URL</system:String>
<system:String x:Key="flowlauncher_plugin_websearch_copyurl_subtitle">Copiar URL para a área de transferência</system:String>
<!-- web search edit --> <!-- web search edit -->
<system:String x:Key="flowlauncher_plugin_websearch_title">Título</system:String> <system:String x:Key="flowlauncher_plugin_websearch_title">Título</system:String>

View file

@ -28,7 +28,6 @@
Then replace casino with {q}. Then replace casino with {q}.
Thus, the generic formula for a search on Netflix is https://www.netflix.com/search?q={q} Thus, the generic formula for a search on Netflix is https://www.netflix.com/search?q={q}
</system:String> </system:String>
<system:String x:Key="flowlauncher_plugin_websearch_copyurl_title">Скопировать URL-адрес</system:String> <system:String x:Key="flowlauncher_plugin_websearch_copyurl_title">Скопировать URL-адрес</system:String>
<system:String x:Key="flowlauncher_plugin_websearch_copyurl_subtitle">Скопировать URL поиска в буфер обмена</system:String> <system:String x:Key="flowlauncher_plugin_websearch_copyurl_subtitle">Скопировать URL поиска в буфер обмена</system:String>

View file

@ -29,7 +29,8 @@
Všeobecný vzorec pre vyhľadávanie na Netflix je teda https://www.netflix.com/search?q={q} Všeobecný vzorec pre vyhľadávanie na Netflix je teda https://www.netflix.com/search?q={q}
</system:String> </system:String>
<system:String x:Key="flowlauncher_plugin_websearch_copyurl_title">Kopírovať URL</system:String>
<system:String x:Key="flowlauncher_plugin_websearch_copyurl_subtitle">Kopírovať URL vyhľadávanie do schránky</system:String>
<!-- web search edit --> <!-- web search edit -->
<system:String x:Key="flowlauncher_plugin_websearch_title">Názov</system:String> <system:String x:Key="flowlauncher_plugin_websearch_title">Názov</system:String>

View file

@ -29,7 +29,8 @@
Thus, the generic formula for a search on Netflix is https://www.netflix.com/search?q={q} Thus, the generic formula for a search on Netflix is https://www.netflix.com/search?q={q}
</system:String> </system:String>
<system:String x:Key="flowlauncher_plugin_websearch_copyurl_title">Copy URL</system:String>
<system:String x:Key="flowlauncher_plugin_websearch_copyurl_subtitle">Copy search URL to clipboard</system:String>
<!-- web search edit --> <!-- web search edit -->
<system:String x:Key="flowlauncher_plugin_websearch_title">Title</system:String> <system:String x:Key="flowlauncher_plugin_websearch_title">Title</system:String>

View file

@ -29,7 +29,8 @@
Thus, the generic formula for a search on Netflix is https://www.netflix.com/search?q={q} Thus, the generic formula for a search on Netflix is https://www.netflix.com/search?q={q}
</system:String> </system:String>
<system:String x:Key="flowlauncher_plugin_websearch_copyurl_title">Copy URL</system:String>
<system:String x:Key="flowlauncher_plugin_websearch_copyurl_subtitle">Copy search URL to clipboard</system:String>
<!-- web search edit --> <!-- web search edit -->
<system:String x:Key="flowlauncher_plugin_websearch_title">Başlık</system:String> <system:String x:Key="flowlauncher_plugin_websearch_title">Başlık</system:String>

View file

@ -29,7 +29,8 @@
Таким чином, загальна формула для пошуку на Netflix має вигляд https://www.netflix.com/search?q={q} Таким чином, загальна формула для пошуку на Netflix має вигляд https://www.netflix.com/search?q={q}
</system:String> </system:String>
<system:String x:Key="flowlauncher_plugin_websearch_copyurl_title">Copy URL</system:String>
<system:String x:Key="flowlauncher_plugin_websearch_copyurl_subtitle">Copy search URL to clipboard</system:String>
<!-- web search edit --> <!-- web search edit -->
<system:String x:Key="flowlauncher_plugin_websearch_title">Назва</system:String> <system:String x:Key="flowlauncher_plugin_websearch_title">Назва</system:String>

View file

@ -29,7 +29,8 @@
Thus, the generic formula for a search on Netflix is https://www.netflix.com/search?q={q} Thus, the generic formula for a search on Netflix is https://www.netflix.com/search?q={q}
</system:String> </system:String>
<system:String x:Key="flowlauncher_plugin_websearch_copyurl_title">Copy URL</system:String>
<system:String x:Key="flowlauncher_plugin_websearch_copyurl_subtitle">Copy search URL to clipboard</system:String>
<!-- web search edit --> <!-- web search edit -->
<system:String x:Key="flowlauncher_plugin_websearch_title">Tiêu đề</system:String> <system:String x:Key="flowlauncher_plugin_websearch_title">Tiêu đề</system:String>

Some files were not shown because too many files have changed in this diff Show more