수안이의 컴퓨터 연구실

  • Mainpage
  • About Me
  • Tags
  • Metapage
  • Notice
  • Location
  • Keywords
  • Guestbook
  • Admin
  • Write an Article
  • Total | 1694964
  • Today | 709
  • Yesterday | 606

Programming/.NET2007/01/11 09:31

Windows Form 기반의 프로그램에서, 폼에서 컨트롤의 키 입력을 가로채기

고수닷넷 - Kenial님

:)

사실 뭐 소개하고 할 내용도 없는 것 같군요. 곧바로 들어가겠습니다아~



키보드 메시지는 어디로 갔는가?


Kenial은 아직 예전 Win32 API나 MFC에서 윈도 메시지를 가지고 이런 저런 기능을 만들어내는데에 익숙하다. 최근 들어서는 개발속도의 이점 및 배포시의 편리함 때문에 닷넷 기반의 프로그램을 많이 만들어내고 있는데, 이번에 만들어야 하는 프로그램은 이런 기능이 필요했다 :


 Alt + F4로 프로그램이 종료되지 않아야 한다.


이 문장을 보고 거의 반사적으로 WM_KEYDOWN을 떠올리는 것이 Kenial에게는 당연한 일인 것이지만, 닷넷에는 닷넷의 방법이 있다.


자. Alt + F4를 막아보도록 하자.



KeyPress 이벤트, KeyPreview 속성


닷넷 프레임워크의 이벤트에 익숙해 있다면, KeyPress 이벤트로 키보드의 입력을 받을 수 있다는 것을 알고 있을 것이다. 먼저 다음과 같은 간단한 폼을 만들어 보자 :

사용자 삽입 이미지

그리고 다음과 같이 폼의 KeyPress 이벤트 핸들러를 코딩해보자 :


private void Form1_KeyPress(object sender, System.Windows.Forms.KeyPressEventArgs e) {

           System.Diagnostics.Debug.WriteLine("Form1_KeyPress");

}


프로그램을 실행하고 뭔가 키보드 입력을 해 보면 출력창에 "Form1_KeyPress"라는 내용이 나와야 할텐데, 출력되지 않는다. 어째서일까? 간단하게 설명하자면, 키보드 메시지를 텍스트 박스가 먼저 받아서 처리해 버려서 폼의 이벤트 핸들러는 해당 메시지를 받지 못하기 때문이다.


이는 KeyPreview 속성을 true로 설정함으로써, 해당 폼의 이벤트 핸들러가 해당 메시지를 먼저 처리하도록 해서 해결할 수 있다. 앞의 프로그램에서 KeyPreview 속성을 true로 설정하면, 텍스트박스에 글자가 입력되면서 출력창에 "Form1_KeyPress"가 출력되는 것을 확인할 수 있다.



KeyDown 이벤트


하지만 KeyPress 만으로는 단지 눌려진 키의 char 코드만 받을 수 있을 뿐이고, Alt, Ctrl 등의 조합키의 입력까지 알아내려면 KeyDown 이벤트를 사용해야 한다. 다음과 같이 이벤트 핸들러를 만들자 :


private void Form1_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e)

{

   // 폼에서 종료 가능한 키 조합을 막아버리자

   if(e.KeyData == (Keys.Alt | Keys.F4))

       e.Handled = true;

}


KeyData 속성은 금방 이해된다. 그럼 Handled 속성은?

이 속성은 아까 위에서 설명한 '이 키보드 메시지가 처리되었음'을 나타내는 속성이다. false로 설정되어 있으면 Form1에서 포커스를 갖고 있는 자식 컨트롤(여기서는 텍스트박스)에 해당 키보드 메시지를 전달해 주겠지만, true로 설정하면 키보드 메시지를 텍스트박스에도 전달하지 않고 자신의 부모(=System.Windows.Forms.Form, 그리고 그 부모 클래스)에게도 전달하지 않는다.


결과적으로, Alt + F4 키 입력으로 프로그램이 종료되지 않게 된다.



정리


사실 키보드 입력을 막는 방법은 이것으로 끝이 아닙니다. 최상위 윈도우가 받는 키보드 메시지(ctrl + alt + del, alt + tab) 등은 이것만으로는 막을 수 없고, 키보드 입력과 관련된 dll을 후킹해야 가능한 일입니다.


하지만 Kenial은 아직 닷넷 기반에서의 후킹은 해본적이 없어서 ;

사실 VC++에서 구현하는 것과 별다른 차이는 없을 거라고 생각하긴 합니다만, 뭐 천천히 적어나가도록 하겠습니다 : )


그럼 : )



p.s:이번 아티클은 분량도 적고.. 캡처할게 별로 없다보니 너무 편하네요 ;


p.s2:그리고, 이벤트에 익숙하지 않으신 분이라면 차라리 KeyDown 이벤트보다는 ProcessCmdKey 함수를 오버라이딩해서 사용하시는 편이 더 나을듯도 합니다 : )

".NET" 카테고리의 다른 글
  • 닷넷 윈폼 배포시 Framework, mdac 등 병합모듈로... (0)2007/01/11
  • Windows Form : 윈도우 폼 꾸미기 (0)2007/01/11
  • Windows Form 기반의 프로그램에서, 폼에서 컨트롤... (0)2007/01/11
  • .NET의 Enterprise Service(COM+) 이해 (0)2007/01/11
  • Microsoft Application Blocks for .NET (0)2007/01/11
2007/01/11 09:31 2007/01/11 09:31
Posted by webdizen
No Trackback No Comment

Trackback URL : http://www.webdizen.net/blog/trackback/2575

Leave your greetings.

[로그인][오픈아이디란?]

«Prev  1 ... 671 672 673 674 675 676 677 678 679 ... 3009  Next»

RSS HanRSS
Blog Image
webdizen
이곳은 컴퓨터에 대해 연구하고, 공유하고, 소통하기 위한 연구실입니다. 개인적으로는 OLAP, Data Mining, Semantic Web, Data Modeling에 대해서 연구하고 있습니다.

Categories

전체 (3009)
Webdizen (141)
Life (6)
Diary (16)
Blog (9)
IDEA (2)
Travel (10)
Book (16)
Photo (7)
Movie (8)
Music (14)
Leisure Sports (10)
Funny (6)
Hardware (121)
Software (120)
Windows (5)
Unix & Linux (120)
Installation (5)
Kernel (10)
System (34)
Develop (22)
X-Window (0)
Applicaton (31)
Security (4)
Framework (2)
Hadoop (2)
Programming (804)
Algorithm & Data Structure (1)
Assembly (38)
UNIX/Linux C (95)
C++ (128)
STL (4)
Java (38)
Win32 API (92)
ATL/COM (44)
MFC (151)
.NET (26)
WCF/WPF (4)
C# (28)
Network Programming (17)
Database Programming (12)
OpenGL / DirectX (13)
Multimedia Programming (0)
Game Programming (21)
Parallel Distributed Progra... (0)
Reverse Engineering (0)
Debugging (9)
Python (1)
Ruby (1)
Ruby on Rails (1)
QT (4)
GTK (0)
JSP (0)
PHP (6)
ASP.NET (6)
ASP (2)
Development (28)
Useful Library (2)
Data Modeling (0)
Database (105)
Oracle (4)
MSSQL (41)
MySQL (2)
Data Warehouse (2)
Data Mining (4)
Network (66)
Web (79)
DHTML (4)
XHTML (1)
Javascript (1)
CSS (1)
AJAX (9)
XML (11)
Flex (1)
Silverlight (3)
Security (91)
DoS (1)
Kernel (10)
Scanning (3)
Sniffing (0)
Spoofing (4)
Overflow (28)
Web (11)
Shell (10)
Format String (14)
Window (2)
Embedded (70)
Multimedia (27)
Mobile (14)
Graphic (24)
Management (633)
Knowledge (581)
Hadoop (0)

Notice

  • 메타 블로그 사이트에 등록
  • 새해 맞이 블로그의 변화
  • 블로그 명칭 변경
  • 도메인(www.webdizen.net) 구...
  • TEXTCUBE 1.6.1로 업그레이드...

Tags

  • 스페인
  • INI
  • Geotracking
  • Blogging
  • VisualStudio
  • Google api
  • Huffman
  • 청년 리더
  • 로깅
  • renfe
  • DB 보호
  • Designing
  • free
  • 원격 네트워크
  • 패킷 캡처
  • 템플릿
  • 집중
  • Call
  • Lempel
  • 라스베이거스

Recent Articles

  • 트위터(Twitter)의 시작!.
  • 청년 리더의 조건.
  • 애플의 타블렛 PC - 아이패드....
  • 미래의 인터페이스 - 육감 기....
  • 기초발성법 동영상 강좌.

Recent Comments

  • 경청... 너무나 중요한데.......
    webdizen 14:59
  • 학교 과제물중 쓰레드에 대하....
    장진혁 03/17
  • 관리자만 볼 수 있는 댓글입....
    비밀방문자 03/12
  • 상대방의 이야기를 열심히 경....
    DoNuts 03/03
  • 좋은글 잘 보고 갑니다..
    Und_hacker 01/08

Recent Trackbacks

  • printf,scanf를 이용한 형식....
    yundream의 프로그래밍 이야기 03/10
  • 파일 열기/저장하기 CFileDialog.
    은마군의 나태블록 2009
  • World IT Show 2008.
    상우 :: Oranzie's BLOG 2008
  • cvs서버 설치하기.
    3인3색 2008
  • 속속 공개되는 Google Chart....
    PHP와 Web 2.0 2007

Archive

  • 2010/02 (1)
  • 2010/01 (6)
  • 2009/12 (5)
  • 2009/09 (3)
  • 2009/08 (1)

Calendar

«   2010/03   »
일 월 화 수 목 금 토
  1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31      

Bookmarks

    • Administration
      • IIS.NET
      • NTFAQ
      • OS의 모든 것
      • 리눅스포털
    • Database
      • SQL Server Central
      • SQL Team
    • Development
      • .NET Heaven
      • ASP Alliance
      • ASP.NET 2.0
      • Bullog.net
      • C# Corner
      • C++ (C PlusPlus.com)
      • C++ Reference
      • CodeGuru
      • CodePlex
      • DebugLab
      • Dev Articles
      • Devpia
      • DotNet Junkies
      • DotNet Zone
      • Driver Online
      • GOSU.NET
      • HOONS 닷넷
      • Joinc 팀블로그
      • KOSR
      • MSDN Home Page
      • OSR Online
      • Sky.ph - 개발자 커뮤니...
      • TAEYO.NET
      • The Code Project
      • WindowsClient.net
      • 김상욱의 개발자 Side
      • 조인시 위키
    • Human Networks
      • belief21c's e-space
      • I think I can
      • Invisible Rover's Blog :D
      • Polarux - Linuxing
      • Rodman®
      • 까만 나비
      • 나를 가꾸는 시간.
      • 단녕
      • 상우 :: Oranzie's BLOG
    • Information Technology
      • Microsoft TechNet
      • 지디넷코리아 - 글로벌...
    • Security
      • FoundStone
      • milw0rm
      • NewOrder
      • OpenRCE
      • Phrack.org
      • Reverse Engineering b1...
      • Reverse Engineering Team
      • RootKit
      • SecurityFocus
      • SecurityXploded by Nag...
      • Wow Hacker
      • Zone-H
Textcube
Louice Studio Inc.
Powered by Textcube. Original designed by Tistory.