레이블이 #시샵강좌인 게시물을 표시합니다. 모든 게시물 표시
레이블이 #시샵강좌인 게시물을 표시합니다. 모든 게시물 표시

2021년 11월 6일 토요일

C# 윈폼(Application 클래스 – 메시지 필터링), ALT+F4키는 윈도우를 종료 시키는데 이 키를 필터를 통해 막아보자.

 C# 윈폼(Application 클래스 – 메시지 필터링), ALT+F4키는 윈도우를 종료 시키는데 이 키를 필터를 통해 막아보자.


C# 윈도우 프로그램은 이벤트(Event, 사건)에 반응해서 코드가 실행되는 이벤트 기반으로 만들어지며 이러한 이벤트는 사용자가 일으키는것이 아니라 윈도우 운영체제가 일으키는 것이다.


사용자가 키보드나 마우스를 제어하면 인터럽트가 발생되고 이를 운영체제가 받아 들이는 것이다.  운영체제는 이 인터럽트를 바탕으로 윈도우 메시지를 만든 뒤 이벤트를 받아야 하는 응용프로그램에 보내는 것이다.


윈도우 메시지는 종류가 다양하다. 윈도우 응용프로그램은 마우스 이동이나 클릭, 키보드 입력처럼 미리 등록되어 있는 메시지를 받지만 다른 응용프로그램은 자체적으로 정의한 메시지도 받을 수 있다.


Application클래스는 응용프로그램이 받고 있는 수많은 메시지 중 관심 있는 메시지만 걸러낼 수 있는 메시지 필터링 기능이 있다. 예를 들어 윈도우 응용프로그램에서 ALT+F4를 눌러 윈도우가 종료되는 것을 막고 싶다면 필터링 기능을 이용하여 이를 차단하는 것도 가능하다.


일반적으로 윈도우 메시지는 식별번호가 붙어 있는데 WM_LBUTTONDOWN 메시지 ID가 0x201로 정의되어 있다. Application 클래스는 특정 ID를 갖는 메시지를 필터에 등록해 두었다가 응용프로그램에 메시지가 전달되면 해당 필터를 동작시키며 필터링 되지 않는다면 해당 메시지를 폼이나 컨트롤로 보내 이벤트를 발생시킨다.


Application 클래스의 AddMessageFilter() 메소드는 응용프로그램에 메시지 필터를 등록한다. 이 메소드의 매개변수로 IMessageFilter를 구현한 클래스의 인스턴스를 매개변수로 받으며 IMessageFilter의 PreFilterMessage를 구현해야 한다.


public class MessageFilter : IMessageFilter {

public bool PreFilterMessage(ref Message m) {   //m.Msg는 메시지 ID

                          //마우스 왼쪽, 오른쪽, 가운데 버튼동작, 마우스 휠굴림 메시지

              if (m.Msg >= 0x200 && m.Msg <= 0x20E) {

Console.WriteLine(“메시지 : “ + m.Msg);

return true; //메시지처리했으니 더 관심가질 필요없다.

}

return false;   //메시지를 건드리지 않았으니 응용프로그램에서 처리해라

}

}


위와 같이 메시지 필터를 구현했다면 AddMessageFilter() 메소드를 호출해서 등록하면 된다.


Application.AddMessageFilter( new MessageFilter());


using System;

using System.Windows.Forms;

 

namespace ConsoleApplication9

{

    class OnjMessageFilter : IMessageFilter

    {

        public bool PreFilterMessage(ref Message m)

        {       

            //마우스 클릭시 필터링 시킴  

            if (m.Msg == 0x201)

            {

                Console.WriteLine("마우스 클릭 필터링됨...");

                //필터에서 처리했으니 응용프로그램에서 처리안해도된다는 의미

                //Form에 걸려 있는 Click 이벤트 동작안함.즉 윈도우가 종료되지않는다

                //이 부분을 false로 바꾼 후 실행해 보라

                return true;  

            }

            return false;

        }

    }

   

 

class Program : Form

    {

        static void Main(string[] args)

        {

            Application.AddMessageFilter(new OnjMessageFilter());

            Program p = new Program();

            p.Click += new EventHandler(p.Form_Click);

            Application.Run(p);    

        }

 

        void Form_Click(object sender, EventArgs e)

        {

            Console.WriteLine("마우스 클릭 이벤트 발생...");

            Application.Exit();

        }

    }

}


보통 윈도우에서 ALT+F4키는 윈도우를 종료 시키는데 이 키를 필터를 통해 막아보자.


위 PreFilterMessage 메소드에 아래 코드를 추가해서 ALT+F4키가 동작되지 않는지 테스트 하자.


 

const int WM_SYSKEYDOWN = 0x0104;

 

    if (m.Msg == WM_SYSKEYDOWN)

    {

         bool alt = ((int)m.LParam & 0x20000000) != 0;

         if (alt && (m.WParam == new IntPtr((int)Keys.F4)))

             Console.WriteLine("ALT+F4 Filtering됨.");

             return true; // 이벤트를 처리했으니 뒤쪽으로 넘기지 않는다.

   }

 

#메시지필터링, #시샵강좌, #Application클래스 

C#, 명명된 인수 및 선택적 인수

C#, 명명된 인수 및 선택적 인수


명명된 인수


매개변수 목록에서의 매개변수 위치지정 대신 매개변수의 이름과 인수를 연결하여 특정 매개변수에 대한 인수를 지정할 수 있으므로 매개변수의 순서를 기억하거나 확인할 필요가 없다.

메소드에서 파라미터 값을 넘길 때 매개변수 이름을 정해서 넘기는 방법을 제공한다.


 

using System;

namespace Test

{

    class Tester

    {       

        static void Main(string[] args)

        {

            Console.WriteLine(Sum(j : 1, i : 2));

            SayHello(age : 20, name : "OJC");

        }

 

        static int Sum(int i, int j) 

{

            Console.WriteLine("i={0}, j={1}", i, j);

            return i + j;

        }

 

        static void SayHello(string name, int age) 

        {

            Console.WriteLine("안녕, name = {0}, age = {1}", name, age);

        }

    }

}

 


선택적 인수


메소드, 생성자, 인덱서 또는 대리자의 정의에서 해당 매개변수가 필수인지 선택적인지 지정할 수 있는데, 호출할 경우 모든 필수 매개변수에 대한 인수는 항상 제공해야 하지만 선택적 매개변수에 대한 인수는 생략할 수 있다. 각각의 선택적 매개변수에는 기본값이 있으며 해당 매개변수에 대해 인수를 전달하지 않으면 기본값이 사용된다.



 

using System;

namespace Test

{

    class Tester

    {

        private int m = 88, n = 99;

 

        //Tester(){

        //    this.m = 0; this.n = 0;

        //}

 

        //위 기본생성자의 의미를 포함하고 있다.

        Tester(int m = 0, int n = 0)

        {

            this.m = m;        this.n = n;

        }

 

//선택적 매개변수

        static int Sum(int i = 0, int j = 0)  // i, j 매개변수없이 호출되면 I,j에 0이 대입

{

            return i + j;

        }

 

 

        static void Main(string[] args)

        {

            Console.WriteLine(Sum(1, 2));

            Console.WriteLine(Sum(j:7));

            Console.WriteLine(Sum());

 

            Tester t1 = new Tester();

            Console.WriteLine("m={0}, n={1}", t1.m, t1.n);

 

            Tester t2 = new Tester(1, 2);

            Console.WriteLine("m={0}, n={1}", t2.m, t2.n);

        }

 

        

    }

}

 

 

using System;

 

namespace Test

{

    class Tester

    {

        static void Main(string[] args)

        {

            Console.WriteLine(Minus(1, 2));              //i=1, j=2

            Console.WriteLine(Minus (1));                //i=1, j=0

            Console.WriteLine(Minus (i : 8, j : 9));     //i=8, j=9

            Console.WriteLine(Minus (j : 8, i : 9));     //i=9, j=8

            Console.WriteLine(Minus ());                 //i=0, j=0

        }

 

        static int Minus(int i = 0, int j = 0)  // i, j 매개변수없이호출되면 0이 대입됨

        {

            return i - j;

        }

    }

}

 

 

 

 

#명명된인수, #선택적인수, #매개변수, #시샵매개변수, #닷넷교육, #시샵강좌

(C#교육동영상)C# ADO.NET 실습 ODP.NET/ODAC 설치 오라클 함수 호출 실습, C#학원, WPF학원, 닷넷학원, 자바학원

  (C#교육동영상)C# ADO.NET 실습  ODP.NET/ODAC 설치  오라클 함수 호출 실습, C#학원, WPF학원, 닷넷학원, 자바학원 https://www.youtube.com/watch?v=qIPU85yAlzc&list=PLxU-i...