here을 지원하는 답변이 들어있는 비슷한 질문을 발견했습니다. 이것은 올바른 해결책을 제시해주었습니다.
Keyboard.Modifiers는 Windows 키 (적어도 내 Win8 인스턴스에서는)를 감지 할 수 없습니다.
대신 나는 Keyboard.IsKeyDown
을 사용하여 다른 방식으로 windows 키를 처리해야했습니다. 이것은 눌려진 키 (내 LowLevelKeyboardProc에서)와 현재 눌려진 수정 자 키의 조합이 정의 된 키와 같고 속성이 HotKey
및 HotKeyModifiers
인 수정 자와 같은지 확인하는 메소드를 작성했습니다. 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의