在 C# 中使用全局热键粘贴当前时间

Posted

技术标签:

【中文标题】在 C# 中使用全局热键粘贴当前时间【英文标题】:Paste current time using global hotkey in C# 【发布时间】:2014-08-27 07:49:19 【问题描述】:

我正在尝试使用 C# 在任何窗口中粘贴当前时间。所以我在 C# 中定义了一个全局热键,当我在任何窗口中按下热键时,当前时间就会粘贴在那里。

问题是它与记事本完美配合,但在记事本++中它只粘贴一次当前时间,然后粘贴一些奇怪的字符,在记事本++中由SYN显示。我添加了一个 thread.sleep(500);在粘贴命令之前,它适用于每个窗口。

所以问题是为什么它可以在记事本中工作而不是在记事本++中?以及如何摆脱睡眠延迟以使其在每个窗口中都能正常工作?

提前致谢。

这是我的代码:

    public static void PasteDT()
    
        ClipPut(DateTime.Now.ToString("HHmmss"));
        //Thread.Sleep(500); //<< without this line it works just once in Notepad++
        SendKeys.SendWait("^v");
    

    public static void ClipPut(string ClipboardText)
    
        Thread clipboardThread = new Thread(() => Clipboard.SetText(ClipboardText));
        clipboardThread.SetApartmentState(ApartmentState.STA);
        clipboardThread.IsBackground = false;
        clipboardThread.Start();
        clipboardThread.Join();
    

【问题讨论】:

【参考方案1】:

问题在于按下热键时SendKeys.SendNotepad++ 处理。如果热键在Notepad++ 中已经有一个功能,或者它发生冲突,那么你会得到未定义的行为。

睡眠之所以起作用,是因为它让你有时间释放初始触发热键,然后Notepad++ 正确处理粘贴命令。

我不相信有办法使用SendKeys 解决这个问题,但是您可以使用SendInput,它会被应用程序排队并在“热键启动”时进行处理。

过去,当我不得不向应用程序发送密钥时,我使用了Input Simulator,它在内部封装了低级 Win32 SendInput 调用。在您的情况下,生成的代码将是:

//...
Thread clipboardThread = new Thread(() =>

    Clipboard.SetText(ClipboardText);
);
clipboardThread.SetApartmentState(ApartmentState.STA);
clipboardThread.IsBackground = false;
clipboardThread.Start();
clipboardThread.Join();

InputSimulator.Keyboard.ModifiedKeyStroke(VirtualKeyCode.CONTROL, VirtualKeyCode.VK_V);
//...

【讨论】:

感谢您的回答,但我宁愿不使用任何 dll 来完成此类任务。使用C#本身,不使用任何第三方dll,真的没有解决方案吗? 有一个示例here 说明如何在没有第三方DLL 的情况下直接与SendInput 交互。它的工作方式与我的答案中的代码相同,但您必须在更精细的级别上处理按键

以上是关于在 C# 中使用全局热键粘贴当前时间的主要内容,如果未能解决你的问题,请参考以下文章

使用 C# 设置全局热键

从 Winforms 应用程序发送全局击键/伪造全局热键

我如何在一些全局击键上使用 Python 或 C++ 将一些文本粘贴到 linux 中的当前活动应用程序

多账号工作台切换至下一个有消息的账号的快捷键是哪个?

iterm2 mac (v3.1.5) 无法在当前桌面中使用热键打开

如何将终端更改为 Visual Studio 代码中的当前目录? (热键)[重复]