문제

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