2011-05-13 3 views
6

다른 응용 프로그램에서 특정 동작을 유발하기 위해 키 누름을 시뮬레이트해야하는 프로젝트에서 작업 중입니다.+, -, 또는 Enter (키 누르기 시뮬레이션)와 같은 범프의 특정 키 보내기

가져 오는 keybd_event 함수를 사용하면 모든 것이 잘 실행되고 있습니다 (더 좋은 방법이있을 수 있지만 제대로 작동 중입니다).

이제 모든 숫자판에 대한 특정 지원을 추가하고 싶습니다.

e. 지. 여기 http://msdn.microsoft.com/en-us/library/dd375731(v=VS.85).aspx 또는 System.Windows.Input.Key 네임 스페이스에서 NumLock뿐 아니라 Num0..Num9에 대한 키를 쉽게 찾을 수 있습니다.

e.KeyCode NumLock e.KeyData NumLock e.KeyValue 144 e.Modifiers None 
e.KeyCode Divide e.KeyData Divide e.KeyValue 111 e.Modifiers None 
e.KeyCode Multiply e.KeyData Multiply e.KeyValue 106 e.Modifiers None 
e.KeyCode Subtract e.KeyData Subtract e.KeyValue 109 e.Modifiers None 
e.KeyCode Add e.KeyData Add e.KeyValue 107 e.Modifiers None 
e.KeyCode NumLock e.KeyData NumLock e.KeyValue 144 e.Modifiers None 
e.KeyCode NumLock e.KeyData NumLock e.KeyValue 144 e.Modifiers None 
e.KeyCode Divide e.KeyData Divide e.KeyValue 111 e.Modifiers None 
e.KeyCode Multiply e.KeyData Multiply e.KeyValue 106 e.Modifiers None 
e.KeyCode Subtract e.KeyData Subtract e.KeyValue 109 e.Modifiers None 
e.KeyCode Add e.KeyData Add e.KeyValue 107 e.Modifiers None 
e.KeyCode Return e.KeyData Return e.KeyValue 13 e.Modifiers None 

:

내가 몇 가지 흥미로운 결과를 빠른 이벤트 paramters를 출력의를 keyDown 이벤트를 잡기 위해 응용 프로그램을 froms 쓰고, 도착 등하지만 .. 난 민/민 +, NumEnter에 대한 아무것도 찾을 수 없습니다 Num + Key (등)는 Windows가 기능 키 (Num + 키의 경우 F18과 같은)를 호출하는 키인 것처럼 보입니다. 그래서 .. 그것은 이상하다. 그러나 ok.

하지만 .. Enter-Key와 NumEnter Key를 구분할 수 없습니다. 그것들은 내 응용 프로그램에 따라 다르므로 두 가지 모두에 대해 특정 키 코드를 보내야합니다.

그리고 그것은 내 질문입니다 : 어떻게 일반 입력 키를 보낼 수 있습니까? 그리고 어떻게 NumEnter 키를 보낼 수 있습니까?

(내가 독일의 키보드 레이아웃 오전, 그것은 어떤 차이가 있는지 알 수 없습니다.) 어떤 아이디어에 대한

들으!

+1

하지,하지만 난 확인할 수 있습니다 : 여기에 더 완전한 버전의 우리는 응용 프로그램 추적 사용자 입력을 가지고 있고 지금은 내가 구별 수없는 입력에서 NumEnter에 대해 동일한 키 코드를 생성합니다. – Cilvic

답변

0

당신이하는 더 - 다른 방향 라운드 솔루션에 대해 얘기 이벤트를 감지하고, 나는 그것을 인상하려는 때문에, 나는 심지어의 WndProc를 오버라이드 (override) 할 필요가 없습니다. 나는 단순히 내 자신의 메시지를 보낼 수 있습니다.

귀하의 솔루션에서, 나는 SendMessage/PostMessage를 살펴본 다음 WM_KEYDOWN과 WM_KEYUP을 살펴 보았습니다. 설명서는 실제로 정보를 제공합니다 (실제로 열심히 본 경우). http://msdn.microsoft.com/en-us/library/ms646281(v=vs.85).aspx

http://msdn.microsoft.com/en-us/library/ms646280(v=vs.85).aspx
그래서 내 솔루션은 (지금 어디 텍스트)를 입력 할 수있는 권리 창 (찾는 컴파일)이 같다 :

bool keyDown = true; // true = down, false = up 
const uint WM_KEYDOWN = 0x0100; 
const uint WM_KEYUP = 0x0101; 
const int VK_RETURN = 0x0D; 

IntPtr handle = IntPtr.Zero; 
// Obtain the handle of the foreground window (active window and focus window are only relative to our own thread!!) 
IntPtr foreGroundWindow = GetForegroundWindow(); 
// now get process id of foreground window 
uint processID; 
uint threadID = GetWindowThreadProcessId(foreGroundWindow, out processID); 
if (processID != 0) 
{ 
// now get element with (keyboard) focus from process 
GUITHREADINFO threadInfo = new GUITHREADINFO(); 
threadInfo.cbSize = Marshal.SizeOf(threadInfo); 
GetGUIThreadInfo(threadID, out threadInfo); 
handle = (IntPtr)threadInfo.hwndFocus; 
} 

