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になります(予想どおり)。ただし、2回目のクリックからは、結果は予測できません(ただし、シーケンスはまだ順番になっています。たとえば、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期待するウィンドウにキーを送信していない可能性があります。

表示されているものとはあまり関係のないもう1つの問題はThread.Sleep、イベントハンドラーでへの呼び出しがあることです。これは一般的に悪い習慣と考えられています。UIスレッドをブロックするべきではありません。アプリケーションが応答しなくなったように見えます。

于 2010-04-09T01:16:39.693 に答える
1

最初の問題はSetForegroundWindow、フォーカスが切り替わる前に戻る可能性があるために発生Sendkeysし、メモ帳がアクティブでないときに実行される可能性があります。

于 2010-04-09T01:12:26.813 に答える