Dreamine.UI.Wpf.Equipment 1.0.1
Dreamine.UI.Wpf.Equipment 사용자 인터페이스 기능과 구성 요소를 제공합니다.
로딩중...
검색중...
일치하는것 없음
Dreamine.UI.Wpf.Equipment.DreamineVirtualKeyboard.DreamineVirtualKeyboard 클래스 참조

더 자세히 ...

Dreamine.UI.Wpf.Equipment.DreamineVirtualKeyboard.DreamineVirtualKeyboard에 대한 상속 다이어그램 :
Dreamine.UI.Wpf.Equipment.DreamineVirtualKeyboard.DreamineVirtualKeyboard에 대한 협력 다이어그램:

Public 멤버 함수

 DreamineVirtualKeyboard ()
void Dispose ()
void ReleasePressedKeys ()

정적 Public 속성

static readonly RoutedEvent VirtualKeyDownEvent
static readonly DependencyProperty LayoutProperty
static readonly DependencyProperty IsPasswordLayoutProperty = IsPasswordLayoutPropertyKey.DependencyProperty

Protected 멤버 함수

void UpdateKeys ()
void UpdateLangKey ()
bool UpdateInputModeKey (bool readSystemIme=true)
void RefreshKeyboardLayout (string lang="")
virtual void Dispose (bool disposing)

Protected 속성

Panel? _layoutRoot
IEnumerable< Key >? _keys
Button? _langBtn
Button? _inputModeBtn

속성

EventHandler< LanguageCode >? OnKeyboardLanguageChanged [get, set]
bool InImeGuard [get]
bool InLangGuard [get]
bool HasPendingKoreanInputMode [get]
bool InShiftGuard [get]
VkLayout Layout [get, set]
bool IsPasswordLayout [get, private set]
LanguageCode CurrentLang [get, private set]
bool IsPressedShift [get, private set]
bool IsPressedCapsLock [get]
bool IsPressedCtrl [get, set]
bool ImeMode [get, private set]

이벤트

RoutedEventHandler VirtualKeyDown [add, remove]

Private 멤버 함수

void FindElements ()
async Task RegisterHookEventsAsync ()
void UnregisterHookEvents ()
void EnsurePreviewFocus ()
void SynchronizeKeyboardState (object? sender, EventArgs e)
bool TryHandleComposedTextKey (Key key)
void InsertRawText (string text)
void ReplaceTextTail (int replaceCount, string text)
string GetTextBeforeCaret ()
void SetPassword (string password)
TextBox? VkbTextBoxFromTree ()
PasswordBox? VkbPasswordBoxFromTree ()
void SimulateCharKey (Key key)
void ReleaseBackspaceRepeat ()
void StartBackspaceRepeat (Key key)
void SimulateBackspaceStroke ()
string NormalizeLanguageString (string lang)
void SetLanguage (string lang)
bool SetKoreanEnglishMode (bool useKorean)
void ApplyDesiredImeMode (bool useKorean)
bool IsKoreanInputActive ()
void RecheckKeyboardStateSoon (bool useKorean)
void RefreshKeyboardVisualState (bool readSystemIme=true)
bool IsNumLockOn ()
void TryTogglePreviewVisuals ()
void OnInputLanguageChanged (object? sender, InputLanguageEventArgs e)
void KeyboardUserControl_Loaded (object? sender, RoutedEventArgs e)
void KeyboardUserControl_Unloaded (object? sender, RoutedEventArgs e)
void KeyboardUserControl_IsVisibleChanged (object? sender, DependencyPropertyChangedEventArgs e)
void Hook_KeyPressed (object? sender, KeyboardHookEventArgs e)
void Hook_KeyReleased (object? sender, KeyboardHookEventArgs e)
void Hook_MouseReleased (object? sender, MouseHookEventArgs e)
void BackspacePointerReleased (object? sender, InputEventArgs e)
void BackspaceMouseCaptureLost (object? sender, MouseEventArgs e)
void KeyClick (object? sender, RoutedEventArgs e)
 ~DreamineVirtualKeyboard ()

정적 Private 멤버 함수

static void OnLayoutChanged (DependencyObject d, DependencyPropertyChangedEventArgs e)
static void OnIsPasswordLayoutChanged (DependencyObject d, DependencyPropertyChangedEventArgs e)
static ? T FindByNameInVisualTree< T > (DependencyObject root, string name)

Private 속성

readonly EventSimulator _eventSimulator = new EventSimulator()
readonly HangulComposer _hangulComposer = new()
readonly DispatcherTimer _keyboardStateSyncTimer
TaskPoolGlobalHook _hook = null!
volatile bool _hookRunning
volatile bool _hookSubscribed
CancellationTokenSource? _repeatBackspaceCts
Key_repeatBackspaceKey
DateTime _lastSelfImeToggleAt = DateTime.MinValue
DateTime _lastSelfLangSwitchAt = DateTime.MinValue
DateTime _lastSelfShiftAt = DateTime.MinValue
bool? _pendingKoreanInputMode
DateTime _pendingKoreanInputModeUntil = DateTime.MinValue
bool _disposed

정적 Private 속성

static readonly TimeSpan _guard = TimeSpan.FromMilliseconds(350)
static readonly DependencyPropertyKey IsPasswordLayoutPropertyKey

상세한 설명

전역 물리 입력과 동기화하며 다국어·한글 조합·반복 키 입력을 제공하는 가상 키보드 컨트롤입니다.

DreamineVirtualKeyboard.cs 파일의 26 번째 라인에서 정의되었습니다.

생성자 & 소멸자 문서화

◆ DreamineVirtualKeyboard()

Dreamine.UI.Wpf.Equipment.DreamineVirtualKeyboard.DreamineVirtualKeyboard.DreamineVirtualKeyboard ( )
inline

DreamineVirtualKeyboard 클래스의 새 인스턴스를 초기화하고 상태 동기화와 전역 후크를 준비합니다.

DreamineVirtualKeyboard.cs 파일의 509 번째 라인에서 정의되었습니다.

510 {
511 _keyboardStateSyncTimer = new DispatcherTimer(DispatcherPriority.Background)
512 {
513 Interval = TimeSpan.FromMilliseconds(160),
514 };
515 _keyboardStateSyncTimer.Tick += SynchronizeKeyboardState;
516
517 Loaded += KeyboardUserControl_Loaded;
518 Unloaded += KeyboardUserControl_Unloaded;
519 IsVisibleChanged += KeyboardUserControl_IsVisibleChanged;
520 AddHandler(PreviewMouseLeftButtonUpEvent, (MouseButtonEventHandler)BackspacePointerReleased, true);
521 AddHandler(PreviewTouchUpEvent, (EventHandler<TouchEventArgs>)BackspacePointerReleased, true);
522 AddHandler(LostMouseCaptureEvent, (MouseEventHandler)BackspaceMouseCaptureLost, true);
523 InputLanguageManager.Current.InputLanguageChanged += OnInputLanguageChanged;
524
525 _ = RegisterHookEventsAsync();
526 }

다음을 참조함 : _keyboardStateSyncTimer, BackspaceMouseCaptureLost(), BackspacePointerReleased(), KeyboardUserControl_IsVisibleChanged(), KeyboardUserControl_Loaded(), KeyboardUserControl_Unloaded(), OnInputLanguageChanged(), RegisterHookEventsAsync(), SynchronizeKeyboardState().

다음에 의해서 참조됨 : OnIsPasswordLayoutChanged(), OnLayoutChanged().

이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:
이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ ~DreamineVirtualKeyboard()

Dreamine.UI.Wpf.Equipment.DreamineVirtualKeyboard.DreamineVirtualKeyboard.~DreamineVirtualKeyboard ( )
inlineprivate

파이널라이저(보호용).

DreamineVirtualKeyboard.cs 파일의 2159 번째 라인에서 정의되었습니다.

2159=> Dispose(false);

멤버 함수 문서화

◆ ApplyDesiredImeMode()

void Dreamine.UI.Wpf.Equipment.DreamineVirtualKeyboard.DreamineVirtualKeyboard.ApplyDesiredImeMode ( bool useKorean)
inlineprivate

Apply Desired Ime Mode 작업을 수행합니다.

매개변수
useKoreanuse Korean에 사용할 bool 값입니다.

DreamineVirtualKeyboard.cs 파일의 1340 번째 라인에서 정의되었습니다.

1341 {
1342 var currentImeMode = ImeHelper.GetImeMode();
1343 if (currentImeMode != useKorean)
1344 {
1345 if (!ImeHelper.SetImeMode(useKorean))
1346 {
1347 switch (CurrentLang)
1348 {
1349 case LanguageCode.ko_KR:
1350 _eventSimulator.SimulateKeyPress(KeyCode.VcHangul);
1351 _eventSimulator.SimulateKeyRelease(KeyCode.VcHangul);
1352 break;
1353 case LanguageCode.zh_CN:
1354 _eventSimulator.SimulateKeyPress(KeyCode.VcLeftShift);
1355 _eventSimulator.SimulateKeyRelease(KeyCode.VcLeftShift);
1356 break;
1357 }
1358 }
1359 }
1360
1361 ImeMode = useKorean;
1362 }

다음을 참조함 : _eventSimulator, CurrentLang, Dreamine.UI.Wpf.Equipment.DreamineVirtualKeyboard.ImeHelper.GetImeMode(), ImeMode, Dreamine.UI.Wpf.Equipment.DreamineVirtualKeyboard.ImeHelper.SetImeMode().

다음에 의해서 참조됨 : RecheckKeyboardStateSoon(), SetKoreanEnglishMode().

이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:
이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ BackspaceMouseCaptureLost()

void Dreamine.UI.Wpf.Equipment.DreamineVirtualKeyboard.DreamineVirtualKeyboard.BackspaceMouseCaptureLost ( object? sender,
MouseEventArgs e )
inlineprivate

Backspace Mouse Capture Lost 작업을 수행합니다.

매개변수
sender이벤트를 발생시킨 객체입니다.
e이벤트와 관련된 데이터를 포함합니다.

DreamineVirtualKeyboard.cs 파일의 1936 번째 라인에서 정의되었습니다.

1937 {
1938 if (_repeatBackspaceCts != null && _repeatBackspaceKey?.IsMouseCaptured != true)
1939 ReleaseBackspaceRepeat();
1940 }

다음을 참조함 : _repeatBackspaceCts, _repeatBackspaceKey, ReleaseBackspaceRepeat().

다음에 의해서 참조됨 : DreamineVirtualKeyboard().

이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:
이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ BackspacePointerReleased()

void Dreamine.UI.Wpf.Equipment.DreamineVirtualKeyboard.DreamineVirtualKeyboard.BackspacePointerReleased ( object? sender,
InputEventArgs e )
inlineprivate

Backspace Pointer Released 작업을 수행합니다.

매개변수
sender이벤트를 발생시킨 객체입니다.
e이벤트와 관련된 데이터를 포함합니다.

DreamineVirtualKeyboard.cs 파일의 1907 번째 라인에서 정의되었습니다.

1908 {
1909 ReleaseBackspaceRepeat();
1910 }

다음을 참조함 : ReleaseBackspaceRepeat().

