Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как включить верхний регистр в чужом процессе ? [D7, Win2k, WinXP]


Страницы:   1 2 3 4

ANB ©   (2005-08-29 14:39:00) 

Чтобы напечатать строго большую или маленькую букву независимо от текущего состояния. Попробовал вот так - не помогает. :

 // Установим регистр
 ThreadFrom := GetCurrentThreadId;
 ThreadTo := GetWindowThreadProcessId(hWindow, nil);
 AttachThreadInput(ThreadFrom, ThreadTo, True);
 GetKeyBoardState(KeyBoardState);
 KeyBoardState[VK_CAPITAL] := 0;
 if (bUpper) then begin
  KeyBoardState[VK_SHIFT] := $FF;
  KeyBoardState[VK_LSHIFT] := $FF;
 end else begin
  KeyBoardState[VK_SHIFT] := $FF;
  KeyBoardState[VK_LSHIFT] := $FF;
 end;
 SetKeyBoardState(KeyBoardState);
 // Эмулируем нажатие клавиши
 keybd_event(dwVK, bScanCode, dwFlags, 0);
 AttachThreadInput(ThreadFrom, ThreadTo, False);
- всегда печатает маленькими. Пробовал вместо FF - 1, никакого эффекта.


ANB   (2005-09-01 11:46:00) [41]

WM_SYS* трассирую - они не приезжают.


ANB   (2005-09-01 11:43:00) [42]


> alpet ©   (01.09.05 11:40) [35]
- я прямо из спая параметры влепил. Для пробы. Хотя надо попробовать . . . Чичас.


alpet   (2005-09-01 11:40:00) [43]

ANB ©   (01.09.05 11:28) [34]
Погоди, WM_(SYS)KEYDOWN / WM_(SYS)KEYUP он при этом не кушает? А как же тогда трансляция (генерация WM_CHAR / WM_SYSCHAR) выполняется? Присмотрись также к параметру lParam = в нем вроде можно Ctrl/Alt задавать.


ANB   (2005-09-01 11:28:00) [44]

Фух. Нашел. Обычные кнопки стали нажиматься, если их посылать PostMessage WM_CHAR. Хе. А горячие - фиг вам. Полностью запостил все из спая - не ест. Нажал сам ctrl и послал сообщение WM_CHAR - сработало. Похоже, таки анализирует он KeyboardState. Придется таки эмуляцию не выкидывать. Тока поломал я ее немного. Седня чинить буду.


alpet   (2005-08-30 16:12:00) [45]

ANB ©   (30.08.05 14:09) [32]

Не может он этого делать умышленно. Поскольку не консольное приложение.


ANB   (2005-08-30 14:09:00) [46]


> alpet ©   (30.08.05 13:51) [31]
- так может Magic это умышленно и делает ? Тады можно писать кнопки в этот поток. SQL Plus очень похож на консольное приложение, только выполняется, как оконное. Ща попробую ему поток подсунуть . . .


alpet   (2005-08-30 13:51:00) [47]

ANB ©   (30.08.05 13:41) [30]

Могут, но только умышленно. Впрочем можно написать DLL, которую потом внедрять в любой процесс обрабатывающий сообщения ввода. Она будет считывать с потока ввода нажатия клавиш, и преобразовывать в сообщения. Только зачем это надо?


ANB   (2005-08-30 13:41:00) [48]


> alpet ©   (30.08.05 11:31) [29]
- как правило, и не реагируют. А могут ?


alpet   (2005-08-30 11:31:00) [49]

ANB ©   (30.08.05 11:01) [28]

Потоки ввода ориентированны на консольные программы (точнее работающие с потоками). Приложение работающее с сообщениями не обязано реагировать на потоки ввода.


ANB   (2005-08-30 11:01:00) [50]

Вечером попробую. А эта скотина не может читать буквы из какого нибудь потока ввода вывода, типа стандартного ? Magic - это еще ладно, но почему SQL Plus себя так же ведет ? Какая тут может быть особенность ?


alpet   (2005-08-30 10:36:00) [51]

ANB ©   (30.08.05 09:50) [26]

Создай его с помощью CreateProcess, а потом в нужный момент приостанавливай его поток(и) через SuspendThread.


ANB   (2005-08-30 09:50:00) [52]

А чем его тормознуть ?


alpet   (2005-08-29 18:01:00) [53]

ANB ©   (29.08.05 17:57) [24]
А если сей поток приостановить, в его очереди сообщения от клавиатуры накапливаются? После возобновления в этом случае он должен обработать все нажатия, иначе - проигнорировать.


ANB   (2005-08-29 17:57:00) [54]


> alpet ©   (29.08.05 17:47) [23]
- ждет, более того, хуком я их нормально перехватываю.


alpet   (2005-08-29 17:47:00) [55]

ANB ©   (29.08.05 17:42) [22]
У него это поток постоянно работает, или иногда "ждет" сообщения (getMessage)?


ANB   (2005-08-29 17:42:00) [56]


> alpet ©   (29.08.05 17:37) [21]
- я уже спаем его так гонял. Обычные DOWN CHAR UP. Делаю тоже самое - никакого эффекта. Поток у него один. А на мышиные сообщения нормально реагирует.


alpet   (2005-08-29 17:37:00) [57]

ANB ©   (29.08.05 17:32) [20]
Вот-вот, выбери все окна у процессов приложения, напиши прогу с хуком на все сообщения (WH_GETMESSAGE), пускай по этим окнам шпионит за потоками. Так можно по идее выделить те что обрабатывают ввод из клавиатуры.


ANB   (2005-08-29 17:32:00) [58]


> alpet ©   (29.08.05 17:27) [19]
- да уж. Одновременно с тестированием нельзя за компом толком работать. Кстати, похожая ситуация с SQL Plus. Тоже на сообщения не захотел реагировать. Надо будет как нибудь взять недельку и поразбираться получше.


alpet   (2005-08-29 17:27:00) [59]

ANB ©   (29.08.05 17:16) [18]

Какой-нибудь из потоков этой системы таки может отвечать за ввод. Вероятно ты не все попробывал. Все же через SendInput (keybd_event), система тестирования не очень юзабельная.


ANB   (2005-08-29 17:16:00) [60]


> alpet ©   (29.08.05 17:09) [17]
- ее ни у кого нет, кроме нашей конторы. Отладчиком ее задерешься мучить - это система разработки, типа интерпретатора. Если они юзают эти функции, то придется (как я понял) писать внедрение, а чего то я побаиваюсь. Да и геммора будет еще на неделю, а у меня и так уже все работает.


Страницы:   1 2 3 4

Наверх

Титульная страница Поиск, карта сайта Написать письмо