|
@@ -1,453 +0,0 @@
|
|
|
-#include "CVirtualKeyboardWnd.h"
|
|
|
|
|
-
|
|
|
|
|
-namespace
|
|
|
|
|
-{
|
|
|
|
|
- struct KeyButtonDef
|
|
|
|
|
- {
|
|
|
|
|
- LPCTSTR name;
|
|
|
|
|
- TCHAR alphaLower;
|
|
|
|
|
- TCHAR alphaUpper;
|
|
|
|
|
- TCHAR symbol;
|
|
|
|
|
- TCHAR symbolShift;
|
|
|
|
|
- };
|
|
|
|
|
-
|
|
|
|
|
- const KeyButtonDef g_keyButtons[] =
|
|
|
|
|
- {
|
|
|
|
|
- { _T("btn_q"), _T('q'), _T('Q'), _T('1'), _T('[') },
|
|
|
|
|
- { _T("btn_w"), _T('w'), _T('W'), _T('2'), _T(']') },
|
|
|
|
|
- { _T("btn_e"), _T('e'), _T('E'), _T('3'), _T('{') },
|
|
|
|
|
- { _T("btn_r"), _T('r'), _T('R'), _T('4'), _T('}') },
|
|
|
|
|
- { _T("btn_t"), _T('t'), _T('T'), _T('5'), _T('#') },
|
|
|
|
|
- { _T("btn_y"), _T('y'), _T('Y'), _T('6'), _T('%') },
|
|
|
|
|
- { _T("btn_u"), _T('u'), _T('U'), _T('7'), _T('^') },
|
|
|
|
|
- { _T("btn_i"), _T('i'), _T('I'), _T('8'), _T('*') },
|
|
|
|
|
- { _T("btn_o"), _T('o'), _T('O'), _T('9'), _T('+') },
|
|
|
|
|
- { _T("btn_p"), _T('p'), _T('P'), _T('0'), _T('=') },
|
|
|
|
|
- { _T("btn_a"), _T('a'), _T('A'), _T('-'), _T('_') },
|
|
|
|
|
- { _T("btn_s"), _T('s'), _T('S'), _T('/'), _T('\\') },
|
|
|
|
|
- { _T("btn_d"), _T('d'), _T('D'), _T(':'), _T('|') },
|
|
|
|
|
- { _T("btn_f"), _T('f'), _T('F'), _T(';'), _T('~') },
|
|
|
|
|
- { _T("btn_g"), _T('g'), _T('G'), _T('('), _T('<') },
|
|
|
|
|
- { _T("btn_h"), _T('h'), _T('H'), _T(')'), _T('>') },
|
|
|
|
|
- { _T("btn_j"), _T('j'), _T('J'), _T('$'), _T('$') },
|
|
|
|
|
- { _T("btn_k"), _T('k'), _T('K'), _T('&'), _T('&') },
|
|
|
|
|
- { _T("btn_l"), _T('l'), _T('L'), _T('@'), _T('@') },
|
|
|
|
|
- { _T("btn_apos"), _T('\''), _T('"'), _T('`'), _T('"') },
|
|
|
|
|
- { _T("btn_z"), _T('z'), _T('Z'), _T('.'), _T('.') },
|
|
|
|
|
- { _T("btn_x"), _T('x'), _T('X'), _T(','), _T(',') },
|
|
|
|
|
- { _T("btn_c"), _T('c'), _T('C'), _T('?'), _T('?') },
|
|
|
|
|
- { _T("btn_v"), _T('v'), _T('V'), _T('!'), _T('!') },
|
|
|
|
|
- { _T("btn_b"), _T('b'), _T('B'), _T('\''), _T('\'') },
|
|
|
|
|
- { _T("btn_n"), _T('n'), _T('N'), _T('#'), _T('"') },
|
|
|
|
|
- { _T("btn_m"), _T('m'), _T('M'), _T('%'), _T(';') },
|
|
|
|
|
- { _T("btn_comma"), _T(','), _T('<'), _T('+'), _T(':') },
|
|
|
|
|
- { _T("btn_dot"), _T('.'), _T('>'), _T('='), _T('-') },
|
|
|
|
|
- { _T("btn_question"), _T('/'), _T('?'), _T('_'), _T('/') },
|
|
|
|
|
- };
|
|
|
|
|
-
|
|
|
|
|
- const KeyButtonDef* FindKeyButton(LPCTSTR name)
|
|
|
|
|
- {
|
|
|
|
|
- for (const auto& key : g_keyButtons)
|
|
|
|
|
- {
|
|
|
|
|
- if (_tcscmp(key.name, name) == 0)
|
|
|
|
|
- {
|
|
|
|
|
- return &key;
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- return nullptr;
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- void SetButtonText(DuiLib::CPaintManagerUI& pm, LPCTSTR name, TCHAR ch)
|
|
|
|
|
- {
|
|
|
|
|
- TCHAR text[2] = { ch, 0 };
|
|
|
|
|
- auto* button = static_cast<DuiLib::CButtonUI*>(pm.FindControl(name));
|
|
|
|
|
- if (button != nullptr)
|
|
|
|
|
- {
|
|
|
|
|
- button->SetText(text);
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- void SetButtonText(DuiLib::CPaintManagerUI& pm, LPCTSTR name, LPCTSTR text)
|
|
|
|
|
- {
|
|
|
|
|
- auto* button = static_cast<DuiLib::CButtonUI*>(pm.FindControl(name));
|
|
|
|
|
- if (button != nullptr)
|
|
|
|
|
- {
|
|
|
|
|
- button->SetText(text);
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-CVirtualKeyboardWnd::CVirtualKeyboardWnd()
|
|
|
|
|
- : m_bIsShiftDown(false)
|
|
|
|
|
- , m_bIsCtrlDown(false)
|
|
|
|
|
- , m_bIsNumSymbol(false)
|
|
|
|
|
- , m_hTargetWnd(NULL)
|
|
|
|
|
-{
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-CVirtualKeyboardWnd::~CVirtualKeyboardWnd()
|
|
|
|
|
-{
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-void CVirtualKeyboardWnd::InitWindow()
|
|
|
|
|
-{
|
|
|
|
|
- m_pm.SetNoActivate(true);
|
|
|
|
|
- UpdateTargetWindow();
|
|
|
|
|
- UpdateLetterButtonsText();
|
|
|
|
|
- UpdateModifierButtonsState();
|
|
|
|
|
-
|
|
|
|
|
- SetButtonText(m_pm, _T("btn_num_symbol"), _T("&123"));
|
|
|
|
|
- SetButtonText(m_pm, _T("btn_switch_ime"), _T("中/英"));
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-void CVirtualKeyboardWnd::Notify(TNotifyUI& msg)
|
|
|
|
|
-{
|
|
|
|
|
- if (msg.sType == _T("click"))
|
|
|
|
|
- {
|
|
|
|
|
- UpdateTargetWindow();
|
|
|
|
|
- CDuiString sName = msg.pSender->GetName();
|
|
|
|
|
-
|
|
|
|
|
- if (sName == _T("closebtn"))
|
|
|
|
|
- {
|
|
|
|
|
- Close();
|
|
|
|
|
- return;
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- if (sName == _T("btn_shift_l") || sName == _T("btn_shift_r"))
|
|
|
|
|
- {
|
|
|
|
|
- ToggleShift();
|
|
|
|
|
- return;
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- if (sName == _T("btn_ctrl"))
|
|
|
|
|
- {
|
|
|
|
|
- ToggleCtrl();
|
|
|
|
|
- return;
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- if (sName == _T("btn_num_symbol"))
|
|
|
|
|
- {
|
|
|
|
|
- SwitchNumSymbolLayout();
|
|
|
|
|
- return;
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- if (sName == _T("btn_backspace"))
|
|
|
|
|
- {
|
|
|
|
|
- SimulateSpecialKey(VK_BACK);
|
|
|
|
|
- return;
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- if (sName == _T("btn_enter"))
|
|
|
|
|
- {
|
|
|
|
|
- SimulateSpecialKey(VK_RETURN);
|
|
|
|
|
- return;
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- if (sName == _T("btn_space"))
|
|
|
|
|
- {
|
|
|
|
|
- SimulateSpecialKey(VK_SPACE);
|
|
|
|
|
- return;
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- if (sName == _T("btn_left"))
|
|
|
|
|
- {
|
|
|
|
|
- SimulateSpecialKey(VK_LEFT);
|
|
|
|
|
- return;
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- if (sName == _T("btn_right"))
|
|
|
|
|
- {
|
|
|
|
|
- SimulateSpecialKey(VK_RIGHT);
|
|
|
|
|
- return;
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- if (sName == _T("btn_switch_ime"))
|
|
|
|
|
- {
|
|
|
|
|
- ToggleImeLanguageMode();
|
|
|
|
|
- return;
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- if (sName == _T("btn_handwriting"))
|
|
|
|
|
- {
|
|
|
|
|
- OpenHandwritingPanel();
|
|
|
|
|
- return;
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- if (const auto* key = FindKeyButton(sName))
|
|
|
|
|
- {
|
|
|
|
|
- const TCHAR ch = m_bIsNumSymbol
|
|
|
|
|
- ? (m_bIsShiftDown ? key->symbolShift : key->symbol)
|
|
|
|
|
- : (m_bIsShiftDown ? key->alphaUpper : key->alphaLower);
|
|
|
|
|
-
|
|
|
|
|
- SimulateKeyPress(ch);
|
|
|
|
|
- return;
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- __super::Notify(msg);
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-void CVirtualKeyboardWnd::SimulateKeyPress(TCHAR ch)
|
|
|
|
|
-{
|
|
|
|
|
- SHORT vkInfo = ::VkKeyScan(ch);
|
|
|
|
|
- if (vkInfo == -1)
|
|
|
|
|
- {
|
|
|
|
|
- return;
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- BYTE vkCode = LOBYTE(vkInfo);
|
|
|
|
|
- BYTE shiftState = HIBYTE(vkInfo);
|
|
|
|
|
- bool useCtrl = m_bIsCtrlDown;
|
|
|
|
|
- bool useShift = (shiftState & 1) != 0;
|
|
|
|
|
-
|
|
|
|
|
- if (useCtrl)
|
|
|
|
|
- {
|
|
|
|
|
- ::keybd_event(VK_CONTROL, static_cast<BYTE>(::MapVirtualKey(VK_CONTROL, 0)), 0, 0);
|
|
|
|
|
- }
|
|
|
|
|
- if (useShift)
|
|
|
|
|
- {
|
|
|
|
|
- ::keybd_event(VK_SHIFT, static_cast<BYTE>(::MapVirtualKey(VK_SHIFT, 0)), 0, 0);
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- ::keybd_event(vkCode, static_cast<BYTE>(::MapVirtualKey(vkCode, 0)), 0, 0);
|
|
|
|
|
- ::keybd_event(vkCode, static_cast<BYTE>(::MapVirtualKey(vkCode, 0)), KEYEVENTF_KEYUP, 0);
|
|
|
|
|
-
|
|
|
|
|
- if (useShift)
|
|
|
|
|
- {
|
|
|
|
|
- ::keybd_event(VK_SHIFT, static_cast<BYTE>(::MapVirtualKey(VK_SHIFT, 0)), KEYEVENTF_KEYUP, 0);
|
|
|
|
|
- }
|
|
|
|
|
- if (useCtrl)
|
|
|
|
|
- {
|
|
|
|
|
- ::keybd_event(VK_CONTROL, static_cast<BYTE>(::MapVirtualKey(VK_CONTROL, 0)), KEYEVENTF_KEYUP, 0);
|
|
|
|
|
- m_bIsCtrlDown = false;
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- if (m_bIsShiftDown)
|
|
|
|
|
- {
|
|
|
|
|
- m_bIsShiftDown = false;
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- UpdateLetterButtonsText();
|
|
|
|
|
- UpdateModifierButtonsState();
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-void CVirtualKeyboardWnd::SimulateSpecialKey(int vkCode)
|
|
|
|
|
-{
|
|
|
|
|
- if (vkCode == (VK_CONTROL | VK_SHIFT))
|
|
|
|
|
- {
|
|
|
|
|
- ::keybd_event(VK_CONTROL, static_cast<BYTE>(::MapVirtualKey(VK_CONTROL, 0)), 0, 0);
|
|
|
|
|
- ::keybd_event(VK_SHIFT, static_cast<BYTE>(::MapVirtualKey(VK_SHIFT, 0)), 0, 0);
|
|
|
|
|
- ::keybd_event(VK_SHIFT, static_cast<BYTE>(::MapVirtualKey(VK_SHIFT, 0)), KEYEVENTF_KEYUP, 0);
|
|
|
|
|
- ::keybd_event(VK_CONTROL, static_cast<BYTE>(::MapVirtualKey(VK_CONTROL, 0)), KEYEVENTF_KEYUP, 0);
|
|
|
|
|
- return;
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- bool useCtrl = m_bIsCtrlDown;
|
|
|
|
|
- bool useShift = m_bIsShiftDown;
|
|
|
|
|
-
|
|
|
|
|
- if (useCtrl)
|
|
|
|
|
- {
|
|
|
|
|
- ::keybd_event(VK_CONTROL, static_cast<BYTE>(::MapVirtualKey(VK_CONTROL, 0)), 0, 0);
|
|
|
|
|
- }
|
|
|
|
|
- if (useShift)
|
|
|
|
|
- {
|
|
|
|
|
- ::keybd_event(VK_SHIFT, static_cast<BYTE>(::MapVirtualKey(VK_SHIFT, 0)), 0, 0);
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- ::keybd_event(static_cast<BYTE>(vkCode), static_cast<BYTE>(::MapVirtualKey(vkCode, 0)), 0, 0);
|
|
|
|
|
- ::keybd_event(static_cast<BYTE>(vkCode), static_cast<BYTE>(::MapVirtualKey(vkCode, 0)), KEYEVENTF_KEYUP, 0);
|
|
|
|
|
-
|
|
|
|
|
- if (useShift)
|
|
|
|
|
- {
|
|
|
|
|
- ::keybd_event(VK_SHIFT, static_cast<BYTE>(::MapVirtualKey(VK_SHIFT, 0)), KEYEVENTF_KEYUP, 0);
|
|
|
|
|
- m_bIsShiftDown = false;
|
|
|
|
|
- }
|
|
|
|
|
- if (useCtrl)
|
|
|
|
|
- {
|
|
|
|
|
- ::keybd_event(VK_CONTROL, static_cast<BYTE>(::MapVirtualKey(VK_CONTROL, 0)), KEYEVENTF_KEYUP, 0);
|
|
|
|
|
- m_bIsCtrlDown = false;
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- UpdateLetterButtonsText();
|
|
|
|
|
- UpdateModifierButtonsState();
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-void CVirtualKeyboardWnd::ToggleImeLanguageMode()
|
|
|
|
|
-{
|
|
|
|
|
- RestoreTargetWindow();
|
|
|
|
|
-
|
|
|
|
|
- HWND hTarget = GetTargetWindow();
|
|
|
|
|
- if (hTarget == NULL)
|
|
|
|
|
- {
|
|
|
|
|
- return;
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- HWND hImeWnd = ::ImmGetDefaultIMEWnd(hTarget);
|
|
|
|
|
- if (hImeWnd != NULL)
|
|
|
|
|
- {
|
|
|
|
|
- HIMC hImc = ::ImmGetContext(hTarget);
|
|
|
|
|
- if (hImc != NULL)
|
|
|
|
|
- {
|
|
|
|
|
- BOOL isOpen = ::ImmGetOpenStatus(hImc);
|
|
|
|
|
- ::ImmSetOpenStatus(hImc, isOpen ? FALSE : TRUE);
|
|
|
|
|
-
|
|
|
|
|
- if (!isOpen)
|
|
|
|
|
- {
|
|
|
|
|
- DWORD conversion = 0;
|
|
|
|
|
- DWORD sentence = 0;
|
|
|
|
|
- if (::ImmGetConversionStatus(hImc, &conversion, &sentence))
|
|
|
|
|
- {
|
|
|
|
|
- ::ImmSetConversionStatus(hImc, conversion | IME_CMODE_NATIVE, sentence);
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- ::ImmReleaseContext(hTarget, hImc);
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- RestoreTargetWindow();
|
|
|
|
|
- return;
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- DWORD dwThreadId = ::GetWindowThreadProcessId(hTarget, NULL);
|
|
|
|
|
- HKL hkl = ::GetKeyboardLayout(dwThreadId);
|
|
|
|
|
- if (!::ImmIsIME(hkl))
|
|
|
|
|
- {
|
|
|
|
|
- RestoreTargetWindow();
|
|
|
|
|
- return;
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- HIMC hImc = ::ImmGetContext(hTarget);
|
|
|
|
|
- if (hImc == NULL)
|
|
|
|
|
- {
|
|
|
|
|
- ::ImmSimulateHotKey(hTarget, IME_CHOTKEY_IME_NONIME_TOGGLE);
|
|
|
|
|
- RestoreTargetWindow();
|
|
|
|
|
- return;
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- BOOL isOpen = ::ImmGetOpenStatus(hImc);
|
|
|
|
|
- ::ImmSetOpenStatus(hImc, isOpen ? FALSE : TRUE);
|
|
|
|
|
- if (!isOpen)
|
|
|
|
|
- {
|
|
|
|
|
- DWORD conversion = 0;
|
|
|
|
|
- DWORD sentence = 0;
|
|
|
|
|
- if (::ImmGetConversionStatus(hImc, &conversion, &sentence))
|
|
|
|
|
- {
|
|
|
|
|
- ::ImmSetConversionStatus(hImc, conversion | IME_CMODE_NATIVE, sentence);
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
- ::ImmReleaseContext(hTarget, hImc);
|
|
|
|
|
-
|
|
|
|
|
- RestoreTargetWindow();
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-void CVirtualKeyboardWnd::SimulateShiftPress(bool bPress)
|
|
|
|
|
-{
|
|
|
|
|
- m_bIsShiftDown = bPress;
|
|
|
|
|
- UpdateLetterButtonsText();
|
|
|
|
|
- UpdateModifierButtonsState();
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-void CVirtualKeyboardWnd::ToggleShift()
|
|
|
|
|
-{
|
|
|
|
|
- SimulateShiftPress(!m_bIsShiftDown);
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-void CVirtualKeyboardWnd::ToggleCtrl()
|
|
|
|
|
-{
|
|
|
|
|
- m_bIsCtrlDown = !m_bIsCtrlDown;
|
|
|
|
|
- UpdateModifierButtonsState();
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-void CVirtualKeyboardWnd::SwitchNumSymbolLayout()
|
|
|
|
|
-{
|
|
|
|
|
- m_bIsNumSymbol = !m_bIsNumSymbol;
|
|
|
|
|
- m_bIsShiftDown = false;
|
|
|
|
|
- UpdateLetterButtonsText();
|
|
|
|
|
- UpdateModifierButtonsState();
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-void CVirtualKeyboardWnd::UpdateLetterButtonsText()
|
|
|
|
|
-{
|
|
|
|
|
- for (const auto& key : g_keyButtons)
|
|
|
|
|
- {
|
|
|
|
|
- const TCHAR ch = m_bIsNumSymbol
|
|
|
|
|
- ? (m_bIsShiftDown ? key.symbolShift : key.symbol)
|
|
|
|
|
- : (m_bIsShiftDown ? key.alphaUpper : key.alphaLower);
|
|
|
|
|
- SetButtonText(m_pm, key.name, ch);
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- SetButtonText(m_pm, _T("btn_num_symbol"), m_bIsNumSymbol ? _T("ABC") : _T("&123"));
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-void CVirtualKeyboardWnd::UpdateModifierButtonsState()
|
|
|
|
|
-{
|
|
|
|
|
- const DWORD normalColor = 0xFF302F37;
|
|
|
|
|
- const DWORD activeColor = 0xFF555555;
|
|
|
|
|
-
|
|
|
|
|
- auto* leftShift = static_cast<CButtonUI*>(m_pm.FindControl(_T("btn_shift_l")));
|
|
|
|
|
- if (leftShift != nullptr)
|
|
|
|
|
- {
|
|
|
|
|
- leftShift->SetBkColor(m_bIsShiftDown ? activeColor : normalColor);
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- auto* rightShift = static_cast<CButtonUI*>(m_pm.FindControl(_T("btn_shift_r")));
|
|
|
|
|
- if (rightShift != nullptr)
|
|
|
|
|
- {
|
|
|
|
|
- rightShift->SetBkColor(m_bIsShiftDown ? activeColor : normalColor);
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- auto* ctrl = static_cast<CButtonUI*>(m_pm.FindControl(_T("btn_ctrl")));
|
|
|
|
|
- if (ctrl != nullptr)
|
|
|
|
|
- {
|
|
|
|
|
- ctrl->SetBkColor(m_bIsCtrlDown ? activeColor : normalColor);
|
|
|
|
|
- }
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-void CVirtualKeyboardWnd::UpdateTargetWindow()
|
|
|
|
|
-{
|
|
|
|
|
- HWND hFocus = ::GetFocus();
|
|
|
|
|
- if (hFocus != NULL && hFocus != m_hWnd && !::IsChild(m_hWnd, hFocus))
|
|
|
|
|
- {
|
|
|
|
|
- m_hTargetWnd = hFocus;
|
|
|
|
|
- }
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-HWND CVirtualKeyboardWnd::GetTargetWindow()
|
|
|
|
|
-{
|
|
|
|
|
- UpdateTargetWindow();
|
|
|
|
|
- if (m_hTargetWnd != NULL && ::IsWindow(m_hTargetWnd))
|
|
|
|
|
- {
|
|
|
|
|
- return m_hTargetWnd;
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- return NULL;
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-void CVirtualKeyboardWnd::RestoreTargetWindow()
|
|
|
|
|
-{
|
|
|
|
|
- HWND hTarget = GetTargetWindow();
|
|
|
|
|
- if (hTarget != NULL && ::GetFocus() != hTarget)
|
|
|
|
|
- {
|
|
|
|
|
- ::SetFocus(hTarget);
|
|
|
|
|
- }
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-void CVirtualKeyboardWnd::OpenHandwritingPanel()
|
|
|
|
|
-{
|
|
|
|
|
- if ((INT_PTR)::ShellExecute(m_hWnd, _T("open"), _T("TabTip.exe"), NULL, NULL, SW_SHOWNORMAL) <= 32)
|
|
|
|
|
- {
|
|
|
|
|
- ::ShellExecute(m_hWnd, _T("open"), _T("InputPanel.exe"), NULL, NULL, SW_SHOWNORMAL);
|
|
|
|
|
- }
|
|
|
|
|
- RestoreTargetWindow();
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-HWND CreateVirtualKeyboard()
|
|
|
|
|
-{
|
|
|
|
|
- CVirtualKeyboardWnd* pKeyboard = new CVirtualKeyboardWnd();
|
|
|
|
|
- if (pKeyboard)
|
|
|
|
|
- {
|
|
|
|
|
- return pKeyboard->Create(nullptr, _T("虚拟键盘"), WS_POPUP, WS_EX_TOPMOST | WS_EX_TOOLWINDOW | WS_EX_NOACTIVATE);
|
|
|
|
|
- }
|
|
|
|
|
- return nullptr;
|
|
|
|
|
-}
|
|
|