다음에 의해서 참조됨 : DreamineVirtualKeyboard().

이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:
이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ Dispose() [1/2]

void Dreamine.UI.Wpf.Equipment.DreamineVirtualKeyboard.DreamineVirtualKeyboard.Dispose ( )
inline

이 인스턴스가 소유한 리소스를 해제합니다.

DreamineVirtualKeyboard.cs 파일의 2089 번째 라인에서 정의되었습니다.

2089=> Dispose(true);

다음에 의해서 참조됨 : KeyboardUserControl_Unloaded().

이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ Dispose() [2/2]

virtual void Dreamine.UI.Wpf.Equipment.DreamineVirtualKeyboard.DreamineVirtualKeyboard.Dispose ( bool disposing)
inlineprotectedvirtual

Dispose 본체(표준 패턴).

매개변수
disposingdisposing에 사용할 bool 값입니다.

DreamineVirtualKeyboard.cs 파일의 2107 번째 라인에서 정의되었습니다.

2108 {
2109 if (_disposed) return;
2110 _disposed = true;
2111
2112 try
2113 {
2114 // 공통: 눌린 키/반복/훅 정리
2115 _keyboardStateSyncTimer.Stop();
2116 ReleasePressedKeys();
2117 ReleaseBackspaceRepeat();
2118 UnregisterHookEvents(); // _hook.Dispose() 포함
2119
2120 if (disposing)
2121 {
2122 _keyboardStateSyncTimer.Tick -= SynchronizeKeyboardState;
2123
2124 // 관리 리소스/이벤트 해제
2125 Loaded -= KeyboardUserControl_Loaded;
2126 Unloaded -= KeyboardUserControl_Unloaded;
2127 IsVisibleChanged -= KeyboardUserControl_IsVisibleChanged;
2128 InputLanguageManager.Current.InputLanguageChanged -= OnInputLanguageChanged;
2129
2130 // RoutedEvent 핸들러 해제
2131 RemoveHandler(Key.ClickEvent, (RoutedEventHandler)KeyClick);
2132
2133 // SharpHook 자체 해제
2134 _hook?.Dispose();
2135 _hook = null!;
2136
2137 // 참조 끊기(시각 트리 객체들)
2138 _layoutRoot = null;
2139 _keys = null;
2140 _langBtn = null;
2141 _inputModeBtn = null;
2142 }
2143 }
2144 catch (Exception ex) { Debug.WriteLine($"[VK] Dispose error: {ex.Message}"); }
2145 finally
2146 {
2147 GC.SuppressFinalize(this);
2148 }
2149 }

다음을 참조함 : _disposed, _hook, _inputModeBtn, _keyboardStateSyncTimer, _keys, _langBtn, _layoutRoot, KeyboardUserControl_IsVisibleChanged(), KeyboardUserControl_Loaded(), KeyboardUserControl_Unloaded(), KeyClick(), OnInputLanguageChanged(), ReleaseBackspaceRepeat(), ReleasePressedKeys(), SynchronizeKeyboardState(), UnregisterHookEvents().

이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:

◆ EnsurePreviewFocus()

void Dreamine.UI.Wpf.Equipment.DreamineVirtualKeyboard.DreamineVirtualKeyboard.EnsurePreviewFocus ( )
inlineprivate

현재 레이아웃에 대응하는 텍스트 또는 암호 미리 보기 컨트롤로 포커스를 이동합니다.

DreamineVirtualKeyboard.cs 파일의 678 번째 라인에서 정의되었습니다.

679 {
680 if (_layoutRoot == null)
681 _layoutRoot = FindName("KeyboardLayoutRoot") as Panel;
682
683 if (Layout == VkLayout.Password)
684 {
685 if (_layoutRoot?.FindFirstVisualChild<PasswordBox>("VkbPasswordBox") is { } pb && !pb.IsKeyboardFocusWithin)
686 {
687 pb.Focus();
688 }
689 }
690 else
691 {
692 if (_layoutRoot?.FindFirstVisualChild<TextBox>("VkbTextBox") is { } tb && !tb.IsKeyboardFocusWithin)
693 {
694 tb.Focus();
695 tb.CaretIndex = tb.Text?.Length ?? 0;
696 }
697 }
698 }

다음을 참조함 : _layoutRoot, Layout.

다음에 의해서 참조됨 : KeyboardUserControl_Loaded(), OnInputLanguageChanged(), RecheckKeyboardStateSoon(), RefreshKeyboardVisualState(), SetKoreanEnglishMode().

이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ FindByNameInVisualTree< T >()

? T Dreamine.UI.Wpf.Equipment.DreamineVirtualKeyboard.DreamineVirtualKeyboard.FindByNameInVisualTree< T > ( DependencyObject root,
string name )
inlinestaticprivate

By Name In Visual Tree 항목을 찾습니다.

템플릿 파라메터
TT 형식 매개변수입니다.
매개변수
rootroot에 사용할 DependencyObject 값입니다.
namename에 사용할 string 값입니다.
반환값
Find By Name In Visual Tree 작업에서 생성한 T 결과입니다.
타입 한정자들
T :FrameworkElement 

DreamineVirtualKeyboard.cs 파일의 1543 번째 라인에서 정의되었습니다.

1543 : FrameworkElement
1544 {
1545 if (root is T fe && fe.Name == name)
1546 return fe;
1547
1548 int count = VisualTreeHelper.GetChildrenCount(root);
1549 for (int i = 0; i < count; i++)
1550 {
1551 var child = VisualTreeHelper.GetChild(root, i);
1552 var found = FindByNameInVisualTree<T>(child, name);
1553 if (found != null) return found;
1554 }
1555 return null;
1556 }

다음을 참조함 : FindByNameInVisualTree< T >().

다음에 의해서 참조됨 : FindByNameInVisualTree< T >().

이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:
이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ FindElements()

void Dreamine.UI.Wpf.Equipment.DreamineVirtualKeyboard.DreamineVirtualKeyboard.FindElements ( )
inlineprivate

현재 시각적 트리에서 레이아웃 루트, 기능 버튼 및 키를 찾아 캐시합니다.

DreamineVirtualKeyboard.cs 파일의 540 번째 라인에서 정의되었습니다.

541 {
542 if (_layoutRoot is null && FindName("KeyboardLayoutRoot") is Panel layoutRoot)
543 {
544 _layoutRoot = layoutRoot;
545 }
546
547 if (_layoutRoot != null && _langBtn is null && _layoutRoot.FindFirstVisualChild<Button>("_langBtn") is { } langBtn)
548 {
549 _langBtn = langBtn;
550 }
551
552 if (_layoutRoot != null && _inputModeBtn is null && _layoutRoot.FindFirstVisualChild<Button>("_inputModeBtn") is { } inputModeBtn)
553 {
554 _inputModeBtn = inputModeBtn;
555 }
556
557 if (_layoutRoot != null && (_keys is null || !_keys.Any()))
558 {
559 _keys = _layoutRoot.FindVisualChildren<Key>();
560 }
561 }

다음을 참조함 : _inputModeBtn, _keys, _langBtn, _layoutRoot.

다음에 의해서 참조됨 : RefreshKeyboardLayout().

이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ GetTextBeforeCaret()

string Dreamine.UI.Wpf.Equipment.DreamineVirtualKeyboard.DreamineVirtualKeyboard.GetTextBeforeCaret ( )
inlineprivate

Text Before Caret 값을 가져옵니다.

반환값
Get Text Before Caret 작업에서 생성한 string 결과입니다.

DreamineVirtualKeyboard.cs 파일의 972 번째 라인에서 정의되었습니다.

973 {
974 if (Layout == VkLayout.Password)
975 return VkbPasswordBoxFromTree()?.Password ?? string.Empty;
976
977 if (VkbTextBoxFromTree() is not { } textBox)
978 return string.Empty;
979
980 var caret = Math.Clamp(textBox.CaretIndex, 0, textBox.Text.Length);
981 return textBox.Text[..caret];
982 }

다음을 참조함 : Layout, VkbPasswordBoxFromTree(), VkbTextBoxFromTree().

다음에 의해서 참조됨 : TryHandleComposedTextKey().

이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:
이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ Hook_KeyPressed()

void Dreamine.UI.Wpf.Equipment.DreamineVirtualKeyboard.DreamineVirtualKeyboard.Hook_KeyPressed ( object? sender,
KeyboardHookEventArgs e )
inlineprivate

Hook Key Pressed 작업을 수행합니다.

매개변수
sender이벤트를 발생시킨 객체입니다.
e이벤트와 관련된 데이터를 포함합니다.

DreamineVirtualKeyboard.cs 파일의 1744 번째 라인에서 정의되었습니다.

1745 {
1746 var keyCode = e.Data.KeyCode;
1747 Dispatcher.BeginInvoke(() =>
1748 {
1749 var refreshLayout = false;
1750 if (UpdateInputModeKey())
1751 refreshLayout = true;
1752
1753 switch (keyCode)
1754 {
1755 case KeyCode.VcLeftShift:
1756 case KeyCode.VcRightShift:
1757 // 문자 입력용 자체 Shift 시뮬레이션은 무시(토글 상태 보존).
1758 if (!InShiftGuard)
1759 {
1760 if (Layout == VkLayout.Text || Layout == VkLayout.Password)
1761 IsPressedShift = true;
1762 if (_keys?.FirstOrDefault(k => k.KeyCode == KeyCode.VcLeftShift) is { } shiftKey)
1763 shiftKey.IsPressed = true;
1764 refreshLayout = true;
1765 }
1766 break;
1767 case KeyCode.VcCapsLock:
1768 // OS CapsLock 토글 결과를 표시에 반영(상태 자체는 OS가 소유).
1769 if (_keys?.FirstOrDefault(k => k.KeyCode == KeyCode.VcCapsLock) is { } capsLockKey)
1770 capsLockKey.IsPressed = IsPressedCapsLock;
1771 refreshLayout = true;
1772 break;
1773 case KeyCode.VcLeftControl:
1774 case KeyCode.VcRightControl:
1775 if (Layout == VkLayout.Text || Layout == VkLayout.Password)
1776 IsPressedCtrl = true;
1777 if (_keys?.FirstOrDefault(k => k.KeyCode == KeyCode.VcLeftControl) is { } ctrlKey)
1778 ctrlKey.IsPressed = true;
1779 break;
1780 default:
1781 if (keyCode >= KeyCode.VcA && keyCode <= KeyCode.VcZ)
1782 _hangulComposer.Reset();
1783
1784 if (_keys?.FirstOrDefault(k => k.KeyCode == keyCode) is { } keyBtn)
1785 keyBtn.IsPressed = true;
1786 break;
1787 }
1788
1789 if (refreshLayout)
1790 UpdateKeys();
1791 }, DispatcherPriority.ApplicationIdle);
1792 }

다음을 참조함 : _hangulComposer, _keys, InShiftGuard, IsPressedCapsLock, IsPressedCtrl, IsPressedShift, Layout, UpdateInputModeKey(), UpdateKeys().

다음에 의해서 참조됨 : RegisterHookEventsAsync(), UnregisterHookEvents().

이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:
이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ Hook_KeyReleased()

