2013-02-17 4 views
2

"키로거"를 만들려고합니다 ... 키 입력 만 표시하고 파일에 기록하지 않기 때문에 완전히 키로거가 아닙니다. Google+ 행 아웃에서 사용하려고 했으므로 비디오 녹화 소프트웨어에서 키 입력을 사용하지 않고도 키 입력을 계속 표시 할 수 있습니다.C#의 KeyDown 및 KeyPress 이벤트 처리

private void OnKeyDown(object sender, KeyEventArgs e) 
{ 
    lblText.Text = ""; 
    lblText.Visible = false; 

    boxSpKey.Image = null; 
    boxSpKey.Visible = false; 

    boxCtrl.Visible = e.Control; 
    boxAlt.Visible = e.Alt; 
    boxWin.Visible = false; 
    boxShift.Visible = e.Shift; 

    Keys pKey = e.KeyData; 
    if (btnIcons.ContainsKey(pKey)) 
    { 
     boxSpKey.Visible = true; 
     boxSpKey.Image = btnIcons[pKey]; 
    } 

    // this part I haven't figured out either, but is irrelevant to my question. 
} 

private void OnKeyPress(object sender, KeyPressEventArgs e) 
{ 
    lblText.Visible = true; 
    lblText.Text = ((char)e.KeyChar).ToString(); 
} 

[컨텍스트 : lblText 키 텍스트가 포함 된 레이블, boxSpKey 내가 각각의 아이콘했습니다하는 등의 ESC와 같은 특수 키를위한 PictureBox입니다. boxCtrl, boxAlt, boxWinboxShiftPictureBox ES는 매우 설명이 필요 또한]

질문 :.

  1. e.Control, e.Alte.Shift의 값이 항상 거짓 것 같다, 그래서 각각의 PictureBox es는 나타나지 않을거야.

  2. Win 키의 상태는 어떻게 확인합니까? 낮은 수준의 VK_* 상수를 사용하지 않는 것이 좋습니다.

  3. OnKeyPress 대부분 수정 자 키를 사용하여 이벤트를 처리 할 때 임의 문자가 표시됩니다 ... 원래 키 획을 정확히 얻으려면 어떻게해야합니까? 즉 대신 Ctrl+Shift+B을 받고 싶습니다.


UPDATE : 나는 수정 키 낮은 수준을 이동하기로 결정했습니다, 그래서 나는 P/호출을 사용 :

[DllImport("user32.dll")] 
[return: MarshalAs(UnmanagedType.Bool)] 
static extern bool GetKeyboardState(byte[] lpKeyState); 

public static byte code(Keys key) 
{ 
    return (byte)((int)key & 0xFF); 
} 

private void OnKeyDown(object sender, KeyEventArgs e) 
{ 
    var array = new byte[256]; 
    GetKeyboardState(array); 

    // ... 

    if ((array[code(Keys.ControlKey)] & 0x80) != 0) 
     boxCtrl.Visible = true; 
    if ((array[code(Keys.LMenu)] & 0x80) != 0 || (array[code(Keys.RMenu)] & 0x80) != 0) 
     boxAlt.Visible = true; 
    if ((array[code(Keys.LWin)] & 0x80) != 0 || (array[code(Keys.RWin)] & 0x80) != 0) 
     boxWin.Visible = true; 
    if ((array[code(Keys.ShiftKey)] & 0x80) != 0) 
     boxShift.Visible = true; 

    // ... 
} 

좋은 소식은 내가 가지고 있다는 것입니다 Ctrl, WinShift 키는 작동하지만 Alt은 작동하지 않습니다. AltLMenuRMenu이 아닌 경우 뭐라 구요? Ctrl 키, Alt 키, 또는 시프트 개별적으로 Control, AltShiftKeyDown 이벤트 처리기에서 true를 반환하는 원인이을 누르면

+0

어떤 키를 사용하여 e.Modifiers 속성에 대해 비교에 대한, http://msdn.microsoft.com/ en-us/library/system.windows.forms.keys.aspx? Windows 키는 LWin 및 RWin을 참조하십시오. –

+1

내 키보드의 'Alt'키를 누르면 내 처리기의 'KeyCode'값인'Keys.Menu'가됩니다. 왼쪽과 오른쪽을 구분하지 않는 것 같습니다. 불행히도 테스트 할 다른 키보드가 없습니다. – gowansg

+0

@gowansg Odd ...'LMenu'와'RMenu' 키는 양쪽에있는'Alt' 키를 검사하기로되어 있습니다 만, 간단히'Keys.Menu'가 작동하는 것처럼 보입니다. 고마워 ~ –

답변

1
  1. . 각 키를 개별적으로 누르면 이벤트 핸들러에 false이 반환됩니다. KeyUp 이벤트를 처리하지 않으시겠습니까?

  2. @sean 우드워드가 말했듯이, Windows Key가 매핑해야 하나 Keys.LWin 또는 Keys.RWin

  3. 문자 키 중 하나를 누를 때와 누른 결과로 문자를 반환합니다 때 발생 만되는 KeyPress 이벤트 키 또는 누른 키의 조합. Ctrl+Shift+B은 문자가 아니므로 KeyChar만을 사용하면 해당 정보를 얻을 수 없습니다.KeyDown 또는 KeyUp 이벤트를 사용하고 Modifiers 속성을 살펴보면 수정 자 키가 눌러 진 쉼표로 구분 된 문자열을 얻으실 수 있습니다. 주문이 중요한 경우 Modifiers은 항상 키를 같은 순서 (예 : Shift, Control, Alt)로 반환한다는 점을 추적해야합니다. 여기

내가 사용되는 코드, 당신은 그것으로 장난 시도 할 수 있습니다 :


KeyDown += (o, ea) => 
{ 
    System.Diagnostics.Debug.WriteLine("KeyDown => CODE: " + ea.KeyCode + 
     ", DATA: " + ea.KeyData + 
     ", VALUE: " + ea.KeyValue + 
     ", MODIFIERS: " + ea.Modifiers + 
     ", CONTROL: " + ea.Control + 
     ", ALT: " + ea.Alt + 
     ", SHIFT: " + ea.Shift); 

}; 

KeyUp += (o, ea) => 
{ 
    System.Diagnostics.Debug.WriteLine("KeyUp => CODE: " + ea.KeyCode + 
     ", DATA: " + ea.KeyData + 
     ", VALUE: " + ea.KeyValue + 
     ", MODIFIERS: " + ea.Modifiers + 
     ", CONTROL: " + ea.Control + 
     ", ALT: " + ea.Alt + 
     ", SHIFT: " + ea.Shift); 
}; 

KeyPress += (o, ea) => 
{ 
    System.Diagnostics.Debug.WriteLine("KeyPress => CHAR: " + ea.KeyChar); 
};