Проблема Sendkeys из программы .NET - PullRequest
0 голосов
/ 09 апреля 2010

Код ниже, я скопировал из 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 ]

2 голосов
/ 09 апреля 2010

SetForegroundWindow не будет ждать, пока указанное окно окажется на переднем плане. Это просто «запускает» процесс. Так что вполне возможно, что ваш SendKeys.SendWait не отправляет ключ в окно, которое вы ожидаете.

Другая проблема, не совсем связанная с тем, что вы видите, заключается в том, что вы получили вызов Thread.Sleep в обработчике событий. Обычно это считается плохой практикой: вы не должны блокировать ваш поток пользовательского интерфейса. Это делает ваше приложение не отвечающим.

1 голос
/ 09 апреля 2010

Первая проблема возникает из-за того, что SetForegroundWindow может вернуться до переключения фокуса, поэтому Sendkeys может работать, когда блокнот не активен.

...