void Dreamine.UI.Wpf.Equipment.DreamineVirtualKeyboard.DreamineVirtualKeyboard.Hook_KeyReleased ( object? sender,
KeyboardHookEventArgs e )
inlineprivate

Hook Key Released 작업을 수행합니다.

매개변수
sender이벤트를 발생시킨 객체입니다.
e이벤트와 관련된 데이터를 포함합니다.

DreamineVirtualKeyboard.cs 파일의 1818 번째 라인에서 정의되었습니다.

1819 {
1820 var keyCode = e.Data.KeyCode;
1821 Dispatcher.BeginInvoke(() =>
1822 {
1823 switch (keyCode)
1824 {
1825 case KeyCode.VcLeftShift:
1826 case KeyCode.VcRightShift:
1827 if (!InShiftGuard)
1828 {
1829 IsPressedShift = false;
1830 if (_keys?.FirstOrDefault(k => k.KeyCode == KeyCode.VcLeftShift) is { } shiftKey)
1831 shiftKey.IsPressed = false;
1832 UpdateKeys();
1833 }
1834 break;
1835 case KeyCode.VcCapsLock:
1836 if (_keys?.FirstOrDefault(k => k.KeyCode == KeyCode.VcCapsLock) is { } capsLockKey)
1837 capsLockKey.IsPressed = IsPressedCapsLock;
1838 UpdateKeys();
1839 break;
1840 case KeyCode.VcLeftControl:
1841 case KeyCode.VcRightControl:
1842 IsPressedCtrl = false;
1843 if (_keys?.FirstOrDefault(k => k.KeyCode == KeyCode.VcLeftControl) is { } ctrlKey)
1844 ctrlKey.IsPressed = false;
1845 break;
1846 default:
1847 if (_keys?.FirstOrDefault(k => k.KeyCode == keyCode) is { } keyBtn)
1848 keyBtn.IsPressed = false;
1849 break;
1850 }
1851 }, DispatcherPriority.ApplicationIdle);
1852 }

다음을 참조함 : _keys, InShiftGuard, IsPressedCapsLock, IsPressedCtrl, IsPressedShift, UpdateKeys().

다음에 의해서 참조됨 : RegisterHookEventsAsync(), UnregisterHookEvents().

이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:
이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ Hook_MouseReleased()

void Dreamine.UI.Wpf.Equipment.DreamineVirtualKeyboard.DreamineVirtualKeyboard.Hook_MouseReleased ( object? sender,
MouseHookEventArgs e )
inlineprivate

Hook Mouse Released 작업을 수행합니다.

매개변수
sender이벤트를 발생시킨 객체입니다.
e이벤트와 관련된 데이터를 포함합니다.

DreamineVirtualKeyboard.cs 파일의 1878 번째 라인에서 정의되었습니다.

1879 {
1880 ReleaseBackspaceRepeat();
1881 }

다음을 참조함 : ReleaseBackspaceRepeat().

다음에 의해서 참조됨 : RegisterHookEventsAsync(), UnregisterHookEvents().

이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:
이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ InsertRawText()

void Dreamine.UI.Wpf.Equipment.DreamineVirtualKeyboard.DreamineVirtualKeyboard.InsertRawText ( string text)
inlineprivate

한글 조합 상태를 초기화하고 지정한 원시 텍스트를 현재 캐럿 위치에 삽입합니다.

매개변수
text삽입할 텍스트입니다.

DreamineVirtualKeyboard.cs 파일의 892 번째 라인에서 정의되었습니다.

893 {
894 _hangulComposer.Reset();
895 ReplaceTextTail(0, text);
896 }

다음을 참조함 : _hangulComposer, ReplaceTextTail().

다음에 의해서 참조됨 : KeyClick().

이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:
이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ IsKoreanInputActive()

bool Dreamine.UI.Wpf.Equipment.DreamineVirtualKeyboard.DreamineVirtualKeyboard.IsKoreanInputActive ( )
inlineprivate

Is Korean Input Active 조건을 확인합니다.

반환값
Is Korean Input Active 조건이 충족되면 true이고, 그렇지 않으면 false입니다.

DreamineVirtualKeyboard.cs 파일의 1380 번째 라인에서 정의되었습니다.

1381 {
1382 if (HasPendingKoreanInputMode)
1383 return _pendingKoreanInputMode == true;
1384
1385 var currentLanguage = InputLanguageManager.Current.CurrentInputLanguage.Name;
1386 var isKoreanLanguage = string.Equals(
1387 NormalizeLanguageString(currentLanguage),
1388 "ko-KR",
1389 StringComparison.OrdinalIgnoreCase);
1390
1391 return isKoreanLanguage && ImeHelper.GetImeMode();
1392 }

다음을 참조함 : _pendingKoreanInputMode, Dreamine.UI.Wpf.Equipment.DreamineVirtualKeyboard.ImeHelper.GetImeMode(), HasPendingKoreanInputMode, NormalizeLanguageString().

다음에 의해서 참조됨 : KeyClick().

이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:
이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ IsNumLockOn()

bool Dreamine.UI.Wpf.Equipment.DreamineVirtualKeyboard.DreamineVirtualKeyboard.IsNumLockOn ( )
inlineprivate

Is Num Lock On 조건을 확인합니다.

반환값
Is Num Lock On 조건이 충족되면 true이고, 그렇지 않으면 false입니다.

DreamineVirtualKeyboard.cs 파일의 1475 번째 라인에서 정의되었습니다.

1476 {
1477 return Convert.ToBoolean(Win32Api.GetKeyState((int)KeyCode.VcNumLock) & 0x0001);
1478 }

다음을 참조함 : Dreamine.UI.Wpf.Equipment.DreamineVirtualKeyboard.Win32Api.GetKeyState().

다음에 의해서 참조됨 : KeyClick().

이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:
이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ KeyboardUserControl_IsVisibleChanged()

void Dreamine.UI.Wpf.Equipment.DreamineVirtualKeyboard.DreamineVirtualKeyboard.KeyboardUserControl_IsVisibleChanged ( object? sender,
DependencyPropertyChangedEventArgs e )
inlineprivate

Keyboard User Control Is Visible Changed 작업을 수행합니다.

매개변수
sender이벤트를 발생시킨 객체입니다.
e이벤트와 관련된 데이터를 포함합니다.

DreamineVirtualKeyboard.cs 파일의 1698 번째 라인에서 정의되었습니다.

1699 {
1700 if (e.NewValue is not bool isVisible) return;
1701
1702 if (!isVisible)
1703 {
1704 _keyboardStateSyncTimer.Stop();
1705
1706 if (IsPressedShift)
1707 {
1708 IsPressedShift = false;
1709 _eventSimulator.SimulateKeyRelease(KeyCode.VcLeftShift);
1710 }
1711 // CapsLock은 OS 상태를 그대로 두고 건드리지 않는다(단일 소스).
1712 }
1713 else if (IsLoaded)
1714 {
1715 SynchronizeKeyboardState(this, EventArgs.Empty);
1716 _keyboardStateSyncTimer.Start();
1717 }
1718 }

다음을 참조함 : _eventSimulator, _keyboardStateSyncTimer, IsPressedShift, SynchronizeKeyboardState().

다음에 의해서 참조됨 : Dispose(), DreamineVirtualKeyboard().

이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:
이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ KeyboardUserControl_Loaded()

void Dreamine.UI.Wpf.Equipment.DreamineVirtualKeyboard.DreamineVirtualKeyboard.KeyboardUserControl_Loaded ( object? sender,
RoutedEventArgs e )
inlineprivate

Keyboard User Control Loaded 작업을 수행합니다.

매개변수
sender이벤트를 발생시킨 객체입니다.
e이벤트와 관련된 데이터를 포함합니다.

DreamineVirtualKeyboard.cs 파일의 1627 번째 라인에서 정의되었습니다.

1628 {
1629 if (DesignerProperties.GetIsInDesignMode(this))
1630 return;
1631
1632 RemoveHandler(Key.ClickEvent, (RoutedEventHandler)KeyClick);
1633 AddHandler(Key.ClickEvent, (RoutedEventHandler)KeyClick);
1634
1635 Dispatcher.BeginInvoke(() =>
1636 {
1637 RefreshKeyboardLayout();
1638 TryTogglePreviewVisuals();
1639 EnsurePreviewFocus();
1640 _keyboardStateSyncTimer.Start();
1641 }, DispatcherPriority.SystemIdle);
1642 }

다음을 참조함 : _keyboardStateSyncTimer, EnsurePreviewFocus(), KeyClick(), RefreshKeyboardLayout(), TryTogglePreviewVisuals().

다음에 의해서 참조됨 : Dispose(), DreamineVirtualKeyboard().

이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:
이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ KeyboardUserControl_Unloaded()

void Dreamine.UI.Wpf.Equipment.DreamineVirtualKeyboard.DreamineVirtualKeyboard.KeyboardUserControl_Unloaded ( object? sender,
RoutedEventArgs e )
inlineprivate

Visual 트리에서 떨어질 때(창 닫힘 포함) 안전 정리.

매개변수
sender이벤트를 발생시킨 객체입니다.
e이벤트와 관련된 데이터를 포함합니다.

DreamineVirtualKeyboard.cs 파일의 1668 번째 라인에서 정의되었습니다.

1669 {
1670 _keyboardStateSyncTimer.Stop();
1671 Dispose(); // 안전
1672 }

다음을 참조함 : _keyboardStateSyncTimer, Dispose().

다음에 의해서 참조됨 : Dispose(), DreamineVirtualKeyboard().

이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:
이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ KeyClick()

void Dreamine.UI.Wpf.Equipment.DreamineVirtualKeyboard.DreamineVirtualKeyboard.KeyClick ( object? sender,
RoutedEventArgs e )
inlineprivate

Key Click 작업을 수행합니다.

매개변수
sender이벤트를 발생시킨 객체입니다.
e이벤트와 관련된 데이터를 포함합니다.

DreamineVirtualKeyboard.cs 파일의 1966 번째 라인에서 정의되었습니다.

