![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как включить верхний регистр в чужом процессе ? [D7, Win2k, WinXP]
ANB © (2005-08-29 14:39:00)Чтобы напечатать строго большую или маленькую букву независимо от текущего состояния. Попробовал вот так - не помогает. :
- всегда печатает маленькими. Пробовал вместо FF - 1, никакого эффекта.
// Установим регистр
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);
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]
- ее ни у кого нет, кроме нашей конторы. Отладчиком ее задерешься мучить - это система разработки, типа интерпретатора. Если они юзают эти функции, то придется (как я понял) писать внедрение, а чего то я побаиваюсь. Да и геммора будет еще на неделю, а у меня и так уже все работает.