2013-10-14 3 views
0

나는 실행중인 응용 프로그램을 표시하기 위해 키보드를 캡처하기 위해 SetWindowsHookEx를 사용하고 있습니다. CTRL, ALT, SHIFT 및 일반 키를 사용하여 조합을 만들 수 있습니다. 그러나 Windows 키 (예 : Ctrl + WINDOWS + A)를 사용하여 조합을 만들 수는 없습니다.Windows 키가 포함 된 글로벌 단축키 조합을 어떻게 만들 수 있습니까?

게임을 실행 중일 때 Windows 8 시작 화면을 방지하기 위해 WINDOWS 키를 캡처하는 방법에 대한 기사를 보았지만 결코 조합을 만들지는 않았습니다.

AutoHotKey와 같은 소프트웨어가 이러한 조합을 캡처 할 수 있음을 알고 있습니다.

SetWindowsHookEx가 잘못된 방법입니까?

답변

0

here을 지원하는 답변이 들어있는 비슷한 질문을 발견했습니다. 이것은 올바른 해결책을 제시해주었습니다.

Keyboard.Modifiers는 Windows 키 (적어도 내 Win8 인스턴스에서는)를 감지 할 수 없습니다.

대신 나는 Keyboard.IsKeyDown을 사용하여 다른 방식으로 windows 키를 처리해야했습니다. 이것은 눌려진 키 (내 LowLevelKeyboardProc에서)와 현재 눌려진 수정 자 키의 조합이 정의 된 키와 같고 속성이 HotKeyHotKeyModifiers 인 수정 자와 같은지 확인하는 메소드를 작성했습니다. IsKeyCombinationPressed위한

/// <summary> 
/// Called by windows when a keypress occurs. 
/// </summary> 
/// <param name="nCode">A code the hook procedure uses to determine how to process the message. If nCode is less than zero, the hook procedure must pass the message to the CallNextHookEx function without further processing and should return the value returned by CallNextHookEx.</param> 
/// <param name="wParam">The identifier of the keyboard message. This parameter can be one of the following messages: WM_KEYDOWN, WM_KEYUP, WM_SYSKEYDOWN, or WM_SYSKEYUP. </param> 
/// <param name="lParam">A pointer to a KBDLLHOOKSTRUCT structure. </param> 
private IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam) 
{ 
    if (nCode >= 0 && (wParam == (IntPtr)WM_KEYDOWN || wParam == (IntPtr)WM_SYSKEYDOWN)) 
    { 
     int vkCode = Marshal.ReadInt32(lParam); 
     var keyPressed = KeyInterop.KeyFromVirtualKey(vkCode); 

     if (IsKeyCombinationPressed(keyPressed)) 
      OnKeyCombinationPressed(new EventArgs()); 
    } 

    return CallNextHookEx(_hookId, nCode, wParam, lParam); 
} 

그리고 C 번호() 메소드 :

/// <summary> 
/// Returns true if the registered key combination is pressed 
/// </summary> 
/// <remarks> 
/// Keyboard.Modifiers doesn't pick up the windows key (at least on Windows 8) so we use Keyboard.IsKeyDown to detect it (if required). 
/// </remarks> 
bool IsKeyCombinationPressed(Key keyPressed) 
{ 
    if (keyPressed != HotKey) return false; 

    //Handle windows key 
    bool isWindowsKeyRequired = (HotKeyModifiers & ModifierKeys.Windows) != 0; 
    bool isWindowsKeyPressed = Keyboard.IsKeyDown(Key.LWin) || Keyboard.IsKeyDown(Key.RWin); 

    //Remove windows key from modifiers (if required) 
    ModifierKeys myModifierKeys = isWindowsKeyRequired ? HotKeyModifiers^ModifierKeys.Windows : HotKeyModifiers; 
    bool isModifierKeysPressed = Keyboard.Modifiers == myModifierKeys; 

    return isWindowsKeyRequired 
     ? isWindowsKeyPressed && isModifierKeysPressed 
     : isModifierKeysPressed; 
} 
여기

는 LowLevelKeyboardProc의 번호 C의