Доброе время суток, ачат. Заморочился созданием программы по принципу "punto switcher", но столкнулся с грустной проблемой. Чтобы изменять вводимый пользователем текст (переводить "ghbdtn" в "привет") поступаю по-варварски: 1. ставлю глобальный хук на пробел (VK_SPACE) 2. при его нажатии отправляю в тот_элемент_с_которым_работает_юзер сообщение EM_SETSEL (выделить всё) 3. затем отправляю WM_COPY (ну или WM_CUT) чтобы скопировать выделенный текст 4. меняю содержимое буфера (clipboard.asText) на "исправленное" 5. вставляю новое содержимое с помощью отправки WM_PASTE Но такой метод работает только с обычными приложениями, где есть собственно элемент типа TEdit или схожие. В игрушках 3D, и почему-то в браузере (Chrome) выделение/копирование/вставка не происходят. Сначала я думал, что неверно определяю HWND нужного контрола, но метод, по идее, должен быть универсален. Вот как оно работает: Code: ... var pgui:TGUITHREADINFO; hw,hwE:HWND; ... hw:=GetForegroundWindow; //активное окно с которым работает юзер pgui.cbSize:=SizeOf(TGUIThreadInfo); GetGUIThreadInfo(GetWindowThreadProcessId(hw,0),pgui); hwE:=pgui.hwndFocus; //тот контрол этого окна, в котором стоит фокус ввода клавиатуры (мигает курсор) if(hwE<=0) then hwE:=hw; //на всякий случай, если его нет, берем hwnd основного окна Подозреваю, что SendMessage заставить работать в 3Д игрушке (напр. WoW) не получится, т.к. там в принципе нет контролов и все поля ввода "нарисованные". Но должен ведь быть какой-то способ решить задачу? Пробовал использовать keybd_event - он слишком глючный, медленный и ненадежный, приходится ставить sleep после каждого нажатия/отжатия и все равно иногда тупит. Пробовал использоватьSendInput - он у меня работает примерно так же, как keybd_event, но лаговглюков еще больше. Мб, криво пробовал. Собсна, выручайте плз)
проблема с сендинпутом и прочими эмуляциями - в том, что... что если я делаю через эмуляцию нажатия CTRL+A CTRL+C а потом читаю буфер clipboard.asText то в буфере, как мне кажется, не успевает появиться нужное мне значение а ставить задержку между эмуляцией и чтением из буфера - не вариант, ибо все нужно сделать быстро с sendMessage WM_Copy такого не было, мгновенно копировало все, и можно было сразу, обработав, вставить обратно =|
я не понимаю, как работает punto switcher он ведь тоже копирует, вырезает, переделывает, вставляет исправленное? или как... не понимаю. подскажите?