Поиск:

Ответ в темуСоздание новой темы Создание опроса
> имитация нажатия клавиш клавиатуры 
:(
    Опции темы
Igoreck
Дата 11.3.2008, 11:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



С помощью какой функции  можно сымитировать нажатие клавиш клавиатуры.
Есть приложение на основе диалоговых окон, созданное с помощью  MFC (на VS 2005) . Задача, чтобы при клике мышкой  по экранной кнопке (т. е.  в функции OnBnClickedButton()   )  ,в случае если курсор стоит в EditBox,  стирался символ  - т.е. происходила имитация нажатия кнопки BkSp
Пробовал ф-цию OnKeyDown() – не работает 

PM MAIL   Вверх
korian
Дата 11.3.2008, 15:54 (ссылка)   | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 651
Регистрация: 8.3.2008
Где: Украина, Харьков

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



1) а в ручную делать этого нельзя? что-то типа
text = text.Left(text.GetLength() - 1)

2) для имитации нажатия клавиш можна использованть функцию keybd_event или SendInput.
можна еще посылать сообщения WM_KEYDOWN / WM_KEYUP


Это сообщение отредактировал(а) korian - 11.3.2008, 15:56
PM   Вверх
Igoreck
Дата 11.3.2008, 22:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



чтобы удалять вручную надо точно знать на каком символе в EditBox находится курсор ((  нам же не всегда надо удалять последний 
keybd_event   вроде под XP работать не будет ((   - если я правильно понял что написано в MSDN про нее  -  а  вот за SendInput()  спасиба - вроде то что надо  - только параметры которые надо туда передавать замороченные ( - ща разбираюсь с ее синтаксисом )  
 
PM MAIL   Вверх
korian
Дата 11.3.2008, 22:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 651
Регистрация: 8.3.2008
Где: Украина, Харьков

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



Цитата(Igoreck @  11.3.2008,  21:33 Найти цитируемый пост)
чтобы удалять вручную надо точно знать на каком символе в EditBox находится курсор 

для этого есть CEdit::GetSel
PM   Вверх
Igoreck
Дата 14.3.2008, 14:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



попробывал воспользоваться функцией SendInput(), ввел следующий код

void FIODlg::OnBnClickedButton50()
{
    // TODO: Add your control notification handler code here


            INPUT input1[1];
            memset (input1, 0, sizeof(input1));
            input1[0].type = INPUT_KEYBOARD;
            input1[0].ki.wVk = VK_BACK;
            SendInput(1, input1, sizeof(INPUT));


}

не работает (((
пробывал в качестве параметра wVk передавать другие значения для букавок (типа 0x31) и цифарок - не помогло,  в чем может быть причина ???  может в том что в момент нажатия кнопки на диалоговом окне фокус находится на кнопке а не на edit box'е ? 
PM MAIL   Вверх
korian
Дата 14.3.2008, 18:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 651
Регистрация: 8.3.2008
Где: Украина, Харьков

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



Цитата(Igoreck @  14.3.2008,  13:33 Найти цитируемый пост)
может в том что в момент нажатия кнопки на диалоговом окне фокус находится на кнопке а не на edit box'е

скорее всего.. проверить не проще чем спрашивать?   smile 
так а чем вам не нравится метод удаления символов по средставм использования CEdit::GetSel?

PM   Вверх
Earnest
Дата 14.3.2008, 19:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Конечно в этом: сообщение направляется тому окну, которое в фокусе.
Через CEdit::GetSel можно, но не уверсально - мало ли какие клавиши захочется имитировать - умаешься все писать... Всего-то нужно передать фокус эдиту перед SenInput.
В принципе, можно и без SendInput - просто посылать WM_KEYDOWN, прямо эдиту, тогда можно без SetFocus


--------------------
...
PM   Вверх
Dmi3ev
Дата 15.3.2008, 15:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1698
Регистрация: 28.11.2007

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



например надо нажать numlock
Код

keybd_event( VK_NUMLOCK, 0x45, KEYEVENTF_EXTENDEDKEY | 0, 0 );
keybd_event( VK_NUMLOCK, 0x45, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0);

такое надо?


--------------------

PM MAIL   Вверх
Igoreck
Дата 16.3.2008, 23:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



а под XP разве функция keybd_event будет работать??? 


The keybd_event function synthesizes a keystroke. The system can use such a synthesized keystroke to generate a WM_KEYUP or WM_KEYDOWN message. The keyboard driver's interrupt handler calls the keybd_event function.

Windows NT/2000/XP/Vista:This function has been superseded. Use SendInput instead.        -   как я понял из описания в MSDN для XP  " эта функция была заменена . Используйте вместо нее SendInput"  -   вроде так  - хотя я не совсем уверен(

PM MAIL   Вверх
Dmi3ev
Дата 17.3.2008, 00:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1698
Регистрация: 28.11.2007

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



Цитата

а под XP разве функция keybd_event будет работать???

у меня работает, проверь! че спрашиваешь? (быстрее самому проверить)
ну как?


--------------------

PM MAIL   Вверх
korian
Дата 17.3.2008, 01:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 651
Регистрация: 8.3.2008
Где: Украина, Харьков

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



Igoreck,
там написано только то, что если тебя не волнует совместимость с Win9x (и др не входящие в описанный список), то лучше используй SendInput.
PM   Вверх
Igoreck
Дата 17.3.2008, 17:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



навел фокус на edit box, добавив строчку   

  (CEdit*)GetDlgItem(IDC_EDIT3)->SetFocus();

где IDC_EDIT3 идентификатор моего Edit box' а  :


void FIODlg::OnBnClickedButton50()
{
    // TODO: Add your control notification handler code here


            (CEdit*)GetDlgItem(IDC_EDIT3)->SetFocus();

            INPUT input1[1];
            memset (input1, 0, sizeof(input1));
            input1[0].type = INPUT_KEYBOARD;
            input1[0].ki.wVk = VK_BACK;
            SendInput(1, input1, sizeof(INPUT));


}

не работет((

 попробывал заменить строку 
(CEdit*)GetDlgItem(IDC_EDIT3)->SetFocus();

на
 (CEdit*)m_PacF.SetFocus();   
 где m_PacF переменная управления(control) связанная с  Edit ' ом  - она имеет область видимости public   -    то же не работает (((


может я неправильно навожу фокус??
или указал не все параметры для функции   SendInput()


Это сообщение отредактировал(а) Igoreck - 17.3.2008, 17:39
PM MAIL   Вверх
korian
Дата 17.3.2008, 21:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 651
Регистрация: 8.3.2008
Где: Украина, Харьков

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



Код

INPUT input1[2];
memset (input1, 0, sizeof(input1));

input1[0].type = INPUT_KEYBOARD;
input1[0].ki.wVk = VK_BACK;

input1[1].type = INPUT_KEYBOARD;
input1[1].ki.wVk = VK_BACK;
input1[1].ki.dwFlags = KEYEVENTF_KEYUP;

SendInput(2, input1, sizeof(input1[0]));

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


Новичок



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

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



а зачем для кнопки "BK SP"  использовать KEYEVENTF_KEYUP ??   разве это нужно не только для кнопок , которые могут быть в двух положениях - нажато/отпущено   -  типа Caps Lock  ??


а с наведением фокуса я точно правильно делаю ? - мне показалось что косяк опять в фокусе(


Это сообщение отредактировал(а) Igoreck - 17.3.2008, 22:14
PM MAIL   Вверх
korian
Дата 18.3.2008, 00:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 651
Регистрация: 8.3.2008
Где: Украина, Харьков

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



Igoreck, 
у всех кнопок есть состояние нажата/не нажата
caps lock и т.д. плюс к этому имеют еще состояния включено/выключено
нажали на кнопку на клаве - KEY_DOWN
отпустили кнопку на клаве - KEY_UP
с установлением фокуса по типу
GetDlgItem(IDC_EDIT3)->SetFocus(); - проблем не вижу.
кстати вариант
(CEdit*)GetDlgItem(IDC_EDIT3)->SetFocus();
рассматриваеться как 
(CEdit*)(GetDlgItem(IDC_EDIT3)->SetFocus());
насколько я понимаю.
а SetFocus есть и у CWnd, так шо приводить к CEdit смысла большого нету.

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


 




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


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

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