Q&A

  • : MDI의 메인 폼에서 키보드 누름을 감지하려면
안녕하세요



MDI 의 메인 폼에서는 keypreview 가 동작을 안 하네요.

childform 에서는 되는데...

메인 폼에서 키보드 누름을 알수는 없나요?

shift / alt / ctrl 키를 조합해서 누르는 것을 할려고 하는데 안돼요..



SHIFT+ALT_F9 / CTRL+ALT_F9 이런걸 메인폼에서도 잡고 싶은데

방법 좀 알려 주세요..어딘가에서 구한 소스로는 조합키를 잡지 못합니다.

쉽게 얘기해서 CTRL+ALT_F9 하는거나 SHIFT+ALT_F9하는거나 F9를 누르는거나

동일한 결과가 나와요. 정확하게 키보드를 제어하고 싶은데..방법 좀 알려 주세요



참고로 제가 찾아서 테스트한 관련자료를 올립니다.

이걸로는 설명드린 결과만이 나오네요.





//======================================================================

unit Unit1;



interface



uses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

StdCtrls;



type

TForm1 = class(TForm)

procedure FormCreate(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

procedure ChangminKeyInterceptor(var Msg: TMsg; var Handled: Boolean);

end;



var

Form1: TForm1;



implementation



{$R *.DFM}



procedure TForm1.ChangminKeyInterceptor(var Msg: TMsg; var Handled: Boolean);

begin

if (Form1 <> nil) and

(Msg.Message = WM_KEYDOWN) then

begin

if (Msg.wParam = VK_DELETE) then ShowMessage('Delete 키를 눌렸다.');

if (Msg.wParam = VK_RETURN) then ShowMessage('Enter 키를 눌렸다.');

if (Msg.wParam = VK_F9) then showMessage('F9 키를 눌렀다.');

end;



if (Form1 <> nil) and

(Msg.Message = WM_KEYUP) then

begin

if (Msg.wParam = VK_DELETE) then ShowMessage('Delete 키를 뗏다.');

if (Msg.wParam = VK_RETURN) then ShowMessage('Enter 키를 뗏다.');

if (Msg.wParam = VK_F9) then ShowMessage('F9 Key 키를 뗏다.');

end;

end;







procedure TForm1.FormCreate(Sender: TObject);

begin

Application.OnMessage := ChangminKeyInterceptor;

end;



2  COMMENTS
  • Profile
    박태준 2001.04.13 16:54
    form1의 프로퍼티 창에서 keypreview를 True로 한다

    event 중 onkeydown 이벤트를 등록하고



    procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;

    Shift: TShiftState);

    begin

    if ( key =vk_delete) and ( shift =[ssShift]) then

    showmessage('del + shift');

    end;

    이렇게 하면 del 키와 shift 키를 먹을 것입니다.



    밑의 헥사 값을 쓸려면 key= $2E 와 같겠죠

    10진 값은 key =46

    밑에 키값을 정리했으니 참고하세요

    이 값들은 나도 찾기 힘들어서 따로 저장해 두고 참고합니다.

    좋은 하루..



    Symbloic name Value(in hex) Mouse or keyboard equivalent

    ------------- ------------- ----------------------------

    VK_LBUTTON 01 Left mouse button

    VK_RBUTTON 02 Right mouse button

    VK_CANCEL 03 Used for control break processing

    VK_MBUTTON 04 Middle mouse button(three-button mouse)

    -- 05-07 Undefined

    VK_BACK 08 BACKSPACE key



    VK_TAB 09 TAB key

    -- 0A0B Undefined

    VK_CLEAR 0C CLEAR key

    VK_RETURN 0D ENTER key

    -- 0E0F Undefined

    VK_SHIFT 10 SHIFT key

    VK_CONTROL 11 CTRL key

    VK_MENU 12 ALT key

    VK_PAUSE 13 PAUSE key

    VK_CAPITAL 14 CAPS LOCK key

    -- 15-19 Reserved for Kanji systems

    -- 1A Undefined

    VK_ESCAPE 1B ESC key

    -- 1C-1F Reserved for Kanji systems

    VK_SPACE 20 SPACEBAR

    VK_PRIOR 21 PAGE UP key

    VK_NEXT 22 PAGE DOWN key

    VK_END 23 END key

    VK_HOME 24 HOME key

    VK_LEFT 25 LEFT ARROW key

    VK_UP 26 UP ARROW key

    VK_RIGHT 27 RIGHT ARROW key

    VK_DOWN 28 DOWN ARROW key

    VK_SELECT 29 SELECT key

    -- 2A OEM specific

    VK_EXECUTE 2B EXECUTE key

    VK_SNAPSHOT 2C PRINT SCREEN key for Windows 3.0 and later

    VK_INSERT 2D INS key

    VK_DELETE 2E DEL key

    VK_HELP 2F HELP key

    VK_0 30 0 key

    VK_1 31 1 key

    VK_2 32 2 key

    VK_3 33 3 key

    VK_4 34 4 key

    VK_5 35 5 key

    VK_6 36 6 key

    VK_7 37 7 key

    VK_8 38 8 key

    VK_9 39 9 key

    -- 3A40 Undefined

    VK_A 41 A key

    VK_B 42 B key

    VK_C 43 C key

    VK_D 44 D key

    VK_E 45 E key

    VK_F 46 F key

    VK_G 47 G key

    VK_H 48 H key

    VK_I 49 I key

    VK_J 4A J key

    VK_K 4B K key

    VK_L 4C L key

    VK_M 4D M key

    VK_N 4E N key

    VK_O 4F O key

    VK_P 50 P key

    VK_Q 51 Q key

    VK_R 52 R key

    VK_S 53 S key

    VK_T 54 T key

    VK_U 55 U key

    VK_V 56 V key

    VK_W 57 W key

    VK_X 58 X key

    VK_Y 59 Y key

    VK_Z 5A Z key

    -- 5B5F Undefined

    VK_NUMPAD0 60 Numeric keypad 0 key

    VK_NUMPAD1 60 Numeric keypad 1 key

    VK_NUMPAD2 60 Numeric keypad 2 key

    VK_NUMPAD3 60 Numeric keypad 3 key

    VK_NUMPAD4 60 Numeric keypad 4 key

    VK_NUMPAD5 60 Numeric keypad 5 key

    VK_NUMPAD6 60 Numeric keypad 6 key

    VK_NUMPAD7 60 Numeric keypad 7 key

    VK_NUMPAD8 60 Numeric keypad 8 key

    VK_NUMPAD9 60 Numeric keypad 9 key

    VK_MULTIPLY 6A Numeric Multiply key

    VK_ADD 6B Numeric Add key

    VK_SEPARATOR 6C Numeric Separator key

    VK_SUBTRACT 6D Numeric Subtract key

    VK_DECIMAL 6E Decimal key

    VK_DIVIDE 6F Divide key

    VK_F1 70 F1 key

    VK_F2 71 F2 key

    VK_F3 72 F3 key

    VK_F4 73 F4 key

    VK_F5 74 F5 key

    VK_F6 75 F6 key

    VK_F7 76 F7 key

    VK_F8 77 F8 key

    VK_F9 78 F9 key

    VK_F10 79 F10 key

    VK_F11 7A F11 key

    VK_F12 7B F12 key

    VK_F13 7C F13 key

    VK_F14 7D F14 key

    VK_F15 7E F15 key

    VK_F16 7F F16 key

    VK_F17 80H F17 key

    VK_F18 81H F18 key

    VK_F19 82H F19 key

    VK_F20 83H F20 key

    VK_F21 84H F21 key

    VK_F22 85H F22 key

    VK_F23 86H F23 key

    VK_F24 87H F24 key

    -- 88-8F Unassigned

    VK_NUMLOCK 90 NUM LOCK key

    VK_SCROLL 91 SCROLL LOCK key

    -- 929B Unassigned

    -- BAC0 OEM specific

    -- C1DA Unassigned

    -- DBE4 OEM specific

    -- E5 Unassigned

    -- E6 OEM specific

    -- E7E8 Unassigned

    -- E9F5 OEM specific

    -- F6FE Unassigned

    ------------- ------------- ----------------------------





    ssShift The Shift key is held down.

    ssAlt The Alt key is held down.

    ssCtrl The Ctrl key is held down.

    ssLeft The left mouse button is held down.

    ssMiddle The middle mouse button is held down.

    ssDouble The mouse was double-clicked.



    델초보 wrote:

    > 안녕하세요

    >

    > MDI 의 메인 폼에서는 keypreview 가 동작을 안 하네요.

    > childform 에서는 되는데...

    > 메인 폼에서 키보드 누름을 알수는 없나요?

    > shift / alt / ctrl 키를 조합해서 누르는 것을 할려고 하는데 안돼요..

    >

    > SHIFT+ALT_F9 / CTRL+ALT_F9 이런걸 메인폼에서도 잡고 싶은데

    > 방법 좀 알려 주세요..어딘가에서 구한 소스로는 조합키를 잡지 못합니다.

    > 쉽게 얘기해서 CTRL+ALT_F9 하는거나 SHIFT+ALT_F9하는거나 F9를 누르는거나

    > 동일한 결과가 나와요. 정확하게 키보드를 제어하고 싶은데..방법 좀 알려 주세요

    >

    > 참고로 제가 찾아서 테스트한 관련자료를 올립니다.

    > 이걸로는 설명드린 결과만이 나오네요.

    >

    >

    > //======================================================================

    > unit Unit1;

    >

    > interface

    >

    > uses

    > Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

    > StdCtrls;

    >

    > type

    > TForm1 = class(TForm)

    > procedure FormCreate(Sender: TObject);

    > private

    > { Private declarations }

    > public

    > { Public declarations }

    > procedure ChangminKeyInterceptor(var Msg: TMsg; var Handled: Boolean);

    > end;

    >

    > var

    > Form1: TForm1;

    >

    > implementation

    >

    > {$R *.DFM}

    >

    > procedure TForm1.ChangminKeyInterceptor(var Msg: TMsg; var Handled: Boolean);

    > begin

    > if (Form1 <> nil) and

    > (Msg.Message = WM_KEYDOWN) then

    > begin

    > if (Msg.wParam = VK_DELETE) then ShowMessage('Delete 키를 눌렸다.');

    > if (Msg.wParam = VK_RETURN) then ShowMessage('Enter 키를 눌렸다.');

    > if (Msg.wParam = VK_F9) then showMessage('F9 키를 눌렀다.');

    > end;

    >

    > if (Form1 <> nil) and

    > (Msg.Message = WM_KEYUP) then

    > begin

    > if (Msg.wParam = VK_DELETE) then ShowMessage('Delete 키를 뗏다.');

    > if (Msg.wParam = VK_RETURN) then ShowMessage('Enter 키를 뗏다.');

    > if (Msg.wParam = VK_F9) then ShowMessage('F9 Key 키를 뗏다.');

    > end;

    > end;

    >

    >

    >

    > procedure TForm1.FormCreate(Sender: TObject);

    > begin

    > Application.OnMessage := ChangminKeyInterceptor;

    > end;

    >

  • Profile
    델초보 2001.04.13 20:28
    박태준 wrote:

    > form1의 프로퍼티 창에서 keypreview를 True로 한다

    > event 중 onkeydown 이벤트를 등록하고

    >

    > procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;

    > Shift: TShiftState);

    > begin

    > if ( key =vk_delete) and ( shift =[ssShift]) then

    > showmessage('del + shift');

    > end;

    > 이렇게 하면 del 키와 shift 키를 먹을 것입니다.

    >

    > 밑의 헥사 값을 쓸려면 key= $2E 와 같겠죠

    > 10진 값은 key =46

    > 밑에 키값을 정리했으니 참고하세요

    > 이 값들은 나도 찾기 힘들어서 따로 저장해 두고 참고합니다.

    > 좋은 하루..

    >

    > Symbloic name Value(in hex) Mouse or keyboard equivalent

    > ------------- ------------- ----------------------------

    > VK_LBUTTON 01 Left mouse button

    > VK_RBUTTON 02 Right mouse button

    > VK_CANCEL 03 Used for control break processing

    > VK_MBUTTON 04 Middle mouse button(three-button mouse)

    > -- 05-07 Undefined

    > VK_BACK 08 BACKSPACE key

    >

    > VK_TAB 09 TAB key

    > -- 0A0B Undefined

    > VK_CLEAR 0C CLEAR key

    > VK_RETURN 0D ENTER key

    > -- 0E0F Undefined

    > VK_SHIFT 10 SHIFT key

    > VK_CONTROL 11 CTRL key

    > VK_MENU 12 ALT key

    > VK_PAUSE 13 PAUSE key

    > VK_CAPITAL 14 CAPS LOCK key

    > -- 15-19 Reserved for Kanji systems

    > -- 1A Undefined

    > VK_ESCAPE 1B ESC key

    > -- 1C-1F Reserved for Kanji systems

    > VK_SPACE 20 SPACEBAR

    > VK_PRIOR 21 PAGE UP key

    > VK_NEXT 22 PAGE DOWN key

    > VK_END 23 END key

    > VK_HOME 24 HOME key

    > VK_LEFT 25 LEFT ARROW key

    > VK_UP 26 UP ARROW key

    > VK_RIGHT 27 RIGHT ARROW key

    > VK_DOWN 28 DOWN ARROW key

    > VK_SELECT 29 SELECT key

    > -- 2A OEM specific

    > VK_EXECUTE 2B EXECUTE key

    > VK_SNAPSHOT 2C PRINT SCREEN key for Windows 3.0 and later

    > VK_INSERT 2D INS key

    > VK_DELETE 2E DEL key

    > VK_HELP 2F HELP key

    > VK_0 30 0 key

    > VK_1 31 1 key

    > VK_2 32 2 key

    > VK_3 33 3 key

    > VK_4 34 4 key

    > VK_5 35 5 key

    > VK_6 36 6 key

    > VK_7 37 7 key

    > VK_8 38 8 key

    > VK_9 39 9 key

    > -- 3A40 Undefined

    > VK_A 41 A key

    > VK_B 42 B key

    > VK_C 43 C key

    > VK_D 44 D key

    > VK_E 45 E key

    > VK_F 46 F key

    > VK_G 47 G key

    > VK_H 48 H key

    > VK_I 49 I key

    > VK_J 4A J key

    > VK_K 4B K key

    > VK_L 4C L key

    > VK_M 4D M key

    > VK_N 4E N key

    > VK_O 4F O key

    > VK_P 50 P key

    > VK_Q 51 Q key

    > VK_R 52 R key

    > VK_S 53 S key

    > VK_T 54 T key

    > VK_U 55 U key

    > VK_V 56 V key

    > VK_W 57 W key

    > VK_X 58 X key

    > VK_Y 59 Y key

    > VK_Z 5A Z key

    > -- 5B5F Undefined

    > VK_NUMPAD0 60 Numeric keypad 0 key

    > VK_NUMPAD1 60 Numeric keypad 1 key

    > VK_NUMPAD2 60 Numeric keypad 2 key

    > VK_NUMPAD3 60 Numeric keypad 3 key

    > VK_NUMPAD4 60 Numeric keypad 4 key

    > VK_NUMPAD5 60 Numeric keypad 5 key

    > VK_NUMPAD6 60 Numeric keypad 6 key

    > VK_NUMPAD7 60 Numeric keypad 7 key

    > VK_NUMPAD8 60 Numeric keypad 8 key

    > VK_NUMPAD9 60 Numeric keypad 9 key

    > VK_MULTIPLY 6A Numeric Multiply key

    > VK_ADD 6B Numeric Add key

    > VK_SEPARATOR 6C Numeric Separator key

    > VK_SUBTRACT 6D Numeric Subtract key

    > VK_DECIMAL 6E Decimal key

    > VK_DIVIDE 6F Divide key

    > VK_F1 70 F1 key

    > VK_F2 71 F2 key

    > VK_F3 72 F3 key

    > VK_F4 73 F4 key

    > VK_F5 74 F5 key

    > VK_F6 75 F6 key

    > VK_F7 76 F7 key

    > VK_F8 77 F8 key

    > VK_F9 78 F9 key

    > VK_F10 79 F10 key

    > VK_F11 7A F11 key

    > VK_F12 7B F12 key

    > VK_F13 7C F13 key

    > VK_F14 7D F14 key

    > VK_F15 7E F15 key

    > VK_F16 7F F16 key

    > VK_F17 80H F17 key

    > VK_F18 81H F18 key

    > VK_F19 82H F19 key

    > VK_F20 83H F20 key

    > VK_F21 84H F21 key

    > VK_F22 85H F22 key

    > VK_F23 86H F23 key

    > VK_F24 87H F24 key

    > -- 88-8F Unassigned

    > VK_NUMLOCK 90 NUM LOCK key

    > VK_SCROLL 91 SCROLL LOCK key

    > -- 929B Unassigned

    > -- BAC0 OEM specific

    > -- C1DA Unassigned

    > -- DBE4 OEM specific

    > -- E5 Unassigned

    > -- E6 OEM specific

    > -- E7E8 Unassigned

    > -- E9F5 OEM specific

    > -- F6FE Unassigned

    > ------------- ------------- ----------------------------

    >

    >

    > ssShift The Shift key is held down.

    > ssAlt The Alt key is held down.

    > ssCtrl The Ctrl key is held down.

    > ssLeft The left mouse button is held down.

    > ssMiddle The middle mouse button is held down.

    > ssDouble The mouse was double-clicked.

    >

    > 델초보 wrote:

    > > 안녕하세요

    > >

    > > MDI 의 메인 폼에서는 keypreview 가 동작을 안 하네요.

    > > childform 에서는 되는데...

    > > 메인 폼에서 키보드 누름을 알수는 없나요?

    > > shift / alt / ctrl 키를 조합해서 누르는 것을 할려고 하는데 안돼요..

    > >

    > > SHIFT+ALT_F9 / CTRL+ALT_F9 이런걸 메인폼에서도 잡고 싶은데

    > > 방법 좀 알려 주세요..어딘가에서 구한 소스로는 조합키를 잡지 못합니다.

    > > 쉽게 얘기해서 CTRL+ALT_F9 하는거나 SHIFT+ALT_F9하는거나 F9를 누르는거나

    > > 동일한 결과가 나와요. 정확하게 키보드를 제어하고 싶은데..방법 좀 알려 주세요

    > >

    > > 참고로 제가 찾아서 테스트한 관련자료를 올립니다.

    > > 이걸로는 설명드린 결과만이 나오네요.

    > >

    > >

    > > //======================================================================

    > > unit Unit1;

    > >

    > > interface

    > >

    > > uses

    > > Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

    > > StdCtrls;

    > >

    > > type

    > > TForm1 = class(TForm)

    > > procedure FormCreate(Sender: TObject);

    > > private

    > > { Private declarations }

    > > public

    > > { Public declarations }

    > > procedure ChangminKeyInterceptor(var Msg: TMsg; var Handled: Boolean);

    > > end;

    > >

    > > var

    > > Form1: TForm1;

    > >

    > > implementation

    > >

    > > {$R *.DFM}

    > >

    > > procedure TForm1.ChangminKeyInterceptor(var Msg: TMsg; var Handled: Boolean);

    > > begin

    > > if (Form1 <> nil) and

    > > (Msg.Message = WM_KEYDOWN) then

    > > begin

    > > if (Msg.wParam = VK_DELETE) then ShowMessage('Delete 키를 눌렸다.');

    > > if (Msg.wParam = VK_RETURN) then ShowMessage('Enter 키를 눌렸다.');

    > > if (Msg.wParam = VK_F9) then showMessage('F9 키를 눌렀다.');

    > > end;

    > >

    > > if (Form1 <> nil) and

    > > (Msg.Message = WM_KEYUP) then

    > > begin

    > > if (Msg.wParam = VK_DELETE) then ShowMessage('Delete 키를 뗏다.');

    > > if (Msg.wParam = VK_RETURN) then ShowMessage('Enter 키를 뗏다.');

    > > if (Msg.wParam = VK_F9) then ShowMessage('F9 Key 키를 뗏다.');

    > > end;

    > > end;

    > >

    > >

    > >

    > > procedure TForm1.FormCreate(Sender: TObject);

    > > begin

    > > Application.OnMessage := ChangminKeyInterceptor;

    > > end;

    > >