Здравствуйте, Andrew S, Вы писали:
L_C>>>>Для получения хендела окна использую ::GetForegroundWindow();
L_C>>>>Может, кто знает, как добраться до EditBox`а?
AS>>>GetForegroundWindow, GetWindowThreadProcessId, AttachThreadInput и GetFocus.
L_C>>Вроде так и делаю, может что то не так?!!!
AS>Вам нужно получать фокус, а не устанавливать? Если так, тогда приведенный вами код выглядит по меньшей мере странно.
L_C>>L_C>>HWND hwnd = ::GetForegroundWindow();
L_C>> if(IsWindow(hwnd))
L_C>> {
L_C>> if(hwnd != this->m_hWnd)
L_C>> {
L_C>> if(m_hwndFocus != hwnd)
L_C>> {
L_C>> DWORD t1 = GetWindowThreadProcessId(hwnd, NULL);
L_C>> DWORD t2 = GetCurrentThreadId();
L_C>> if(IsWindow(m_hwndFocus))
L_C>> {
L_C>> AttachThreadInput(t2, t1, FALSE);
L_C>> }
L_C>> m_hwndFocus = hwnd;
L_C>> AttachThreadInput(t2, t1, TRUE);
L_C>> ::SetFocus(hwnd);
L_C>> }
L_C>> }
L_C>> }
L_C>>
Это я уже экспериментировал

Да SetFocus тут не нужен, прошу прощение. Скачал для примера исходники подобной клавиатуры с
http://www.codeproject.com, там был SetFocus ( там такая же проблема). Но проблема остается

в студии не работает, в Excel, Word тоже, вообщем во всех случаях, когда есть фрейм и есть любое поле для ввода текста. В этом случаи поле для ввода теряет фокус при нажатии на мою клавиатуру. В других случаях такого не наблюдал. В диалоговом окне, где много полей ввода все нормально.
Я даже знаю в чем проблема: мое окно становится на время активным, что с виндовской клавиатурой не случается. Хотя у меня есть такой код:
void CMyKeyboardDlg::OnWindowPosChanging(WINDOWPOS* lpwndpos)
{
SetWindowPos(&wndTopMost, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_NOACTIVATE | SWP_SHOWWINDOW | SWP_NOOWNERZORDER);
CDialog::OnWindowPosChanging(lpwndpos);
// TODO: Add your message handler code here
}
Может он не в том месте, или необходимо что то еще сделать?
P.S.
Может кто знает откуда можно скачать рабочий пример экранной клавиатуры?