1967 {
1968 if (Layout != VkLayout.Text && Layout != VkLayout.Password)
1969 {
1970 _eventSimulator.SimulateKeyRelease(KeyCode.VcLeftShift);
1971 _eventSimulator.SimulateKeyRelease(KeyCode.VcRightShift);
1972
1973 if (!IsNumLockOn())
1974 {
1975 _eventSimulator.SimulateKeyPress(KeyCode.VcNumLock);
1976 _eventSimulator.SimulateKeyRelease(KeyCode.VcNumLock);
1977 }
1978 }
1979
1980 if (e.OriginalSource is Button { Name: "_langBtn" })
1981 {
1982 _hangulComposer.Reset();
1983 SetKoreanEnglishMode(!IsKoreanInputActive());
1984 return;
1985 }
1986
1987 if (e.OriginalSource is Button { Name: "_inputModeBtn" })
1988 {
1989 _hangulComposer.Reset();
1990 SetKoreanEnglishMode(!IsKoreanInputActive());
1991 return;
1992 }
1993
1994 if (e.OriginalSource is not Key key)
1995 return;
1996
1997 var keyCode = key.KeyCode;
1998
1999 switch (keyCode)
2000 {
2001 // Shift는 토글(lock). 물리 Shift를 눌러두지 않고 상태만 들고 있다가,
2002 // 문자 입력 때 SimulateCharKey에서 한 글자씩 감싼다. → 전역 훅 없이도 동작.
2003 case KeyCode.VcLeftShift:
2004 case KeyCode.VcRightShift:
2005 IsPressedShift = !IsPressedShift;
2006 key.IsPressed = IsPressedShift;
2007 UpdateKeys();
2008 break;
2009
2010 // CapsLock: 실제 OS CapsLock을 토글하고, 반영은 OS 상태를 다시 읽어서 한다.
2011 case KeyCode.VcCapsLock:
2012 _eventSimulator.SimulateKeyPress(keyCode);
2013 _eventSimulator.SimulateKeyRelease(keyCode);
2014 DispatcherTimer tCaps = new() { Interval = TimeSpan.FromMilliseconds(120) };
2015 tCaps.Tick += (_, __) =>
2016 {
2017 tCaps.Stop();
2018 key.IsPressed = IsPressedCapsLock;
2019 UpdateKeys();
2020 };
2021 tCaps.Start();
2022 break;
2023
2024 case KeyCode.VcLeftControl:
2025 IsPressedCtrl = !IsPressedCtrl;
2026 key.IsPressed = IsPressedCtrl;
2027 if (IsPressedCtrl) _eventSimulator.SimulateKeyPress(keyCode);
2028 else _eventSimulator.SimulateKeyRelease(keyCode);
2029 break;
2030
2031 case KeyCode.VcBackspace:
2032 _hangulComposer.Reset();
2033 StartBackspaceRepeat(key);
2034 break;
2035
2036 case KeyCode.VcEnter:
2037 _hangulComposer.Reset();
2038 _eventSimulator.SimulateKeyPress(keyCode);
2039 _eventSimulator.SimulateKeyRelease(keyCode);
2040 break;
2041
2042 case KeyCode.VcTab:
2043 _hangulComposer.Reset();
2044 _eventSimulator.SimulateTextEntry(" ");
2045 break;
2046
2047 case KeyCode.VcSpace:
2048 InsertRawText(" ");
2049 break;
2050
2051 default:
2052 if (IsPressedCtrl)
2053 {
2054 _hangulComposer.Reset();
2055 // Ctrl 조합(단축키)은 한 번만 적용하고 해제(one-shot).
2056 _eventSimulator.SimulateKeyPress(keyCode);
2057 _eventSimulator.SimulateKeyRelease(keyCode);
2058 _eventSimulator.SimulateKeyRelease(KeyCode.VcLeftControl);
2059 IsPressedCtrl = false;
2060 if (_keys?.FirstOrDefault(k => k.KeyCode == KeyCode.VcLeftControl) is { } ctrlKey)
2061 ctrlKey.IsPressed = false;
2062 }
2063 else
2064 {
2065 if (!TryHandleComposedTextKey(key))
2066 {
2067 _hangulComposer.Reset();
2068 SimulateCharKey(key);
2069 }
2070 }
2071 break;
2072 }
2073
2074 RaiseEvent(new RoutedEventArgs(VirtualKeyDownEvent, key.KeyCode));
2075 }

다음을 참조함 : _eventSimulator, _hangulComposer, _keys, InsertRawText(), IsKoreanInputActive(), IsNumLockOn(), IsPressedCapsLock, IsPressedCtrl, IsPressedShift, Layout, SetKoreanEnglishMode(), SimulateCharKey(), StartBackspaceRepeat(), TryHandleComposedTextKey(), UpdateKeys(), VirtualKeyDownEvent.

다음에 의해서 참조됨 : Dispose(), KeyboardUserControl_Loaded().

이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:
이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ NormalizeLanguageString()

string Dreamine.UI.Wpf.Equipment.DreamineVirtualKeyboard.DreamineVirtualKeyboard.NormalizeLanguageString ( string lang)
inlineprivate

Normalize Language String 작업을 수행합니다.

매개변수
langlang에 사용할 string 값입니다.
반환값
Normalize Language String 작업에서 생성한 string 결과입니다.

DreamineVirtualKeyboard.cs 파일의 1203 번째 라인에서 정의되었습니다.

1204 {
1205 if (lang == null)
1206 return "";
1207
1208 char[] hiddenChars =
1209 {
1210 '\u200B', // zero width space
1211 '\u200C',
1212 '\u200D',
1213 '\u2060',
1214 '\uFEFF', // BOM
1215 '\u00A0' // NBSP
1216 };
1217
1218 return new string(lang.Where(c => !hiddenChars.Contains(c)).ToArray()).Trim();
1219 }

다음에 의해서 참조됨 : IsKoreanInputActive(), SetLanguage().

이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ OnInputLanguageChanged()

void Dreamine.UI.Wpf.Equipment.DreamineVirtualKeyboard.DreamineVirtualKeyboard.OnInputLanguageChanged ( object? sender,
InputLanguageEventArgs e )
inlineprivate

Input Language Changed 이벤트 또는 상태 변경을 처리합니다.

매개변수
sender이벤트를 발생시킨 객체입니다.
e이벤트와 관련된 데이터를 포함합니다.

DreamineVirtualKeyboard.cs 파일의 1586 번째 라인에서 정의되었습니다.

1587 {
1588 _hangulComposer.Reset();
1589
1590 if (InLangGuard)
1591 {
1592 SetLanguage(e.NewLanguage.Name);
1593 UpdateInputModeKey();
1594 UpdateKeys();
1595 EnsurePreviewFocus();
1596 return;
1597 }
1598
1599 RefreshKeyboardLayout(e.NewLanguage.Name);
1600 EnsurePreviewFocus();
1601 }

다음을 참조함 : _hangulComposer, EnsurePreviewFocus(), InLangGuard, RefreshKeyboardLayout(), SetLanguage(), UpdateInputModeKey(), UpdateKeys().

다음에 의해서 참조됨 : Dispose(), DreamineVirtualKeyboard().

이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:
이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ OnIsPasswordLayoutChanged()

void Dreamine.UI.Wpf.Equipment.DreamineVirtualKeyboard.DreamineVirtualKeyboard.OnIsPasswordLayoutChanged ( DependencyObject d,
DependencyPropertyChangedEventArgs e )
inlinestaticprivate

암호 레이아웃 상태가 변경되면 미리 보기 요소의 표시 상태를 갱신합니다.

매개변수
d상태가 변경된 키보드입니다.
e변경된 종속성 속성 이벤트 데이터입니다.

DreamineVirtualKeyboard.cs 파일의 427 번째 라인에서 정의되었습니다.

428 {
429 if (d is DreamineVirtualKeyboard vk)
430 {
431 vk.TryTogglePreviewVisuals();
432 }
433 }

다음을 참조함 : DreamineVirtualKeyboard().

이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:

◆ OnLayoutChanged()

void Dreamine.UI.Wpf.Equipment.DreamineVirtualKeyboard.DreamineVirtualKeyboard.OnLayoutChanged ( DependencyObject d,
DependencyPropertyChangedEventArgs e )
inlinestaticprivate

레이아웃 변경 시 캐시된 시각 요소를 초기화하고 새 레이아웃을 갱신합니다.

매개변수
d레이아웃이 변경된 키보드입니다.
e이전 값과 새 레이아웃 값을 포함하는 이벤트 데이터입니다.

DreamineVirtualKeyboard.cs 파일의 344 번째 라인에서 정의되었습니다.

345 {
346 if (d is DreamineVirtualKeyboard vk)
347 {
348 var layout = (VkLayout)e.NewValue;
349 vk._keys = null;
350 vk._langBtn = null;
351 vk._inputModeBtn = null;
352
353 vk.IsPasswordLayout = layout == VkLayout.Password;
354
355 vk.Dispatcher.BeginInvoke(() =>
356 {
357 vk.RefreshKeyboardLayout();
358 vk.EnsurePreviewFocus();
359 vk.TryTogglePreviewVisuals();
360 }, DispatcherPriority.Loaded);
361 }
362 }

다음을 참조함 : DreamineVirtualKeyboard().

이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:

◆ RecheckKeyboardStateSoon()

void Dreamine.UI.Wpf.Equipment.DreamineVirtualKeyboard.DreamineVirtualKeyboard.RecheckKeyboardStateSoon ( bool useKorean)
inlineprivate

Recheck Keyboard State Soon 작업을 수행합니다.

매개변수
useKoreanuse Korean에 사용할 bool 값입니다.

DreamineVirtualKeyboard.cs 파일의 1410 번째 라인에서 정의되었습니다.

1411 {
1412 var remaining = 5;
1413 DispatcherTimer timer = new() { Interval = TimeSpan.FromMilliseconds(100) };
1414 timer.Tick += (_, __) =>
1415 {
1416 EnsurePreviewFocus();
1417 ApplyDesiredImeMode(useKorean);
1418 RefreshKeyboardVisualState(false);
1419
1420 if (--remaining <= 0)
1421 {
1422 timer.Stop();
1423 _pendingKoreanInputMode = null;
1424 RefreshKeyboardVisualState();
1425 }
1426 };
1427 timer.Start();
1428 }

다음을 참조함 : _pendingKoreanInputMode, ApplyDesiredImeMode(), EnsurePreviewFocus(), RefreshKeyboardVisualState().

다음에 의해서 참조됨 : SetKoreanEnglishMode().

이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:
이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ RefreshKeyboardLayout()

void Dreamine.UI.Wpf.Equipment.DreamineVirtualKeyboard.DreamineVirtualKeyboard.RefreshKeyboardLayout ( string lang = "")
inlineprotected

입력 언어와 시각 요소를 다시 확인하고 전체 키보드 표시를 갱신합니다.

매개변수
lang적용할 문화권 이름이며, 비어 있으면 현재 시스템 언어를 사용합니다.

DreamineVirtualKeyboard.cs 파일의 778 번째 라인에서 정의되었습니다.

779 {
780 SetLanguage(lang);
781 FindElements();
782 UpdateInputModeKey();
783 UpdateKeys();
784 }

다음을 참조함 : FindElements(), SetLanguage(), UpdateInputModeKey(), UpdateKeys().

다음에 의해서 참조됨 : KeyboardUserControl_Loaded(), OnInputLanguageChanged().

이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:
이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ RefreshKeyboardVisualState()

void Dreamine.UI.Wpf.Equipment.DreamineVirtualKeyboard.DreamineVirtualKeyboard.RefreshKeyboardVisualState ( bool readSystemIme = true)
inlineprivate

Refresh Keyboard Visual State 작업을 수행합니다.

매개변수
readSystemImeread System Ime에 사용할 bool 값입니다.

DreamineVirtualKeyboard.cs 파일의 1446 번째 라인에서 정의되었습니다.

1447 {
1448 if (HasPendingKoreanInputMode)
1449 {
1450 ImeMode = _pendingKoreanInputMode == true;
1451 readSystemIme = false;
1452 }
1453
1454 UpdateInputModeKey(readSystemIme);
1455 UpdateKeys();
1456 EnsurePreviewFocus();
1457 }

다음을 참조함 : _pendingKoreanInputMode, EnsurePreviewFocus(), HasPendingKoreanInputMode, ImeMode, UpdateInputModeKey(), UpdateKeys().

다음에 의해서 참조됨 : RecheckKeyboardStateSoon(), SetKoreanEnglishMode(), SynchronizeKeyboardState().

이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:
이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ RegisterHookEventsAsync()

async Task Dreamine.UI.Wpf.Equipment.DreamineVirtualKeyboard.DreamineVirtualKeyboard.RegisterHookEventsAsync ( )
inlineprivate

전역 입력 후크 이벤트를 한 번만 구독하고 후크 실행 루프를 비동기로 시작합니다.

반환값
등록 시작이 완료될 때 끝나는 작업입니다.

DreamineVirtualKeyboard.cs 파일의 579 번째 라인에서 정의되었습니다.

580 {
581 await Task.Yield();
582 if (_hookRunning)
583 return;
584
585 _hook ??= new TaskPoolGlobalHook();
586
587 if (!_hookSubscribed)
588 {
589 _hook.KeyPressed += Hook_KeyPressed;
590 _hook.KeyReleased += Hook_KeyReleased;
591 _hook.MouseReleased += Hook_MouseReleased;
592 _hookSubscribed = true;
593 }
594
595 _hookRunning = true;
596 _ = Task.Run(async () =>
597 {
598 try
599 {
600 await _hook.RunAsync().ConfigureAwait(false);
601 }
602 catch (Exception ex)
603 {
604 Debug.WriteLine($"[VK Hook] RunAsync failed: {ex.Message}");
605 }
606 finally
607 {
608 _hookRunning = false;
609 }
610 });
611 }

다음을 참조함 : _hook, _hookRunning, _hookSubscribed, Hook_KeyPressed(), Hook_KeyReleased(), Hook_MouseReleased().

다음에 의해서 참조됨 : DreamineVirtualKeyboard().

이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:
이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ ReleaseBackspaceRepeat()

void Dreamine.UI.Wpf.Equipment.DreamineVirtualKeyboard.DreamineVirtualKeyboard.ReleaseBackspaceRepeat ( )
inlineprivate

Release Backspace Repeat 작업을 수행합니다.

DreamineVirtualKeyboard.cs 파일의 1098 번째 라인에서 정의되었습니다.

1099 {
1100 if (!Dispatcher.CheckAccess())
1101 {
1102 Dispatcher.BeginInvoke(new Action(ReleaseBackspaceRepeat), DispatcherPriority.Send);
1103 return;
1104 }
1105
1106 if (_repeatBackspaceCts != null)
1107 {
1108 _repeatBackspaceCts.Cancel();
1109 _repeatBackspaceCts.Dispose();
1110 _repeatBackspaceCts = null;
1111 }
1112
1113 if (_repeatBackspaceKey?.IsMouseCaptured == true)
1114 _repeatBackspaceKey.ReleaseMouseCapture();
1115
1116 _repeatBackspaceKey = null;
1117 _eventSimulator.SimulateKeyRelease(KeyCode.VcBackspace);
1118 }

다음을 참조함 : _eventSimulator, _repeatBackspaceCts, _repeatBackspaceKey, ReleaseBackspaceRepeat().

다음에 의해서 참조됨 : BackspaceMouseCaptureLost(), BackspacePointerReleased(), Dispose(), Hook_MouseReleased(), ReleaseBackspaceRepeat(), ReleasePressedKeys().

이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:
이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ ReleasePressedKeys()

void Dreamine.UI.Wpf.Equipment.DreamineVirtualKeyboard.DreamineVirtualKeyboard.ReleasePressedKeys ( )
inline

Release Pressed Keys 작업을 수행합니다.

DreamineVirtualKeyboard.cs 파일의 2170 번째 라인에서 정의되었습니다.

2171 {
2172 ReleaseBackspaceRepeat();
2173
2174 if (IsPressedCapsLock)
2175 _eventSimulator.SimulateKeyRelease(KeyCode.VcCapsLock);
2176
2177 if (IsPressedShift)
2178 {
2179 _eventSimulator.SimulateKeyRelease(KeyCode.VcLeftShift);
2180 _eventSimulator.SimulateKeyRelease(KeyCode.VcRightShift);
2181 }
2182
2183 if (IsPressedCtrl)
2184 {
2185 _eventSimulator.SimulateKeyRelease(KeyCode.VcLeftControl);
2186 _eventSimulator.SimulateKeyRelease(KeyCode.VcRightControl);
2187 }
2188 }

다음을 참조함 : _eventSimulator, IsPressedCapsLock, IsPressedCtrl, IsPressedShift, ReleaseBackspaceRepeat().

다음에 의해서 참조됨 : Dispose().

이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:
이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ ReplaceTextTail()

void Dreamine.UI.Wpf.Equipment.DreamineVirtualKeyboard.DreamineVirtualKeyboard.ReplaceTextTail ( int replaceCount,
string text )
inlineprivate

현재 선택 영역 또는 캐럿 앞의 지정된 문자 수를 새 텍스트로 교체합니다.

매개변수
replaceCount선택 영역이 없을 때 캐럿 앞에서 제거할 문자 수입니다.
text삽입할 대체 텍스트입니다.

DreamineVirtualKeyboard.cs 파일의 922 번째 라인에서 정의되었습니다.

923 {
924 if (Layout == VkLayout.Password)
925 {
926 var password = VkbPasswordBoxFromTree()?.Password ?? string.Empty;
927 var keep = Math.Max(0, password.Length - replaceCount);
928 SetPassword(password[..keep] + text);
929 return;
930 }
931
932 if (VkbTextBoxFromTree() is not { } textBox)
933 return;
934
935 var currentText = textBox.Text ?? string.Empty;
936 var selectionStart = Math.Clamp(textBox.SelectionStart, 0, currentText.Length);
937 var selectionLength = Math.Clamp(textBox.SelectionLength, 0, currentText.Length - selectionStart);
938
939 if (selectionLength > 0)
940 {
941 textBox.SelectedText = text;
942 textBox.CaretIndex = selectionStart + text.Length;
943 }
944 else
945 {
946 var removeStart = Math.Max(0, selectionStart - replaceCount);
947 removeStart = Math.Min(removeStart, currentText.Length);
948 var removeLength = Math.Clamp(selectionStart - removeStart, 0, currentText.Length - removeStart);
949 textBox.Text = currentText.Remove(removeStart, removeLength).Insert(removeStart, text);
950 textBox.CaretIndex = removeStart + text.Length;
951 }
952
953 textBox.GetBindingExpression(TextBox.TextProperty)?.UpdateSource();
954 }

다음을 참조함 : Layout, SetPassword(), VkbPasswordBoxFromTree(), VkbTextBoxFromTree().

다음에 의해서 참조됨 : InsertRawText(), TryHandleComposedTextKey().

이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:
이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ SetKoreanEnglishMode()

bool Dreamine.UI.Wpf.Equipment.DreamineVirtualKeyboard.DreamineVirtualKeyboard.SetKoreanEnglishMode ( bool useKorean)
inlineprivate

Korean English Mode 값을 설정합니다.

매개변수
useKoreanuse Korean에 사용할 bool 값입니다.
반환값
Set Korean English Mode 조건이 충족되면 true이고, 그렇지 않으면 false입니다.

DreamineVirtualKeyboard.cs 파일의 1285 번째 라인에서 정의되었습니다.

1286 {
1287 _lastSelfLangSwitchAt = DateTime.UtcNow;
1288 _lastSelfImeToggleAt = DateTime.UtcNow;
1289 _pendingKoreanInputMode = useKorean;
1290 _pendingKoreanInputModeUntil = DateTime.UtcNow + TimeSpan.FromMilliseconds(900);
1291
1292 var targetName = useKorean ? "ko-KR" : "en-US";
1293 try
1294 {
1295 var available = InputLanguageManager.Current.AvailableInputLanguages;
1296 var match = available?
1297 .Cast<System.Globalization.CultureInfo>()
1298 .FirstOrDefault(c => string.Equals(c.Name, targetName, StringComparison.OrdinalIgnoreCase));
1299
1300 if (match != null)
1301 {
1302 InputLanguageManager.Current.CurrentInputLanguage = match;
1303 SetLanguage(match.Name);
1304 }
1305 else
1306 {
1307 SetLanguage(targetName);
1308 }
1309
1310 EnsurePreviewFocus();
1311 ApplyDesiredImeMode(useKorean);
1312 RefreshKeyboardVisualState(false);
1313 RecheckKeyboardStateSoon(useKorean);
1314 return true;
1315 }
1316 catch (Exception ex)
1317 {
1318 Debug.WriteLine($"[VK] SetKoreanEnglishMode failed: {ex.Message}");
1319 }
1320
1321 return false;
1322 }

다음을 참조함 : _lastSelfImeToggleAt, _lastSelfLangSwitchAt, _pendingKoreanInputMode, _pendingKoreanInputModeUntil, ApplyDesiredImeMode(), EnsurePreviewFocus(), RecheckKeyboardStateSoon(), RefreshKeyboardVisualState(), SetLanguage().

다음에 의해서 참조됨 : KeyClick().

이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:
이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ SetLanguage()

void Dreamine.UI.Wpf.Equipment.DreamineVirtualKeyboard.DreamineVirtualKeyboard.SetLanguage ( string lang)
inlineprivate

Language 값을 설정합니다.

매개변수
langlang에 사용할 string 값입니다.

DreamineVirtualKeyboard.cs 파일의 1237 번째 라인에서 정의되었습니다.

1238 {
1239 if (string.IsNullOrEmpty(lang))
1240 {
1241 lang = InputLanguageManager.Current.CurrentInputLanguage.Name;
1242 }
1243
1244 lang = NormalizeLanguageString(lang);
1245
1246 var currentLang = lang switch
1247 {
1248 "ko-KR" => LanguageCode.ko_KR,
1249 "vi-VN" => LanguageCode.vi_VN,
1250 "zh-CN" => LanguageCode.zh_CN,
1251 _ => LanguageCode.en_US
1252 };
1253
1254 if (CurrentLang == currentLang)
1255 return;
1256
1257 CurrentLang = currentLang;
1258 OnKeyboardLanguageChanged?.Invoke(this, CurrentLang);
1259 }

다음을 참조함 : CurrentLang, NormalizeLanguageString(), OnKeyboardLanguageChanged.

다음에 의해서 참조됨 : OnInputLanguageChanged(), RefreshKeyboardLayout(), SetKoreanEnglishMode(), SynchronizeKeyboardState().

이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:
이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ SetPassword()

void Dreamine.UI.Wpf.Equipment.DreamineVirtualKeyboard.DreamineVirtualKeyboard.SetPassword ( string password)
inlineprivate

Password 값을 설정합니다.

매개변수
passwordpassword에 사용할 string 값입니다.

DreamineVirtualKeyboard.cs 파일의 1000 번째 라인에서 정의되었습니다.

1001 {
1002 if (VkbPasswordBoxFromTree() is { } passwordBox)
1003 passwordBox.Password = password;
1004 }