int lParam = 1 << 24; // this specifies NumPad key (extended key) 
lParam |= (keyDown) ? 0 : (1 << 30 | 1 << 31); // mark key as pressed if we use keyup message 
PostMessage(handle, (keyDown) ? WM_KEYDOWN : WM_KEYUP, VK_RETURN, lParam); // send enter 

는 희망이 다른 사람에게 유용합니다 게다가. Vendetta의 팁이 나에게 있었다.

그리고 더 나은 해결책이 있다면 그렇게 말하십시오!

3

이 파일을 찾았습니다. here이 저에게 효과적입니다!

protected override void WndProc(ref Message m) 
{ 
    if (m.Msg == 256 && m.WParam.ToInt32() == 13) 
    { // WM_KEYDOWN == 256, Enter == 13 
     if ((m.LParam.ToInt32() >> 24) == 0) 
     { 
      MessageBox.Show("main enter pressed!"); 
     } 
     else 
     { 
      MessageBox.Show("numpad enter pressed!"); 
     } 
     } 
     else 
     { 
     base.WndProc(ref m); 
     } 
} 
+0

Thx 많이, 정말 도움이되었습니다. 내가 찾고있는 것 이외의 다른 방법이지만 :) 내 문제를 해결하기위한 모든 정보가 있습니다. 나는 곧바로 답을 쓸 것입니다. –

+0

답장을 많이하십시오! 특히 yor 아이디어를 위해, Vendetta! 당신은 다른 방향의 해결책에 대해 이야기하고 이벤트를 감지 했으므로이를 제기하고자하므로 WndProc을 재정의 할 필요조차 없습니다. 나는 단순히 내 자신의 메시지를 보낼 수 있습니다. 솔루션에서 SendMessage를 살펴본 다음 WM_KEYDOWN 및 WM_KEYUP을 살펴 보았습니다. 설명서는 실제로 정보를 제공합니다 (실제로 열심히 본 경우). http://msdn.microsoft.com/en-us/library/ms646280(v=vs.85).aspx http://msdn.microsoft.com/en-us/library/ms646281(v=vs) .85) .aspx –

+0

내 솔루션 (컴파일했지만 테스트하지 않음)은 다음과 같습니다. bool keyDown; // true = down, false = up const uint WM_KEYDOWN = 0x0100; const uint WM_KEYUP = 0x0101; const int VK_RETURN = 0x0D; // 활성 창의 핸들을 가져옵니다. IntPtr handle = GetForegroundWindow(); int lParam = 1 << 24; // NumPad 키 (확장 키)를 지정합니다 lParam | = (keyDown)? 0 : (1 << 30 | 1 << 31); // 키 업 메시지를 사용하면 키를 눌렀 음을 표시합니다. PostMessage (handle, (keyDown)? WM_KEYDOWN : WM_KEYUP, VK_RETURN, lParam); –

1

해결책의 시작을 제공하는 andreas 덕분입니다. 매우 도움이

[DllImport("user32.dll")] 
private static extern IntPtr PostMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam); 
[DllImport("user32.dll")] 
private static extern IntPtr GetForegroundWindow(); 
[DllImport("user32.dll")] 
private static extern uint GetWindowThreadProcessId(IntPtr hWnd, out uint lpdwProcessId); 
[DllImport("user32.dll")] 
private static extern bool GetGUIThreadInfo(uint idThread, out GUITHREADINFO lpgui); 

public struct GUITHREADINFO 
{ 
    public int cbSize; 
    public int flags; 
    public int hwndActive; 
    public int hwndFocus; 
    public int hwndCapture; 
    public int hwndMenuOwner; 
    public int hwndMoveSize; 
    public int hwndCaret; 
    public System.Drawing.Rectangle rcCaret; 
} 

private void sendNumpadEnter() 
{ 
    bool keyDown = true; // true = down, false = up 
    const uint WM_KEYDOWN = 0x0100; 
    const uint WM_KEYUP = 0x0101; 
    const int VK_RETURN = 0x0D; 

    IntPtr handle = IntPtr.Zero; 
    // Obtain the handle of the foreground window (active window and focus window are only relative to our own thread!!) 
    IntPtr foreGroundWindow = GetForegroundWindow(); 
    // now get process id of foreground window 
    uint processID; 
    uint threadID = GetWindowThreadProcessId(foreGroundWindow, out processID); 
    if (processID != 0) 
    { 
     // now get element with (keyboard) focus from process 
     GUITHREADINFO threadInfo = new GUITHREADINFO(); 
     threadInfo.cbSize = Marshal.SizeOf(threadInfo); 
     GetGUIThreadInfo(threadID, out threadInfo); 
     handle = (IntPtr)threadInfo.hwndFocus; 
    } 

    int lParam = 1 << 24; // this specifies NumPad key (extended key) 
    lParam |= (keyDown) ? 0 : (1 << 30 | 1 << 31); // mark key as pressed if we use keyup message 

    PostMessage(handle, (keyDown) ? WM_KEYDOWN : WM_KEYUP, VK_RETURN, lParam); // send enter 
}