在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();
}
问题是当按下热键时,SendKeys.Send
被Notepad++
处理。如果热键已经在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);
//...