다음을 참조함 : VkbPasswordBoxFromTree().

다음에 의해서 참조됨 : ReplaceTextTail().

이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:
이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ SimulateBackspaceStroke()

void Dreamine.UI.Wpf.Equipment.DreamineVirtualKeyboard.DreamineVirtualKeyboard.SimulateBackspaceStroke ( )
inlineprivate

Simulate Backspace Stroke 작업을 수행합니다.

DreamineVirtualKeyboard.cs 파일의 1173 번째 라인에서 정의되었습니다.

1174 {
1175 _eventSimulator.SimulateKeyPress(KeyCode.VcBackspace);
1176 _eventSimulator.SimulateKeyRelease(KeyCode.VcBackspace);
1177 }

다음을 참조함 : _eventSimulator.

다음에 의해서 참조됨 : StartBackspaceRepeat().

이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ SimulateCharKey()

void Dreamine.UI.Wpf.Equipment.DreamineVirtualKeyboard.DreamineVirtualKeyboard.SimulateCharKey ( Key key)
inlineprivate

문자 키를 입력한다. Shift 토글/CapsLock 상태에 따라 물리 Shift를 한 글자만 감싸서 대문자/기호를 만든다. 상태는 클릭 핸들러가 직접 관리하므로 전역 훅이 꺼져 있어도(디버거 실행 등) 동작한다.

매개변수
keykey에 사용할 Key 값입니다.

DreamineVirtualKeyboard.cs 파일의 1066 번째 라인에서 정의되었습니다.

1067 {
1068 var kc = key.KeyCode;
1069
1070 // 대문자/기호는 '가상 Shift 토글'로만 결정한다.
1071 // CapsLock(영문 대문자화)은 OS가 주입된 문자 키에 자동 적용하므로 여기서 감싸지 않는다.
1072 var useShift = IsPressedShift;
1073
1074 if (useShift)
1075 {
1076 _lastSelfShiftAt = DateTime.UtcNow;
1077 _eventSimulator.SimulateKeyPress(KeyCode.VcLeftShift);
1078 _eventSimulator.SimulateKeyPress(kc);
1079 _eventSimulator.SimulateKeyRelease(kc);
1080 _eventSimulator.SimulateKeyRelease(KeyCode.VcLeftShift);
1081 _lastSelfShiftAt = DateTime.UtcNow;
1082 }
1083 else
1084 {
1085 _eventSimulator.SimulateKeyPress(kc);
1086 _eventSimulator.SimulateKeyRelease(kc);
1087 }
1088 }

다음을 참조함 : _eventSimulator, _lastSelfShiftAt, IsPressedShift, Dreamine.UI.Wpf.Equipment.DreamineVirtualKeyboard.Key.KeyCode.

다음에 의해서 참조됨 : KeyClick().

이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ StartBackspaceRepeat()

void Dreamine.UI.Wpf.Equipment.DreamineVirtualKeyboard.DreamineVirtualKeyboard.StartBackspaceRepeat ( Key key)
inlineprivate

Start Backspace Repeat 작업을 수행합니다.

매개변수
keykey에 사용할 Key 값입니다.

DreamineVirtualKeyboard.cs 파일의 1136 번째 라인에서 정의되었습니다.

1137 {
1138 if (_repeatBackspaceCts != null)
1139 return;
1140
1141 _repeatBackspaceKey = key;
1142 key.CaptureMouse();
1143 SimulateBackspaceStroke();
1144
1145 _repeatBackspaceCts = new CancellationTokenSource();
1146 var token = _repeatBackspaceCts.Token;
1147
1148 _ = Task.Run(async () =>
1149 {
1150 try
1151 {
1152 await Task.Delay(400, token).ConfigureAwait(false);
1153 while (!token.IsCancellationRequested)
1154 {
1155 SimulateBackspaceStroke();
1156 await Task.Delay(50, token).ConfigureAwait(false);
1157 }
1158 }
1159 catch (OperationCanceledException)
1160 {
1161 }
1162 }, token);
1163 }

다음을 참조함 : _repeatBackspaceCts, _repeatBackspaceKey, SimulateBackspaceStroke().

다음에 의해서 참조됨 : KeyClick().

이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:
이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ SynchronizeKeyboardState()

void Dreamine.UI.Wpf.Equipment.DreamineVirtualKeyboard.DreamineVirtualKeyboard.SynchronizeKeyboardState ( object? sender,
EventArgs e )
inlineprivate

타이머 틱마다 시스템 입력 언어와 IME 상태를 가상 키보드에 동기화합니다.

매개변수
sender타이머 이벤트 원본입니다.
e이벤트 데이터입니다.

DreamineVirtualKeyboard.cs 파일의 810 번째 라인에서 정의되었습니다.

811 {
812 if (!IsVisible || DesignerProperties.GetIsInDesignMode(this))
813 return;
814
815 if (HasPendingKoreanInputMode)
816 {
817 RefreshKeyboardVisualState(false);
818 return;
819 }
820
821 _pendingKoreanInputMode = null;
822
823 var previousLang = CurrentLang;
824 var previousImeMode = ImeMode;
825
826 if (!InLangGuard)
827 SetLanguage(InputLanguageManager.Current.CurrentInputLanguage.Name);
828
829 UpdateInputModeKey();
830
831 if (previousLang != CurrentLang || previousImeMode != ImeMode)
832 UpdateKeys();
833 }

다음을 참조함 : _pendingKoreanInputMode, CurrentLang, HasPendingKoreanInputMode, ImeMode, InLangGuard, RefreshKeyboardVisualState(), SetLanguage(), UpdateInputModeKey(), UpdateKeys().

다음에 의해서 참조됨 : Dispose(), DreamineVirtualKeyboard(), KeyboardUserControl_IsVisibleChanged().

이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:
이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ TryHandleComposedTextKey()

bool Dreamine.UI.Wpf.Equipment.DreamineVirtualKeyboard.DreamineVirtualKeyboard.TryHandleComposedTextKey ( Key key)
inlineprivate

자모 키 입력을 한글 조합기로 처리하여 현재 미리 보기 텍스트에 반영합니다.

매개변수
key처리할 가상 키입니다.
반환값
조합 가능한 한글 입력으로 처리했으면 true입니다.

DreamineVirtualKeyboard.cs 파일의 859 번째 라인에서 정의되었습니다.

860 {
861 if (Layout != VkLayout.Text && Layout != VkLayout.Password)
862 return false;
863
864 if (key.KeyCode < KeyCode.VcA || key.KeyCode > KeyCode.VcZ)
865 return false;
866
867 var text = key.GetDisplayText(IsPressedShift, IsPressedCapsLock, CurrentLang, ImeMode);
868 if (!HangulComposer.IsComposableJamo(text))
869 return false;
870
871 var edit = _hangulComposer.Input(text, GetTextBeforeCaret());
872 ReplaceTextTail(edit.ReplaceCount, edit.Text);
873 return true;
874 }

다음을 참조함 : _hangulComposer, CurrentLang, Dreamine.UI.Wpf.Equipment.DreamineVirtualKeyboard.Key.GetDisplayText(), GetTextBeforeCaret(), ImeMode, IsPressedCapsLock, IsPressedShift, Dreamine.UI.Wpf.Equipment.DreamineVirtualKeyboard.Key.KeyCode, Layout, ReplaceTextTail().

다음에 의해서 참조됨 : KeyClick().

이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:
이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ TryTogglePreviewVisuals()

void Dreamine.UI.Wpf.Equipment.DreamineVirtualKeyboard.DreamineVirtualKeyboard.TryTogglePreviewVisuals ( )
inlineprivate

Toggle Preview Visuals 작업을 시도하고 성공 여부를 반환합니다.

DreamineVirtualKeyboard.cs 파일의 1488 번째 라인에서 정의되었습니다.

1489 {
1490 var window = Window.GetWindow(this) ?? this as DependencyObject;
1491 if (window == null) return;
1492
1493 var vkbText = FindByNameInVisualTree<TextBox>(window, "VkbTextBox");
1494 var vkbPwd = FindByNameInVisualTree<PasswordBox>(window, "VkbPasswordBox");
1495
1496 if (vkbText != null)
1497 vkbText.Visibility = IsPasswordLayout ? Visibility.Collapsed : Visibility.Visible;
1498
1499 if (vkbPwd != null)
1500 vkbPwd.Visibility = IsPasswordLayout ? Visibility.Visible : Visibility.Collapsed;
1501 }

다음을 참조함 : IsPasswordLayout.

다음에 의해서 참조됨 : KeyboardUserControl_Loaded().

이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ UnregisterHookEvents()

void Dreamine.UI.Wpf.Equipment.DreamineVirtualKeyboard.DreamineVirtualKeyboard.UnregisterHookEvents ( )
inlineprivate

실행 중인 전역 후크를 중지하고 등록된 이벤트 처리기를 해제합니다.

DreamineVirtualKeyboard.cs 파일의 621 번째 라인에서 정의되었습니다.

622 {
623 if (_hook is null)
624 return;
625
626 // 실행 중이면 중지
627 if (_hookRunning)
628 {
629 _hook.Dispose();
630 _hookRunning = false;
631 }
632
633 // 이벤트 구독 해제 (필요 시 완전 해제)
634 if (_hookSubscribed)
635 {
636 _hook.KeyPressed -= Hook_KeyPressed;
637 _hook.KeyReleased -= Hook_KeyReleased;
638 _hook.MouseReleased -= Hook_MouseReleased;
639 _hookSubscribed = false;
640 }
641
642 //_hook = null; // 재사용 의도가 없으면 해제
643 }

다음을 참조함 : _hook, _hookRunning, _hookSubscribed, Hook_KeyPressed(), Hook_KeyReleased(), Hook_MouseReleased().

다음에 의해서 참조됨 : Dispose().

이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:
이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ UpdateInputModeKey()

bool Dreamine.UI.Wpf.Equipment.DreamineVirtualKeyboard.DreamineVirtualKeyboard.UpdateInputModeKey ( bool readSystemIme = true)
inlineprotected

시스템 IME 상태와 입력 모드 버튼 표시를 동기화합니다.

매개변수
readSystemIme시스템에서 최신 IME 상태를 읽을지 여부입니다.
반환값
IME 상태가 변경되었으면 true이고, 그렇지 않으면 false입니다.

DreamineVirtualKeyboard.cs 파일의 740 번째 라인에서 정의되었습니다.

741 {
742 var imeModeChanged = false;
743
744 if (readSystemIme && !InImeGuard)
745 {
746 var imeMode = ImeHelper.GetImeMode();
747 if (ImeMode != imeMode)
748 {
749 ImeMode = imeMode;
750 imeModeChanged = true;
751 }
752 }
753
754 if (_inputModeBtn != null)
755 {
756 _inputModeBtn.Content = CurrentLang == LanguageCode.ko_KR && ImeMode ? "가" : "abc";
757 }
758
759 return imeModeChanged;
760 }

다음을 참조함 : _inputModeBtn, CurrentLang, Dreamine.UI.Wpf.Equipment.DreamineVirtualKeyboard.ImeHelper.GetImeMode(), ImeMode, InImeGuard.

