1

次のような状況があります

kl.KeyDown += CheckPwd;
while(flag)
   System.Windows.Forms.Application.DoEvents();

//continue other code based on "Success"

//This will be called for every keydown
void CheckPwd(object sender, KeyEventArgs e)
{
   //some code here
   if(....)
   {
       flag = true;
       Success = true;   
       kl.KeyDown -= CheckPwd;   
   }
   else
   {
       flag = true;
       Success = false;
       kl.KeyDown -= CheckPwd;
   }
}

ここでは、使用を避けたいと思いApplication.DoEvents()ます。を使用してみManualResetEventましたが、呼び出すWaitOne()と現在のスレッドがブロックされており、これCheckPwdが原因で起動していません。どうすればこれを達成できますか?

4

1 に答える 1

0

新しいSuccessイベントを作成し、成功条件に達したときにそれを起動し、成功時に実行する必要があるコードをそのイベントのイベント ハンドラーに配置します。

イベントを定義します。

public event Action Success;

ハンドラーをアタッチします。

kl.KeyDown += CheckPwd;
Success += DoSuccessStuff;

イベントを発生させます:

void CheckPwd(object sender, KeyEventArgs e)
{
   //some code here
   if(...)
   {
       flag = true;
       Success = true;   
       kl.KeyDown -= CheckPwd;   
       if(Success != null) Success();
   }
   //...
于 2013-09-25T14:22:18.430 に答える