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

时间:2014-07-06 20:56:25

标签: c# clipboard sendkeys

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

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

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

提前致谢。

这是我的代码:

    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 个答案:

答案 0 :(得分:2)

问题在于SendKeys.Send在按下热键时由Notepad++处理。如果热键已经在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);
//...