다음에 의해서 참조됨 : Hook_KeyPressed(), OnInputLanguageChanged(), RefreshKeyboardLayout(), RefreshKeyboardVisualState(), SynchronizeKeyboardState().

이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:
이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ UpdateKeys()

void Dreamine.UI.Wpf.Equipment.DreamineVirtualKeyboard.DreamineVirtualKeyboard.UpdateKeys ( )
inlineprotected

현재 언어, IME 및 보조 키 상태를 모든 가상 키 표시에 반영합니다.

DreamineVirtualKeyboard.cs 파일의 653 번째 라인에서 정의되었습니다.

654 {
655 UpdateLangKey();
656
657 if (!InImeGuard)
658 ImeMode = ImeHelper.GetImeMode();
659
660 if (_keys != null && _keys.Any())
661 {
662 foreach (var keyButton in _keys)
663 {
664 var useShift = Layout == VkLayout.Text || Layout == VkLayout.Password;
665 keyButton.UpdateKey(useShift ? IsPressedShift : false, IsPressedCapsLock, CurrentLang, ImeMode);
666 }
667 }
668 }

다음을 참조함 : _keys, CurrentLang, Dreamine.UI.Wpf.Equipment.DreamineVirtualKeyboard.ImeHelper.GetImeMode(), ImeMode, InImeGuard, IsPressedCapsLock, IsPressedShift, Layout, UpdateLangKey().

다음에 의해서 참조됨 : Hook_KeyPressed(), Hook_KeyReleased(), KeyClick(), OnInputLanguageChanged(), RefreshKeyboardLayout(), RefreshKeyboardVisualState(), SynchronizeKeyboardState().

이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:
이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ UpdateLangKey()

void Dreamine.UI.Wpf.Equipment.DreamineVirtualKeyboard.DreamineVirtualKeyboard.UpdateLangKey ( )
inlineprotected

현재 정책에 따라 언어 전환 버튼을 숨깁니다.

DreamineVirtualKeyboard.cs 파일의 708 번째 라인에서 정의되었습니다.

709 {
710 if (_langBtn != null)
711 {
712 _langBtn.Visibility = Visibility.Collapsed;
713 }
714 }

다음을 참조함 : _langBtn.

다음에 의해서 참조됨 : UpdateKeys().

이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ VkbPasswordBoxFromTree()

PasswordBox? Dreamine.UI.Wpf.Equipment.DreamineVirtualKeyboard.DreamineVirtualKeyboard.VkbPasswordBoxFromTree ( )
inlineprivate

Vkb Password Box From Tree 작업을 수행합니다.

반환값
Vkb Password Box From Tree 작업에서 생성한 PasswordBox 결과입니다.

DreamineVirtualKeyboard.cs 파일의 1044 번째 라인에서 정의되었습니다.

1045 {
1046 var window = Window.GetWindow(this) ?? this as DependencyObject;
1047 return window == null ? null : FindByNameInVisualTree<PasswordBox>(window, "VkbPasswordBox");
1048 }

다음에 의해서 참조됨 : GetTextBeforeCaret(), ReplaceTextTail(), SetPassword().

이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ VkbTextBoxFromTree()

TextBox? Dreamine.UI.Wpf.Equipment.DreamineVirtualKeyboard.DreamineVirtualKeyboard.VkbTextBoxFromTree ( )
inlineprivate

Vkb Text Box From Tree 작업을 수행합니다.

반환값
Vkb Text Box From Tree 작업에서 생성한 TextBox 결과입니다.

DreamineVirtualKeyboard.cs 파일의 1022 번째 라인에서 정의되었습니다.

1023 {
1024 var window = Window.GetWindow(this) ?? this as DependencyObject;
1025 return window == null ? null : FindByNameInVisualTree<TextBox>(window, "VkbTextBox");
1026 }

다음에 의해서 참조됨 : GetTextBeforeCaret(), ReplaceTextTail().

이 함수를 호출하는 함수들에 대한 그래프입니다.:

멤버 데이터 문서화

◆ _disposed

bool Dreamine.UI.Wpf.Equipment.DreamineVirtualKeyboard.DreamineVirtualKeyboard._disposed
private

이 컨트롤의 관리 리소스가 해제되었는지 나타냅니다.

DreamineVirtualKeyboard.cs 파일의 258 번째 라인에서 정의되었습니다.

다음에 의해서 참조됨 : Dispose().

◆ _eventSimulator

readonly EventSimulator Dreamine.UI.Wpf.Equipment.DreamineVirtualKeyboard.DreamineVirtualKeyboard._eventSimulator = new EventSimulator()
private

네이티브 키와 텍스트 입력을 주입하는 SharpHook 시뮬레이터입니다.

DreamineVirtualKeyboard.cs 파일의 52 번째 라인에서 정의되었습니다.

다음에 의해서 참조됨 : ApplyDesiredImeMode(), KeyboardUserControl_IsVisibleChanged(), KeyClick(), ReleaseBackspaceRepeat(), ReleasePressedKeys(), SimulateBackspaceStroke(), SimulateCharKey().

◆ _guard

readonly TimeSpan Dreamine.UI.Wpf.Equipment.DreamineVirtualKeyboard.DreamineVirtualKeyboard._guard = TimeSpan.FromMilliseconds(350)
staticprivate

자체 생성 입력을 전역 후크에서 무시하는 보호 시간입니다.

DreamineVirtualKeyboard.cs 파일의 210 번째 라인에서 정의되었습니다.

◆ _hangulComposer

readonly HangulComposer Dreamine.UI.Wpf.Equipment.DreamineVirtualKeyboard.DreamineVirtualKeyboard._hangulComposer = new()
private

직접 입력한 한글 자모의 조합 상태를 관리합니다.

DreamineVirtualKeyboard.cs 파일의 61 번째 라인에서 정의되었습니다.

다음에 의해서 참조됨 : Hook_KeyPressed(), InsertRawText(), KeyClick(), OnInputLanguageChanged(), TryHandleComposedTextKey().

◆ _hook

TaskPoolGlobalHook Dreamine.UI.Wpf.Equipment.DreamineVirtualKeyboard.DreamineVirtualKeyboard._hook = null!
private

물리 키보드와 마우스 상태를 감지하는 전역 후크입니다.

DreamineVirtualKeyboard.cs 파일의 79 번째 라인에서 정의되었습니다.

다음에 의해서 참조됨 : Dispose(), RegisterHookEventsAsync(), UnregisterHookEvents().

◆ _hookRunning

volatile bool Dreamine.UI.Wpf.Equipment.DreamineVirtualKeyboard.DreamineVirtualKeyboard._hookRunning
private

전역 후크 실행 루프가 이미 실행 중인지 나타냅니다.

DreamineVirtualKeyboard.cs 파일의 89 번째 라인에서 정의되었습니다.

다음에 의해서 참조됨 : RegisterHookEventsAsync(), UnregisterHookEvents().

◆ _hookSubscribed

volatile bool Dreamine.UI.Wpf.Equipment.DreamineVirtualKeyboard.DreamineVirtualKeyboard._hookSubscribed
private

전역 후크 이벤트가 구독되었는지 나타냅니다.

DreamineVirtualKeyboard.cs 파일의 99 번째 라인에서 정의되었습니다.

다음에 의해서 참조됨 : RegisterHookEventsAsync(), UnregisterHookEvents().

◆ _inputModeBtn

Button? Dreamine.UI.Wpf.Equipment.DreamineVirtualKeyboard.DreamineVirtualKeyboard._inputModeBtn
protected

한영 입력 모드 버튼을 보관합니다.

DreamineVirtualKeyboard.cs 파일의 136 번째 라인에서 정의되었습니다.

다음에 의해서 참조됨 : Dispose(), FindElements(), UpdateInputModeKey().

◆ _keyboardStateSyncTimer

readonly DispatcherTimer Dreamine.UI.Wpf.Equipment.DreamineVirtualKeyboard.DreamineVirtualKeyboard._keyboardStateSyncTimer
private

표시 중 시스템 언어·IME 상태를 주기적으로 동기화하는 타이머입니다.

DreamineVirtualKeyboard.cs 파일의 70 번째 라인에서 정의되었습니다.

다음에 의해서 참조됨 : Dispose(), DreamineVirtualKeyboard(), KeyboardUserControl_IsVisibleChanged(), KeyboardUserControl_Loaded(), KeyboardUserControl_Unloaded().

◆ _keys

IEnumerable<Key>? Dreamine.UI.Wpf.Equipment.DreamineVirtualKeyboard.DreamineVirtualKeyboard._keys
protected

현재 레이아웃에서 찾은 가상 키 버튼 시퀀스를 보관합니다.

DreamineVirtualKeyboard.cs 파일의 118 번째 라인에서 정의되었습니다.

다음에 의해서 참조됨 : Dispose(), FindElements(), Hook_KeyPressed(), Hook_KeyReleased(), KeyClick(), UpdateKeys().

◆ _langBtn

Button? Dreamine.UI.Wpf.Equipment.DreamineVirtualKeyboard.DreamineVirtualKeyboard._langBtn
protected

언어 전환 버튼을 보관합니다.

DreamineVirtualKeyboard.cs 파일의 127 번째 라인에서 정의되었습니다.

다음에 의해서 참조됨 : Dispose(), FindElements(), UpdateLangKey().

◆ _lastSelfImeToggleAt

DateTime Dreamine.UI.Wpf.Equipment.DreamineVirtualKeyboard.DreamineVirtualKeyboard._lastSelfImeToggleAt = DateTime.MinValue
private

컨트롤이 마지막으로 IME를 전환한 UTC 시각입니다.

DreamineVirtualKeyboard.cs 파일의 165 번째 라인에서 정의되었습니다.

다음에 의해서 참조됨 : SetKoreanEnglishMode().

◆ _lastSelfLangSwitchAt

DateTime Dreamine.UI.Wpf.Equipment.DreamineVirtualKeyboard.DreamineVirtualKeyboard._lastSelfLangSwitchAt = DateTime.MinValue
private

컨트롤이 마지막으로 입력 언어를 전환한 UTC 시각입니다.

DreamineVirtualKeyboard.cs 파일의 174 번째 라인에서 정의되었습니다.

다음에 의해서 참조됨 : SetKoreanEnglishMode().

◆ _lastSelfShiftAt

DateTime Dreamine.UI.Wpf.Equipment.DreamineVirtualKeyboard.DreamineVirtualKeyboard._lastSelfShiftAt = DateTime.MinValue
private

컨트롤이 마지막으로 Shift 입력을 시뮬레이션한 UTC 시각입니다.

DreamineVirtualKeyboard.cs 파일의 183 번째 라인에서 정의되었습니다.

다음에 의해서 참조됨 : SimulateCharKey().

◆ _layoutRoot

Panel? Dreamine.UI.Wpf.Equipment.DreamineVirtualKeyboard.DreamineVirtualKeyboard._layoutRoot
protected

현재 템플릿의 키보드 레이아웃 루트를 보관합니다.

DreamineVirtualKeyboard.cs 파일의 109 번째 라인에서 정의되었습니다.

다음에 의해서 참조됨 : Dispose(), EnsurePreviewFocus(), FindElements().

