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