.NET程序中的Sendkeys问题

时间:2010-04-09 01:06:23

标签: c# sendkeys

下面的代码我从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,......)

2 个答案:

答案 0 :(得分:2)

SetForegroundWindow不会等到指定的窗口实际位于前台。它只是“开始”这个过程。因此,SendKeys.SendWait很可能没有将密钥发送到您期望的窗口。

另一个与您所看到的相关的问题是,您在事件处理程序中调用了Thread.Sleep。这通常被认为是一种不好的做法:你不应该阻止你的UI线程。它会使您的应用程序显示无响应。

答案 1 :(得分:1)

第一个问题发生是因为SetForegroundWindow可以在切换焦点之前返回,因此当记事本处于非活动状态时,Sendkeys可能会运行。