mirror of
https://github.com/Flow-Launcher/Flow.Launcher.git
synced 2026-03-11 08:54:32 +00:00
Fix Unexpected Intercept result when multiple plugin register the global hotkey event
This commit is contained in:
parent
1c60b8e586
commit
d3d1f6faa7
4 changed files with 30 additions and 6 deletions
|
|
@ -79,7 +79,7 @@ namespace Flow.Launcher.Infrastructure.Hotkey
|
||||||
{
|
{
|
||||||
return InterceptKeys.CallNextHookEx(hookId, nCode, wParam, lParam);
|
return InterceptKeys.CallNextHookEx(hookId, nCode, wParam, lParam);
|
||||||
}
|
}
|
||||||
return (IntPtr)1;
|
return (IntPtr)(-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void Dispose()
|
public static void Dispose()
|
||||||
|
|
|
||||||
|
|
@ -104,8 +104,22 @@ namespace Flow.Launcher.Plugin
|
||||||
/// Fired after global keyboard events
|
/// Fired after global keyboard events
|
||||||
/// if you want to hook something like Ctrl+R, you should use this event
|
/// if you want to hook something like Ctrl+R, you should use this event
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
[Obsolete("Unable to Retrieve correct return value")]
|
||||||
event FlowLauncherGlobalKeyboardEventHandler GlobalKeyboardEvent;
|
event FlowLauncherGlobalKeyboardEventHandler GlobalKeyboardEvent;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Register a callback for Global Keyboard Event
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="callback"></param>
|
||||||
|
public void RegisterGlobalKeyboardCallback(Func<int, int, SpecialKeyState, bool> callback);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Remove a callback for Global Keyboard Event
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="callback"></param>
|
||||||
|
public void RemoveGlobalKeyboardCallback(Func<int, int, SpecialKeyState, bool> callback);
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Fuzzy Search the string with the given query. This is the core search mechanism Flow uses
|
/// Fuzzy Search the string with the given query. This is the core search mechanism Flow uses
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|
|
||||||
|
|
@ -40,7 +40,7 @@ namespace Flow.Launcher
|
||||||
_settingsVM = settingsVM;
|
_settingsVM = settingsVM;
|
||||||
_mainVM = mainVM;
|
_mainVM = mainVM;
|
||||||
_alphabet = alphabet;
|
_alphabet = alphabet;
|
||||||
GlobalHotkey.hookedKeyboardCallback += KListener_hookedKeyboardCallback;
|
GlobalHotkey.hookedKeyboardCallback = KListener_hookedKeyboardCallback;
|
||||||
WebRequest.RegisterPrefix("data", new DataWebRequestFactory());
|
WebRequest.RegisterPrefix("data", new DataWebRequestFactory());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -190,25 +190,35 @@ namespace Flow.Launcher
|
||||||
Arguments = FileName is null ?
|
Arguments = FileName is null ?
|
||||||
explorerInfo.DirectoryArgument.Replace("%d", DirectoryPath) :
|
explorerInfo.DirectoryArgument.Replace("%d", DirectoryPath) :
|
||||||
explorerInfo.FileArgument.Replace("%d", DirectoryPath).Replace("%f",
|
explorerInfo.FileArgument.Replace("%d", DirectoryPath).Replace("%f",
|
||||||
Path.IsPathRooted(FileName) ? FileName : Path.Combine(DirectoryPath, FileName))
|
Path.IsPathRooted(FileName) ? FileName : Path.Combine(DirectoryPath, FileName))
|
||||||
};
|
};
|
||||||
explorer.Start();
|
explorer.Start();
|
||||||
}
|
}
|
||||||
|
|
||||||
public event FlowLauncherGlobalKeyboardEventHandler GlobalKeyboardEvent;
|
public event FlowLauncherGlobalKeyboardEventHandler GlobalKeyboardEvent;
|
||||||
|
|
||||||
|
private readonly List<Func<int, int, SpecialKeyState, bool>> _globalKeyboardHandlers = new();
|
||||||
|
|
||||||
|
public void RegisterGlobalKeyboardCallback(Func<int, int, SpecialKeyState, bool> callback) => _globalKeyboardHandlers.Add(callback);
|
||||||
|
public void RemoveGlobalKeyboardCallback(Func<int, int, SpecialKeyState, bool> callback) => _globalKeyboardHandlers.Remove(callback);
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region Private Methods
|
#region Private Methods
|
||||||
|
|
||||||
private bool KListener_hookedKeyboardCallback(KeyEvent keyevent, int vkcode, SpecialKeyState state)
|
private bool KListener_hookedKeyboardCallback(KeyEvent keyevent, int vkcode, SpecialKeyState state)
|
||||||
{
|
{
|
||||||
|
var continueHook = true;
|
||||||
if (GlobalKeyboardEvent != null)
|
if (GlobalKeyboardEvent != null)
|
||||||
{
|
{
|
||||||
return GlobalKeyboardEvent((int)keyevent, vkcode, state);
|
continueHook = GlobalKeyboardEvent((int)keyevent, vkcode, state);
|
||||||
|
}
|
||||||
|
foreach (var x in _globalKeyboardHandlers)
|
||||||
|
{
|
||||||
|
continueHook &= x((int)keyevent, vkcode, state);
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return continueHook;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
|
||||||
|
|
@ -300,7 +300,7 @@ namespace Flow.Launcher.Plugin.Shell
|
||||||
{
|
{
|
||||||
this.context = context;
|
this.context = context;
|
||||||
_settings = context.API.LoadSettingJsonStorage<Settings>();
|
_settings = context.API.LoadSettingJsonStorage<Settings>();
|
||||||
context.API.GlobalKeyboardEvent += API_GlobalKeyboardEvent;
|
context.API.RegisterGlobalKeyboardCallback(API_GlobalKeyboardEvent);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool API_GlobalKeyboardEvent(int keyevent, int vkcode, SpecialKeyState state)
|
bool API_GlobalKeyboardEvent(int keyevent, int vkcode, SpecialKeyState state)
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue