Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2005.11.06;
Скачать: [xml.tar.bz2];

Вниз

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

 
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 вся ветка

Форум: "WinAPI";
Текущий архив: 2005.11.06;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.54 MB
Время: 0.062 c
1-1129724857
Толян
2005-10-19 16:27
2005.11.06
поиск файла


4-1125653799
Piero
2005-09-02 13:36
2005.11.06
Сигналы CommPortа


3-1127564247
erika
2005-09-24 16:17
2005.11.06
формирование запроса


1-1129723022
apellido
2005-10-19 15:57
2005.11.06
Как ограничить кол-во символов в TEdit для пропорц. шрифтов


2-1129119864
Kel
2005-10-12 16:24
2005.11.06
Есть разница между комбинированием констант





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский