시스템 변환 방법창문들.'시스템'에 Input.Key를 입력합니다.창문들.양식. 열쇠?
WPF에서 애플리케이션을 개발하고 있는데 일부 컴포넌트가 WinForms를 사용하여 작성되어 있습니다.이러한 컴포넌트는 WPF 부품에서 키 제스처를 가져와 키 열거형(WinForms에서 사용)으로 변환하지 않습니다.
이를 위한 컨버터가 내장되어 있습니까? (아마 없을 것입니다) "대형 스위치 케이스보다 쉬운" 방법을 알고 계십니까?
Keys formsKey = ...;
Key wpfKey = ...;
wpfKey = KeyInterop.KeyFromVirtualKey((int)formsKey);
formsKey = (Keys)KeyInterop.VirtualKeyFromKey(wpfKey);
KeyInterop 클래스는 "키"이며 Windows Forms는Keys
열거에는 Win 32 가상 키 코드와 같은 정수 값이 있습니다.
7년 후에도 여전히 수식어 문제에 직면할 경우를 대비해서, 지금까지 효과가 있었던 제 해결책은 다음과 같습니다.
public static class KeyEventExts
{
public static System.Windows.Forms.KeyEventArgs ToWinforms(this System.Windows.Input.KeyEventArgs keyEventArgs)
{
// So far this ternary remained pointless, might be useful in some very specific cases though
var wpfKey = keyEventArgs.Key == System.Windows.Input.Key.System ? keyEventArgs.SystemKey : keyEventArgs.Key;
var winformModifiers = keyEventArgs.KeyboardDevice.Modifiers.ToWinforms();
var winformKeys = (System.Windows.Forms.Keys)System.Windows.Input.KeyInterop.VirtualKeyFromKey(wpfKey);
return new System.Windows.Forms.KeyEventArgs(winformKeys | winformModifiers);
}
public static System.Windows.Forms.Keys ToWinforms(this System.Windows.Input.ModifierKeys modifier)
{
var retVal = System.Windows.Forms.Keys.None;
if(modifier.HasFlag(System.Windows.Input.ModifierKeys.Alt))
{
retVal |= System.Windows.Forms.Keys.Alt;
}
if (modifier.HasFlag(System.Windows.Input.ModifierKeys.Control))
{
retVal |= System.Windows.Forms.Keys.Control;
}
if (modifier.HasFlag(System.Windows.Input.ModifierKeys.None))
{
// Pointless I know
retVal |= System.Windows.Forms.Keys.None;
}
if (modifier.HasFlag(System.Windows.Input.ModifierKeys.Shift))
{
retVal |= System.Windows.Forms.Keys.Shift;
}
if (modifier.HasFlag(System.Windows.Input.ModifierKeys.Windows))
{
// Not supported lel
}
return retVal;
}
}
수식자를 변환하려면 KeyEventArgs를 사용하는 경우 SystemKey를 사용합니다.
System.Windows.Input.KeyEventArgs args;
System.Windows.Input.Key wpfKey= args.Key == Key.System ? args.SystemKey : args.Key;
formsKey = (System.Windows.Forms.Keys)KeyInterop.VirtualKeyFromKey(wpfKey);
WPF 열거를 대응하는 WinForm 열거로 변환하려면 의 스태틱멤버를 사용합니다.Enum
클래스:
Enum.TryParse(wpfKeyEnum.ToString(), out System.Windows.Forms.Keys winFormsKeyEnum)
WPF 수식자(ModifierKeys 열거형)는 Windows 키를 제외하고 동일한 방법으로 변환할 수 있습니다.와는 대조적으로Windows.Input.ModifierKeys
WPF의 열거Windows.Forms.Keys
열거는 왼쪽과 오른쪽의 Windows 키를 구분하여 대응하는 Windows 키를 정의합니다.LWin
한 사람RWin
[ ]를 클릭합니다.
이 변환 방식은 양방향으로 작동합니다.
예
이 예에서는,Key
그리고.ModifierKeys
대응하는 WinForms에 대한 WPF 키업 이벤트 열거Keys
열거.
부터Windows.Input.Key
로.System.Windows.Forms.Keys
private void OnPreviewKeyUp(object sender, System.Windows.Input.KeyEventArgs e)
{
// Convert key
if (Enum.TryParse(e.Key.ToString(), out System.Windows.Forms.Keys winFormsKey))
{
MessageBox.Show(winFormsKey + "=" + (int) winFormsKey); // A=65
}
}
부터Windows.Input.ModifierKeys
로.System.Windows.Forms.Keys
private void OnPreviewKeyUp(object sender, System.Windows.Input.KeyEventArgs e)
{
ModifierKeys modifiers = e.KeyboardDevice.Modifiers;
IEnumerable<ModifierKeys> pressedModifierKeys = Enum.GetValues(modifiers.GetType())
.Cast<ModifierKeys>()
.Where(modifiers.HasFlag);
// The ModifierKeys enumeration has a FlagsAttribute attribute
foreach (ModifierKeys modifier in pressedModifierKeys)
{
if (Enum.TryParse(modifier.ToString(), out System.Windows.Forms.Keys winFormsModifierKey))
{
MessageBox.Show(winFormsModifierKey + "=" + (int) winFormsModifierKey); // Alt=262144
}
}
}
언급URL : https://stackoverflow.com/questions/1153009/how-can-i-convert-system-windows-input-key-to-system-windows-forms-keys
'programing' 카테고리의 다른 글
Swift - 시/분/초로 정수 변환 (0) | 2023.04.16 |
---|---|
TextBox에 추가하는 이유는 무엇입니까?루프 중에 텍스트가 반복될 때마다 더 많은 메모리를 차지합니까? (0) | 2023.04.16 |
Swift의 Int 선행 0 (0) | 2023.04.16 |
콘솔을 클리어하려면 (0) | 2023.04.16 |
셸 스크립트의 행 끝에 세미콜론이 필요합니까? (0) | 2023.04.11 |