0

我正在尝试创建一个应用程序,该应用程序将在按下键盘快捷键时处理选定的文本。我使用此方法的一部分来获取当前选定的文本(似乎没有其他方法可以从任何应用程序获取选定的文本:

string GetSelectedText()
{
    var oldClip = Clipboard.GetText();
    SendKeys.SendWait("^c");
    string selection = Clipboard.GetText();
    Clipboard.SetText(oldClip); // preserve clipboard
    return selection;
}

我的第一个想法是使用系统托盘图标。单击时,图标将使用上述方法获取当前选择,并对其进行处理。但是,像这样使用剪贴板需要应用程序处于焦点位置,而单击系统托盘图标会使该图标成为焦点,然后该方法才能运行。

我的下一个想法是使用全局键盘快捷键。我遇到了这篇关于获取全局热键的文章,它实际上可以收听键盘组合,但只能在一个应用程序中,这不是我想要的 - 我想在任何应用程序中收听键盘快捷键。

我已经阅读了这篇文章(来自这个答案),它确实设法在任何应用程序中监听键,但一次只能监听一个键(例如单个 LControl、Shift 或 C 等)。

我的问题是:我如何才能监听某个组合键,无论是什么应用程序都处于焦点,并执行上面的方法来获取当前的选择?

如果有更好的方法来检索当前选择,或者如果可以在应用程序不在焦点时完成,那么解释如何可能的答案也值得赞赏;然而,主要关注点是在所有应用程序中监听键盘组合。

4

1 回答 1

0

我最终使用了 Chris Dunaway 提到的库MouseKeyboardLibrary

正如您可能在他提出的评论线程中看到的那样,它最初对我不起作用。事实证明,由于模块无效,该库对我不起作用IntPtr,因此我将库更改为使用IntPtr.Zero以前用于Marshal获取模块指针的位置,这使其按预期工作。

于 2018-07-24T11:42:10.250 回答