◆ _pendingKoreanInputMode

bool? Dreamine.UI.Wpf.Equipment.DreamineVirtualKeyboard.DreamineVirtualKeyboard._pendingKoreanInputMode
private

시스템 반영을 기다리는 한국어 입력 모드 값을 보관합니다.

DreamineVirtualKeyboard.cs 파일의 192 번째 라인에서 정의되었습니다.

다음에 의해서 참조됨 : IsKoreanInputActive(), RecheckKeyboardStateSoon(), RefreshKeyboardVisualState(), SetKoreanEnglishMode(), SynchronizeKeyboardState().

◆ _pendingKoreanInputModeUntil

DateTime Dreamine.UI.Wpf.Equipment.DreamineVirtualKeyboard.DreamineVirtualKeyboard._pendingKoreanInputModeUntil = DateTime.MinValue
private

보류 중인 한국어 입력 모드를 유지할 UTC 기한입니다.

DreamineVirtualKeyboard.cs 파일의 201 번째 라인에서 정의되었습니다.

다음에 의해서 참조됨 : SetKoreanEnglishMode().

◆ _repeatBackspaceCts

CancellationTokenSource? Dreamine.UI.Wpf.Equipment.DreamineVirtualKeyboard.DreamineVirtualKeyboard._repeatBackspaceCts
private

Backspace 반복 작업 취소 토큰 원본입니다.

DreamineVirtualKeyboard.cs 파일의 146 번째 라인에서 정의되었습니다.

다음에 의해서 참조됨 : BackspaceMouseCaptureLost(), ReleaseBackspaceRepeat(), StartBackspaceRepeat().

◆ _repeatBackspaceKey

Key? Dreamine.UI.Wpf.Equipment.DreamineVirtualKeyboard.DreamineVirtualKeyboard._repeatBackspaceKey
private

마우스를 캡처한 반복 Backspace 키를 보관합니다.

DreamineVirtualKeyboard.cs 파일의 155 번째 라인에서 정의되었습니다.

다음에 의해서 참조됨 : BackspaceMouseCaptureLost(), ReleaseBackspaceRepeat(), StartBackspaceRepeat().

◆ IsPasswordLayoutProperty

readonly DependencyProperty Dreamine.UI.Wpf.Equipment.DreamineVirtualKeyboard.DreamineVirtualKeyboard.IsPasswordLayoutProperty = IsPasswordLayoutPropertyKey.DependencyProperty
static

읽기 전용 IsPasswordLayout 종속성 속성을 식별합니다.

DreamineVirtualKeyboard.cs 파일의 387 번째 라인에서 정의되었습니다.

◆ IsPasswordLayoutPropertyKey

readonly DependencyPropertyKey Dreamine.UI.Wpf.Equipment.DreamineVirtualKeyboard.DreamineVirtualKeyboard.IsPasswordLayoutPropertyKey
staticprivate
초기값:

읽기 전용 IsPasswordLayout 종속성 속성 키입니다.

DreamineVirtualKeyboard.cs 파일의 376 번째 라인에서 정의되었습니다.

◆ LayoutProperty

readonly DependencyProperty Dreamine.UI.Wpf.Equipment.DreamineVirtualKeyboard.DreamineVirtualKeyboard.LayoutProperty
static
초기값:
=
DependencyProperty.Register("Layout", typeof(VkLayout), typeof(DreamineVirtualKeyboard), new PropertyMetadata(VkLayout.Text, OnLayoutChanged))
static void OnLayoutChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)

Layout 종속성 속성을 식별합니다.

DreamineVirtualKeyboard.cs 파일의 303 번째 라인에서 정의되었습니다.

◆ VirtualKeyDownEvent

readonly RoutedEvent Dreamine.UI.Wpf.Equipment.DreamineVirtualKeyboard.DreamineVirtualKeyboard.VirtualKeyDownEvent
static
초기값:
= EventManager.
RegisterRoutedEvent(nameof(VirtualKeyDown), RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(DreamineVirtualKeyboard))

VirtualKeyDown 버블링 라우트 이벤트를 식별합니다.

DreamineVirtualKeyboard.cs 파일의 272 번째 라인에서 정의되었습니다.

다음에 의해서 참조됨 : KeyClick().

속성 문서화

◆ CurrentLang

LanguageCode Dreamine.UI.Wpf.Equipment.DreamineVirtualKeyboard.DreamineVirtualKeyboard.CurrentLang
getprivate set

현재 키보드 입력 언어를 가져옵니다.

DreamineVirtualKeyboard.cs 파일의 449 번째 라인에서 정의되었습니다.

449{ get; private set; }

다음에 의해서 참조됨 : ApplyDesiredImeMode(), Dreamine.UI.Wpf.Equipment.DreamineVirtualKeyboard.DreamineVirtualKeyboardUI.SetInputMethod(), SetLanguage(), SynchronizeKeyboardState(), TryHandleComposedTextKey(), UpdateInputModeKey(), UpdateKeys().

◆ HasPendingKoreanInputMode

bool Dreamine.UI.Wpf.Equipment.DreamineVirtualKeyboard.DreamineVirtualKeyboard.HasPendingKoreanInputMode
getprivate

아직 유효한 한국어 입력 모드 변경이 보류 중인지 나타냅니다.

DreamineVirtualKeyboard.cs 파일의 237 번째 라인에서 정의되었습니다.

다음에 의해서 참조됨 : IsKoreanInputActive(), RefreshKeyboardVisualState(), SynchronizeKeyboardState().

◆ ImeMode

bool Dreamine.UI.Wpf.Equipment.DreamineVirtualKeyboard.DreamineVirtualKeyboard.ImeMode
getprivate set

현재 IME가 활성 입력 모드인지 나타냅니다.

DreamineVirtualKeyboard.cs 파일의 495 번째 라인에서 정의되었습니다.

495{ get; private set; }

다음에 의해서 참조됨 : ApplyDesiredImeMode(), RefreshKeyboardVisualState(), SynchronizeKeyboardState(), TryHandleComposedTextKey(), UpdateInputModeKey(), UpdateKeys().

◆ InImeGuard

bool Dreamine.UI.Wpf.Equipment.DreamineVirtualKeyboard.DreamineVirtualKeyboard.InImeGuard
getprivate

현재 자체 IME 전환 보호 구간인지 나타냅니다.

DreamineVirtualKeyboard.cs 파일의 219 번째 라인에서 정의되었습니다.

다음에 의해서 참조됨 : UpdateInputModeKey(), UpdateKeys().

◆ InLangGuard

bool Dreamine.UI.Wpf.Equipment.DreamineVirtualKeyboard.DreamineVirtualKeyboard.InLangGuard
getprivate

현재 자체 언어 전환 보호 구간인지 나타냅니다.

DreamineVirtualKeyboard.cs 파일의 228 번째 라인에서 정의되었습니다.

다음에 의해서 참조됨 : OnInputLanguageChanged(), SynchronizeKeyboardState().

◆ InShiftGuard

bool Dreamine.UI.Wpf.Equipment.DreamineVirtualKeyboard.DreamineVirtualKeyboard.InShiftGuard
getprivate

현재 자체 Shift 입력 보호 구간인지 나타냅니다.

DreamineVirtualKeyboard.cs 파일의 248 번째 라인에서 정의되었습니다.

다음에 의해서 참조됨 : Hook_KeyPressed(), Hook_KeyReleased().

◆ IsPasswordLayout

bool Dreamine.UI.Wpf.Equipment.DreamineVirtualKeyboard.DreamineVirtualKeyboard.IsPasswordLayout
getprivate set

현재 레이아웃이 암호 입력용인지 나타냅니다.

DreamineVirtualKeyboard.cs 파일의 397 번째 라인에서 정의되었습니다.

398 {
399 get => (bool)GetValue(IsPasswordLayoutProperty);
400 private set => SetValue(IsPasswordLayoutPropertyKey, value);
401 }

다음에 의해서 참조됨 : TryTogglePreviewVisuals().

◆ IsPressedCapsLock

bool Dreamine.UI.Wpf.Equipment.DreamineVirtualKeyboard.DreamineVirtualKeyboard.IsPressedCapsLock
get

운영체제에서 읽은 실제 Caps Lock 토글 상태를 가져옵니다.

물리 키보드와 가상 키보드가 동일한 운영체제 상태를 사용하여 서로 다른 토글 상태를 만들지 않습니다.

DreamineVirtualKeyboard.cs 파일의 476 번째 라인에서 정의되었습니다.

다음에 의해서 참조됨 : Hook_KeyPressed(), Hook_KeyReleased(), KeyClick(), ReleasePressedKeys(), TryHandleComposedTextKey(), UpdateKeys().

◆ IsPressedCtrl

bool Dreamine.UI.Wpf.Equipment.DreamineVirtualKeyboard.DreamineVirtualKeyboard.IsPressedCtrl
getset

Ctrl 키가 눌린 상태인지 가져오거나 설정합니다.

DreamineVirtualKeyboard.cs 파일의 486 번째 라인에서 정의되었습니다.

486{ get; set; }

다음에 의해서 참조됨 : Hook_KeyPressed(), Hook_KeyReleased(), KeyClick(), ReleasePressedKeys().

◆ IsPressedShift

bool Dreamine.UI.Wpf.Equipment.DreamineVirtualKeyboard.DreamineVirtualKeyboard.IsPressedShift
getprivate set

Shift 키가 눌린 상태인지 나타냅니다.

DreamineVirtualKeyboard.cs 파일의 458 번째 라인에서 정의되었습니다.

458{ get; private set; }

다음에 의해서 참조됨 : Hook_KeyPressed(), Hook_KeyReleased(), KeyboardUserControl_IsVisibleChanged(), KeyClick(), ReleasePressedKeys(), SimulateCharKey(), TryHandleComposedTextKey(), UpdateKeys().

◆ Layout

◆ OnKeyboardLanguageChanged

EventHandler<LanguageCode>? Dreamine.UI.Wpf.Equipment.DreamineVirtualKeyboard.DreamineVirtualKeyboard.OnKeyboardLanguageChanged
getset

키보드 언어가 변경될 때 호출할 처리기를 가져오거나 설정합니다.

DreamineVirtualKeyboard.cs 파일의 38 번째 라인에서 정의되었습니다.

38{ get; set; }

다음에 의해서 참조됨 : Dreamine.UI.Wpf.Equipment.DreamineVirtualKeyboard.DreamineVirtualKeyboardUI.DreamineVirtualKeyboardUI(), SetLanguage().

이벤트 문서화

◆ VirtualKeyDown

RoutedEventHandler Dreamine.UI.Wpf.Equipment.DreamineVirtualKeyboard.DreamineVirtualKeyboard.VirtualKeyDown
addremove

가상 키가 눌렸을 때 발생합니다.

DreamineVirtualKeyboard.cs 파일의 283 번째 라인에서 정의되었습니다.

284 {
285 add { AddHandler(VirtualKeyDownEvent, value); }
286 remove { RemoveHandler(VirtualKeyDownEvent, value); }
287 }

이 클래스에 대한 문서화 페이지는 다음의 파일로부터 생성되었습니다.: