Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Keyboard input focus 
V
    Опции темы
maq
Дата 21.5.2008, 23:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 173
Регистрация: 28.10.2005

Репутация: нет
Всего: нет



Мне нужно иммитировать нажатия Enter для другой загруженной программы окно которой активно, т.е. иммировать нажатие некоторой кнопки в окне другой программы. Использую WM_KEYDOWN. В результате получается, что я посылаю сообщение фрейму окна, а кнопка так и не получает это сообщение. Как я могу получить указатель или хендл именно контрола, который имеет фокус ввода клавиатуры? В VB 6 это проще – SendKeys ("{ENTER}") и все работает, а как в С++ не нашел.
PM MAIL   Вверх
Earnest
Дата 22.5.2008, 13:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



GetFocus (плохо искал). А насчет проще... проще то, что знаешь, так что воздержись впредь от подобных ремарок. smile

Добавлено через 1 минуту и 57 секунд
Еще можно использовать keybd_event или SendInput: это даже лучше, т.к. во-первых эмулирует полноценно нажатие, а во вторых, автоматически будет получено окном с фокусом ввода.


--------------------
...
PM   Вверх
maq
Дата 22.5.2008, 21:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 173
Регистрация: 28.10.2005

Репутация: нет
Всего: нет



Earnest, спасибо за совет 
Цитата
GetFocus


Но я уже его перепробовал прежде чем обратиться с вопросом.

Код

void CTMP010Dlg::OnBnClickedOk()
{
    SetTimer(1, 1000, NULL);
}

void CTMP010Dlg::OnTimer(UINT_PTR nIDEvent)
{
    if(nIDEvent == 1)
    {
        CWnd* pWnd = GetFocus();
        if(pWnd)
        {
            CString s1, s2;
            pWnd->GetWindowText(s1);
            s2.Format(_T("Focus found - %s"), s1);
            SetWindowText(s2);
            pWnd->SendMessage(WM_KEYDOWN, VK_RETURN, 0);
        }
        else
        {
            SetWindowText(_T("No focus found"));
        }
    }

    CDialog::OnTimer(nIDEvent);
}


1. Если запустить код, то видно, что GetFocus выдает указатель на окно только если оно отросится к этому же проекту, а не выдает фокус на окна не данного проекта.
2. Но даже когда я получаю фокус, никакого эффекта от SendMessage(WM_KEYDOWN).
 smile 
PM MAIL   Вверх
Earnest
Дата 23.5.2008, 11:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



Цитата(maq @  22.5.2008,  22:06 Найти цитируемый пост)
 Если запустить код, то видно, что GetFocus выдает указатель на окно 

Естественно:
Цитата

GetFocus returns the window with the keyboard focus for the current thread's message queue. If GetFocus returns NULL, another thread's queue may be attached to a window that has the keyboard focus. 
Use the GetForegroundWindow function to retrieve the handle to the window with which the user is currently working.

Насчет "другой программы" я пропустила, извиняюсь.
Прислушайся к совету об эмуляции через SendInput. 



--------------------
...
PM   Вверх
maq
Дата 4.6.2008, 22:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 173
Регистрация: 28.10.2005

Репутация: нет
Всего: нет



Я решил проблему с помощью SendInput. Но мне все же интересно как можно получить указатель на активный контрол активного окна если оно не относится к текущему процессу?
PM MAIL   Вверх
Earnest
Дата 5.6.2008, 12:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



Сказано же - GetForegroundWindow


--------------------
...
PM   Вверх
Rrader
  Дата 5.6.2008, 14:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Inspired =)
***


Профиль
Группа: Экс. модератор
Сообщений: 1535
Регистрация: 7.5.2005

Репутация: 1
Всего: 191



Цитата(maq @  5.6.2008,  05:25 Найти цитируемый пост)
Но мне все же интересно как можно получить указатель на активный контрол активного окна если оно не относится к текущему процессу?

Код

HANDLE GetActWindowFocusCtrl()
{
    DWORD ThreadID;
    HANDLE Wnd;
    ThreadID = GetWindowThreadProcessId(GetForegroundWindow(), NULL);
    AttachThreadInput(ThreadID, GetCurrentThreadId(), true);
    Wnd = GetFocus();
    AttachThreadInput(ThreadID, GetCurrentThreadId(), false);
    return Wnd;
}



--------------------
Let's do this quickly!
Rest in peace, Vit!
PM MAIL Skype   Вверх
maq
Дата 5.6.2008, 18:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 173
Регистрация: 28.10.2005

Репутация: нет
Всего: нет



Earnest, 
еще раз «спасибо». Вы уже кажется второй раз «пропускаете». Так что ваши 
Цитата
Сказано же - GetForegroundWindow
 
попросту неуместны. Кстати, я пробовал и GetForegroundWindow перед тем как открыть тему.

из МСДН
Цитата
static CWnd* PASCAL GetForegroundWindow( );
The foreground window applies only to top-level windows (frame windows or dialog boxes).

А я искал (как уже писал выше) указатель на активный контрол активного окна, имеющий фокус.

Rrader, 
заработало! Спасибо большое!
Интересно было разбирать твой код
PM MAIL   Вверх
Earnest
Дата 5.6.2008, 19:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



Цитата(maq @  5.6.2008,  19:38 Найти цитируемый пост)
 Кстати, я пробовал и GetForegroundWindow перед тем как открыть тему.

Ну и написал бы, что у тебя не получилось - я же не телепат. 
А ведь все-таки черз GetForegrondWindow. Только потом я бы использовала GetGUIThreadInfo: там тебе и фокус и бог знает что еще...
Ах да, сначала нужно определить поток, которому принадлежит окно через GetWindowThreadProcessId (а то вдруг сам не найдешь) smile 


--------------------
...
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




[ Время генерации скрипта: 0.0561 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.