2012-11-23 4 views
0

WPF 용 SendInput과 동일한 기능이 있습니까? 나는 AutomationPeer 클래스를 조사했지만 성공하지 못했습니다.WPF SendInput과 동일합니까?

간단히 Keydown (Enter 키)을 보내려고합니다. 단순히 시나리오 (RaiseEvent)를 올리는 것은 내 시나리오에서 작동하지 않습니다.

다음은 현재 작동하고있는 작업입니다. 나는 관리 코드 대안을 선호하고 싶다. ,

SendKey(myComboBox, Key.Enter); 

난 당신이 어딘가에 static class이를 넣을 수 있습니다 가정 :

public void SendKey(UIElement sourceElement, Key keyToSend) 
    { 

     KeyEventArgs args = new KeyEventArgs(InputManager.Current.PrimaryKeyboardDevice, PresentationSource.FromVisual(sourceElement), 0, keyToSend); 

     args.RoutedEvent = Keyboard.KeyDownEvent; 
     InputManager.Current.ProcessInput(args); 

    } 

당신은 다음과 같이 호출 할 수 :

private void comboSelectionChanged(object sender, SelectionChangedEventArgs args) 
    { 
     ((ComboBox)sender).Focus(); 
     // send keydown 
     INPUT input = new INPUT(); 
     input.type = INPUT_KEYBOARD; 
     input.union.keyboardInput.wVk = 0x0D; 
     input.union.keyboardInput.time = 0; 
     SendInput(1, ref input, Marshal.SizeOf(input)); 
    } 

    [DllImport("user32.dll", SetLastError = true)] 
    private static extern int SendInput(int nInputs, ref INPUT mi, int cbSize); 

    [StructLayout(LayoutKind.Sequential)] 
    private struct INPUT 
    { 
     public int type; 
     public INPUTUNION union; 
    }; 

    [StructLayout(LayoutKind.Explicit)] 
    private struct INPUTUNION 
    { 
     [FieldOffset(0)] 
     public MOUSEINPUT mouseInput; 
     [FieldOffset(0)] 
     public KEYBDINPUT keyboardInput; 
    }; 

    [StructLayout(LayoutKind.Sequential)] 
    private struct MOUSEINPUT 
    { 
     public int dx; 
     public int dy; 
     public int mouseData; 
     public int dwFlags; 
     public int time; 
     public IntPtr dwExtraInfo; 
    }; 

    [StructLayout(LayoutKind.Sequential)] 
    private struct KEYBDINPUT 
    { 
     public short wVk; 
     public short wScan; 
     public int dwFlags; 
     public int time; 
     public IntPtr dwExtraInfo; 
    }; 

    private const int INPUT_MOUSE = 0; 
    private const int INPUT_KEYBOARD = 1; 
+0

왜 그렇게 했습니까? –

+0

@HighCore Im 편집 가능한 ComboBox를 사용하는 경우 드롭 다운에서 값을 선택하면 텍스트가 선택되어 지우겠습니다. –

+0

OMG .. 그리고 당신은 SendKeys를 사용하여 그것을하고 싶습니까 ?? 그건 정말 나쁜 접근 방식이야. 왜 그냥 콤보 박스 텍스트 속성을 지우지 않았을까? –

답변

6

는이 같은 키 입력을 에뮬레이션 할 수 있습니다 심지어는 extension method을 만들 수도 있습니다. 그러나 나는 대부분의 경우 이것을 성취하기위한 더 우아한 방법이 있다고 주장 할 것이다.

나는이 도움이되기를 바랍니다.

+0

감사합니다. 게시하기 전에 마침내 완전히 내 접근 방식을 변경했습니다. (아직 다른 사용자 정의 컨트롤을 작성했습니다 ...)하지만이 방법도 시도해 보았습니다. –

+0

Ctrl + F와 같은 결합 키를 보내려면 어떻게해야합니까? – newman

+1

아쉽게도 TextBox가 Text 속성을 변경하지 않습니다. TextBox가 텍스트를 업데이트하게하는 KeyDownEvent를 에뮬레이트 할 가능성이 있습니까? –

관련 문제