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

本文关键字:时间 全局 | 更新日期: 2023-09-27 18:11:44

我正在尝试使用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();
    }

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

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

休眠是工作的原因是因为它给你时间释放初始触发热键,然后Notepad++正确处理粘贴命令。

我不相信使用SendKeys有办法解决这个问题,但是你可以使用SendInput,它由应用程序排队并在"热键向上"上处理。

在过去,当我不得不向应用程序发送密钥时,我使用了输入模拟器,它内部封装了低级的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);
//...