Форум: "WinAPI";
Текущий архив: 2005.11.06;
Скачать: [xml.tar.bz2];
ВнизКак включить верхний регистр в чужом процессе ? Найти похожие ветки
← →
ANB © (2005-08-29 14:39) [0]Чтобы напечатать строго большую или маленькую букву независимо от текущего состояния. Попробовал вот так - не помогает. :
- всегда печатает маленькими. Пробовал вместо 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);
← →
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 вся ветка
Форум: "WinAPI";
Текущий архив: 2005.11.06;
Скачать: [xml.tar.bz2];
Память: 0.54 MB
Время: 0.062 c