下面的代码我从MSDN复制了一些修改:
[DllImport("user32.dll", CharSet = CharSet.Unicode)]
public static extern IntPtr FindWindow(string lpClassName,string lpWindowName);
DllImport("User32")]
public static extern bool SetForegroundWindow(IntPtr hWnd);
int cnt = 0;
private void button1_Click(object sender, EventArgs e)
{
IntPtr calculatorHandle = FindWindow("Notepad", "Untitled - Notepad");
if (calculatorHandle == IntPtr.Zero)
{
MessageBox.Show("Calculator is not running.");
return;
}
SetForegroundWindow(calculatorHandle);
SendKeys.SendWait(cnt.ToString());
SendKeys.SendWait("{ENTER}");
cnt++;
SendKeys.Flush();
System.Threading.Thread.Sleep(1000);
}
问题是记事本中的数字序列不是连续的。第一次单击始终为0(如预期的那样)。但是从第二次点击开始,结果是不可预测的(但序列仍然是有序的,例如3,4,5,10,14,15 ......)
如果我足够快地点击按钮,我能够以连续的顺序(0,1,2,3,4,......)得到结果,但有时它会产生超过2个相同的数字(例如0, 1,2,3,3,3,4,5,6,6,6,7,8,9,......)
答案 0 :(得分:2)
SetForegroundWindow
不会等到指定的窗口实际位于前台。它只是“开始”这个过程。因此,SendKeys.SendWait
很可能没有将密钥发送到您期望的窗口。
另一个与您所看到的相关的问题是,您在事件处理程序中调用了Thread.Sleep
。这通常被认为是一种不好的做法:你不应该阻止你的UI线程。它会使您的应用程序显示无响应。
答案 1 :(得分:1)
第一个问题发生是因为SetForegroundWindow
可以在切换焦点之前返回,因此当记事本处于非活动状态时,Sendkeys
可能会运行。