質問

VB6 では、Windows API の呼び出しを使用しました。 GetAsyncKeyState, 、ユーザーが長時間実行されているループから抜け出すために ESC キーを押したかどうかを判断します。

Declare Function GetAsyncKeyState Lib "user32" (ByVal nVirtKey As Long) As Integer

API への直接呼び出しを必要とする純粋な .NET に相当するものはありますか?

役に立ちましたか?

解決

GetAsyncKeyState の P/Invoke 宣言は、次の場所にあります。 http://pinvoke.net/default.aspx/user32/GetAsyncKeyState.html

C# の署名の例を次に示します。

[DllImport("user32.dll")]
static extern short GetAsyncKeyState(int vKey);

他のヒント

希望する用途に応じて、上記と同じメソッドを呼び出すなど、いくつかのオプションがあります)。コンソール アプリから:

bool exitLoop = false;
for(int i=0;i<bigNumber && !exitLoop;i++)
{
    // Do Stuff.
    if(Console.KeyAvailable)
    {
        // Read the key and display it (false to hide it)
        ConsoleKeyInfo key = Console.ReadKey(true);
        if(ConsoleKey.Escape == key.Key)
        {
            exitLoop=false;
        }
    }
}

Windows フォームで作業している場合、各フォームには、必要に応じてリッスンして処理できる重要な関連イベントが多数あります (ロジックの大部分は簡略化されています)。

public partial class Form1 : Form
{
    private bool exitLoop;
    public Form1()
    {
        InitializeComponent();
        this.KeyUp += new System.Windows.Forms.KeyEventHandler(this.Form1_KeyUp);
    }
    public void doSomething()
    {
        // reset our exit flag:
        this.exitLoop = false;
        System.Threading.ThreadPool.QueueUserWorkItem(new System.Threading.WaitCallback(delegate(object notUsed)
            {
                while (!exitLoop)
                {
                    // Do something
                }
            }));
    }
    private void Form1_KeyUp(object sender, KeyEventArgs e)
    {
        if (Keys.Escape == e.KeyCode)
        {
            e.Handled = true;
            this.exitLoop = true;
        }
    }

}

これは、 とても 簡略化 - 通常のスレッドの問題などは処理しません。コメントで指摘されているように、元のゴーラウンドはその問題に対処していなかったので、バックグラウンド作業をスレッド化するための簡単な小さな ThreadPool 呼び出しを追加しました。また、キー イベントのリッスンに関する問題は、他のコントロールが実際にそれらのイベントを処理する可能性があるため、正しいコントロールでイベントを登録していることを確認する必要があることにも注意してください。Windows フォーム アプリケーションを目指している場合は、メッセージ ループ自体に自分自身を注入してみることもできます。

public override bool PreProcessMessage(ref Message msg)
{
  // Handle the message or pass it to the default handler...
  base.PreProcessMessage(msg);
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top