IPB
ЛогинПароль:

> Внимание!

1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным.
В описании темы указываем язык!!!

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

> работа с клавиатурой, C#, MSVS08
сообщение
Сообщение #1


Пионер
**

Группа: Пользователи
Сообщений: 104
Пол: Мужской
Реальное имя: Евгений

Репутация: -  0  +


Подскажите, пожалуйста, как научить программу отлавливать факт нажатия кнопок клавиатуры в окне другого приложения?
В общем нужно что-то типа клавиатурного шпиона написать...


--------------------
go ask Alice
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
сообщение
Сообщение #2


Пионер
**

Группа: Пользователи
Сообщений: 104
Пол: Мужской
Реальное имя: Евгений

Репутация: -  0  +


спасибо, попробовал сделать по шагам - споткнулся на GetFocus - возвращает ноль.
winH = GetForegroundWindow();
int otherThread = GetWindowThreadProcessId(winH, out otherProcessId);
int myThread = GetWindowThreadProcessId(this.Handle, out myProcessId);
AttachThreadInput(myThread, otherThread, true);
IntPtr n = GetFocus();

В чем может быть дело?

Пробовал сделать по-другому: через SendKeys.Send, но возникла проблема с раскладками - чтобы вывести транслитированный текст с помощью Send, нужно сменить раскладку в окне активного приложения - никак не могу разобраться, как это сделать!
for (int i = 0; i < buf.Count; i++)
SendKeys.Send("{BACKSPACE}");
LoadKeyboardLayout(LANG_EN_US, KLF_ACTIVATE);
foreach (int i in buf)
SendKeys.Send(abc[1, i - 'а']);
LoadKeyboardLayout(LANG_Ru_RU, KLF_ACTIVATE);

Но, видимо, LoadKeyboardLayout меняет раскладку только в моей программе... пробовал подключиться к потоку другого приложения - не помогло.

Обойтись без раскладок, в принципе, можно - используя SendMessage:
SendMessage(txtbox, WM_SETFOCUS, nul, nul);
SendMessage(txtbox, WM_KEYDOWN, (IntPtr) 'х', nul);
SendMessage(txtbox, WM_CHAR, (IntPtr) 'х', nul);
SendMessage(txtbox, WM_KEYUP, (IntPtr) 'х', nul);

Но тут надо определить хэндл поля ввода txtbox.
txtbox = FindWindowEx(winH, IntPtr.Zero, "Edit", null);

Это работает для NotePad'а, а универсальный способ есть?


--------------------
go ask Alice
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

Сообщений в этой теме
Unknown   работа с клавиатурой   16.04.2009 23:58
volvo   Глобальный хук на клавиатуру? Вот тут есть пример…   17.04.2009 1:12
Unknown   Спасибо! Теперь другой вопрос: как в окно друг…   17.04.2009 2:39
volvo   А оно тебе надо писать это в окно Word-а? Создать …   17.04.2009 2:48
Unknown   да, мне это нужно :) Мне нужно написать прогу напо…   17.04.2009 3:24
volvo   Ну, тогда смотри, как работать с Word-ом: Word Aut…   17.04.2009 4:10
Unknown   Word - это я просто в качестве примера привел. А в…   17.04.2009 15:21
Unknown   определять хэндл окна по его названию научился - f…   17.04.2009 16:31
volvo   Ты правильно понимаешь... На WinAPI это делается ч…   17.04.2009 16:36
Unknown   Вот спасибо! оказывается есть полно полезных ф…   17.04.2009 16:46
Unknown   Гмм... GetFocus все время возвращает 0... в чем мо…   20.04.2009 17:08
volvo   Ну и чего ты творишь? Я ж тебе дал ссылку на MSDN,…   20.04.2009 17:28
Unknown   спасибо, попробовал сделать по шагам - споткнулся …   21.04.2009 6:12
volvo   Хм... Надо будет установить себе хотя бы SharpDeve…   21.04.2009 13:11
volvo   Update: ответ на вопрос WinForms FAQ - "// N…   21.04.2009 14:25
Гость   т.е., к примеру, поле мемо программы, написанной …   24.04.2009 8:02
volvo   Установил себе наконец-то SharpDevelop, написал та…   25.04.2009 18:08
Unknown   Если я не ошибаюсь, я пробовал на ICQ... Спасибо з…   27.04.2009 7:48


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 26.05.2024 6:07
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name