여기서는 특정 키를 누르면 프로그램이 종료되는 예제를 쓰겠습니다.


프로젝트 파일 안에

클래스 파일을 생성하고 아래의 코드를 붙여넣어 클래스 파일을 만듭니다.


/*
 * FileName : ExitProgramUsingESC.cs
 * esc 키를 누르면 프로그램이 종료됨
 * Application 레벨에서 메세지를 처리
 */

using System.Windows.Forms;

public class ExitProgramClass : IMessageFilter
{
    private const int WM_KEYDOWN = 0x0100; // 키보드 다운
    private const int VK_ESCAPE = 0x1B; // esc 키
    public bool PreFilterMessage(ref Message m)
    {
        // 키보드가 다운 되었고 esc가 눌렸다면
        if (m.Msg == WM_KEYDOWN
            && m.wParam.ToInt32() == VK_ESCAPE)
        {
            Application.Exit(); // 프로그램 종료
            return true;
        }
        return false;
    }
}


그리고 폼의 생성자 부분에 다음과 같이 코드를 집어넣으면 됩니다.


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace AStarAlgorithm
{
    public partial class BaseForm : Form
    {
        public BaseForm()
        {
            InitializeComponent();

            // esc 키를 누르면 프로그램 종료
            Application.AddMessageFilter(new ExitProgramClass());

        }
    }
}



C#에서는 WM_KEYDOWN, WM_MOUSEDOWN 과 같은

메세지에 대한 값이 정의 되있지 않으므로 사용자가 직접

정의해서 사용해야합니다.


위의 예제를 응용하면

프로그램 전체에 대해서

어플리케이션 레벨의

메세지 전체를 처리할 수 있습니다.


키보드 입력값은 m.Msg 의 wParam을 비교한다!

Posted by 투명테잎