0

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

4

2 回答 2

2

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

另一个与您所看到的内容不太相关的问题是您Thread.Sleep在事件处理程序中被调用。这通常被认为是一种不好的做法:您不应该阻塞您的 UI 线程。它使您的应用程序看起来没有响应。

于 2010-04-09T01:16:39.693 回答
1

发生第一个问题是因为SetForegroundWindow可以在焦点切换之前返回,因此Sendkeys可能会在记事本未激活时运行。

于 2010-04-09T01:12:26.813 回答