Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.11.06;
Скачать: CL | DM;

Вниз

Как включить верхний регистр в чужом процессе ?   Найти похожие ветки 

 
ANB ©   (2005-08-29 14:39) [0]

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

 // Установим регистр
 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, никакого эффекта.


 
alpet ©   (2005-08-29 15:35) [1]

Сначала VK_SHIFT, потом код символа, потом опять VK_SHIFT но с флажоком KEYEVENTF_KEYUP.


 
ANB ©   (2005-08-29 15:40) [2]


> alpet ©   (29.08.05 15:35) [1]
- а как узнать, что CAPS не нажат ?


 
begin...end ©   (2005-08-29 15:44) [3]

> ANB ©   (29.08.05 15:40) [2]

GetKeyState, VK_CAPITAL ?


 
alpet ©   (2005-08-29 15:45) [4]

ANB ©   (29.08.05 15:40) [2]
GetKeyState (VK_CAPITAL)?


 
alpet ©   (2005-08-29 15:46) [5]

begin...end ©   (29.08.05 15:44) [3]
Вобщем симметрично ☺


 
ANB ©   (2005-08-29 15:53) [6]

А если нажат, то придется и его эмулировать ?


 
begin...end ©   (2005-08-29 15:55) [7]

> ANB ©   (29.08.05 15:53) [6]

А если нажат, то зачем нажимать Shift?


 
ANB ©   (2005-08-29 16:00) [8]


> begin...end ©   (29.08.05 15:55) [7]
- чтобы символы печатать над цифрами. Хотя можно это отдельно поанализировать. А нету способа заставить SetKeyboardState работать ?


 
begin...end ©   (2005-08-29 16:10) [9]

> ANB ©   (29.08.05 16:00) [8]

> чтобы символы печатать над цифрами.

Не понял я.

> А нету способа заставить SetKeyboardState работать ?

Так она ж, вроде бы, только для текущего потока.


 
alpet ©   (2005-08-29 16:45) [10]

ANB ©   (29.08.05 16:00) [8]

Внедрение кода в поток разве что, но зачем это нужно?


 
ANB ©   (2005-08-29 16:45) [11]


> begin...end ©   (29.08.05 16:10) [9]
- дык знаю я. В справке по атачу написано, что ее надо использовать, чтобы обмануть SetKeyboardState. А не работает. Сделал уже через нажатие шифта с учетом капслука и поддержкой символов над цифрами (!@#$). Млин. Не нравится мне через keyb_event, а по другому не работает.


 
alpet ©   (2005-08-29 16:46) [12]

ANB ©   (29.08.05 16:45) [11]
Не работает с чем?


 
ANB ©   (2005-08-29 16:46) [13]


> alpet ©   (29.08.05 16:45) [10]
- ради такой простой задачи писать внедрение как то не очень охота. Еще сломаю чего нибудь.


 
ANB ©   (2005-08-29 16:47) [14]


> alpet ©   (29.08.05 16:46) [12]
- с программами на Magic. Он вообще игнорит обычные виндовые сообщения.


 
alpet ©   (2005-08-29 16:51) [15]

ANB ©   (29.08.05 16:47) [14]

Как же тогда раскладка переключается в ней? Сообщения обрабатываются в ней, без этого никак - попробуй поставить ловушку на сообщения, блокирующую ввод некоторых клавиш - в программе они не будут соответственно действовать. А про SetKeyboardState таки забудь, не для этого она придумана.


 
ANB ©   (2005-08-29 17:07) [16]


> alpet ©   (29.08.05 16:51) [15]
- я по всякому изгалился. В обычных делфовых программах хватает DOWN+CHAR+UP. В этой - нет. Чего туда еще запихать я уже не смог придумать. Через keyb_event работает. Может через GetKeyboardState кнопки достают, черт их знает. Вообще, глючная штука, израильтяне писали. Повбывав бы.


 
alpet ©   (2005-08-29 17:09) [17]

ANB ©   (29.08.05 17:07) [16]

У меня ее нет. Попробуй ее отладчиком помучать - если использует *KeyState функции - будут срабатывать бряки (если конечно можешь работать с окном CPU).


 
ANB ©   (2005-08-29 17:16) [18]


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


 
alpet ©   (2005-08-29 17:27) [19]

ANB ©   (29.08.05 17:16) [18]

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


 
ANB ©   (2005-08-29 17:32) [20]


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


 
alpet ©   (2005-08-29 17:37) [21]

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


 
ANB ©   (2005-08-29 17:42) [22]


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


 
alpet ©   (2005-08-29 17:47) [23]

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


 
ANB ©   (2005-08-29 17:57) [24]


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


 
alpet ©   (2005-08-29 18:01) [25]

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


 
ANB ©   (2005-08-30 09:50) [26]

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


 
alpet ©   (2005-08-30 10:36) [27]

ANB ©   (30.08.05 09:50) [26]

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


 
ANB ©   (2005-08-30 11:01) [28]

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


 
alpet ©   (2005-08-30 11:31) [29]

ANB ©   (30.08.05 11:01) [28]

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


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


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


 
alpet ©   (2005-08-30 13:51) [31]

ANB ©   (30.08.05 13:41) [30]

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


 
ANB ©   (2005-08-30 14:09) [32]


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


 
alpet ©   (2005-08-30 16:12) [33]

ANB ©   (30.08.05 14:09) [32]

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


 
ANB ©   (2005-09-01 11:28) [34]

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


 
alpet ©   (2005-09-01 11:40) [35]

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:43) [36]


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


 
ANB ©   (2005-09-01 11:46) [37]

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


 
ANB ©   (2005-09-01 11:50) [38]

Не, Ctrl туда не загоняется. Только Alt. Да хрен с ним. У меня редко это используется. Главное - в эдитах печатает. Кстати, как Tab правильно сэмулировать ? Чего то я его поломал.


 
ANB ©   (2005-09-01 12:25) [39]

Так, ест теперь через сообщения обычные кнопки, стрелки, Enter, Esc. Не ест сочетания кнопок и Tab.


 
alpet ©   (2005-09-01 16:29) [40]

допустим на форме есть несколько кнопок и таймер 100мс.
вот код таймера который будет перемещать фокус по кнопкам:

procedure Tmform.Timer1Timer(Sender: TObject);
begin
PostMessage (Handle, WM_KEYDOWN, VK_TAB, 0);
PostMessage (Handle, WM_KEYUP, VK_TAB, 0);
end;

Использование WM_CHAR при этом ничего не делает.



Страницы: 1 2 вся ветка

Текущий архив: 2005.11.06;
Скачать: CL | DM;

Наверх




Память: 0.56 MB
Время: 0.051 c
2-1129305358
intel
2005-10-14 19:55
2005.11.06
как проверить наличие файла на диске.


1-1129724857
Толян
2005-10-19 16:27
2005.11.06
поиск файла


14-1129580754
Kolan
2005-10-18 00:25
2005.11.06
Что-то всем на ночь глядя иконок справа от темы захотелось..


14-1129056541
Kerk
2005-10-11 22:49
2005.11.06
Поставил себе ярко красный wallpaper...


1-1129273540
ой
2005-10-14 11:05
2005.11.06
TGroupBox + скроллинг