Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.08.2014, 21:57   #1
Lexus_
 
Регистрация: 20.08.2014
Сообщений: 5
По умолчанию Перенаправление вывода с неконсольной программы

Здравствуйте! Задача такова: есть программа для голосового ввода RealSpeaker (сайт realspeaker.net). В трее висит окно, при произношении голосом пользователю нужно поставить курсор в любое поле ввода (в ворд, браузер, консоль итп) и слова будут преобразовываться в текст в данном поле. Мне нужно сделать так, чтобы текст, генерируемый программой не попадал в поле ввода, а перехватывался моей программой (или перенаправлялся в файл).
Погуглив, пытался перенаправить в файл через stdoutput:
Код:
implementation

{$R *.dfm}

var
  stdOut: THandle;
  startUpInfo: TStartUpInfo;
  ProcInfo: TProcessInformation;
  SecAtrtrs: TSecurityAttributes;
begin
 with SecAtrtrs do
  begin
    nLength := SizeOf(TSecurityAttributes);
    lpSecurityDescriptor := nil;
    bInheritHandle := true;
  end;
  stdOut := CreateFile('D:\123.txt', GENERIC_WRITE, 0,  @SecAtrtrs, 
        CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
  FillChar(startUpInfo, SizeOf(TStartUpInfo), 0);
  startUpInfo.cb := SizeOf(TStartUpInfo);
  startUpInfo.hStdOutput := stdOut;
  startUpInfo.dwFlags :=  STARTF_USESTDHANDLES;
  CreateProcess(Pchar('C:\Program Files (x86)\RealSpeaker Inc\RealSpeaker\RealSpeaker.exe'),
    nil, nil, nil, true, NORMAL_PRIORITY_CLASS, nil, nil, StartupInfo, ProcInfo);
  sleep(20000);
  CloseHandle(ProcInfo.hThread);
  CloseHandle(ProcInfo.hProcess);
  closeHandle(stdOut);

end.
Однако, насколько я понимаю, замена stdoutput в неконсольных приложениях не работает? (с консольными все работает). Есть ли какое-нибудь решение данной задачи?
Заранее спасибо.

Последний раз редактировалось Stilet; 20.08.2014 в 22:35.
Lexus_ вне форума Ответить с цитированием
Старый 20.08.2014, 22:38   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
замена stdoutput в неконсольных приложениях не работает?
Ну вообще-то можно его прикрутить и к оконке, но это мутный пилотаж. Околохакерская область.
Цитата:
Есть ли какое-нибудь решение данной задачи?
Самое простое: Повесить таймер. В таймере определять активное поле ввода, и постоянно получать из него значение сравнивая. Получил - запомнил - получил следующее - сравнил - совпало - не реагировать - не совпало - запомнить для последующего сравнения.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 21.08.2014, 00:10   #3
eoln
Старожил
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,645
По умолчанию

Только следует учесть то, что поле ввода может заполнять не только RealSpeaker, но и другая программа или просто человек с клавиатуры. Не знаю как устроена эта программа, но первое что приходит на ум так это либо хуки с проверкой откуда ввод идёт, либо какой-нибудь инжект или другая бяка в этом роде.
eoln вне форума Ответить с цитированием
Старый 21.08.2014, 06:57   #4
Lexus_
 
Регистрация: 20.08.2014
Сообщений: 5
По умолчанию

А поподробней можно насчет хука в дельфи? Какие-нибудь рабочие примеры?

Последний раз редактировалось Lexus_; 21.08.2014 в 07:06.
Lexus_ вне форума Ответить с цитированием
Старый 21.08.2014, 08:02   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
хуки с проверкой откуда ввод идёт
А как в Хуке такое реализовать?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 21.08.2014, 08:39   #6
Lexus_
 
Регистрация: 20.08.2014
Сообщений: 5
По умолчанию

В принципе с помощью полей ввода получается можно сделать так:
если ввод в активное поле ввода идет с клавы (перед этим в ближайшие х милисекунд нажимались клавиши), то все введенное не трогать;
отслеживать буфер обмена и если было скопировано с него в поле ввода - тоже не трогать;
а в остальных случаях вырезать из поля и перенаправлять в программу. Однако есть минус: во время работы всей конструкции курсор ввода должен быть обязательно в каком-то (любом) поле. А если я захочу убрать его, сделаю активным другой элемент окна и в это время буду говорить - ничего не сработает, текст никуда не введется. Есть ли какое-то решение?
Lexus_ вне форума Ответить с цитированием
Старый 21.08.2014, 09:52   #7
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Есть ли какое-то решение?
Можно узнать зачем тебе это понадобилось?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 21.08.2014, 10:40   #8
Lexus_
 
Регистрация: 20.08.2014
Сообщений: 5
По умолчанию

Хочу прикрутить к проге голосовой ввод-вывод. С выводом проблем нет никаких - и консольные и неконсольные, данные передавай чем хочешь. А вот со вводом сложнее.
Lexus_ вне форума Ответить с цитированием
Старый 21.08.2014, 20:15   #9
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Хочу прикрутить к проге голосовой ввод-вывод.
Извини, не пойму зачем тут перехват нужен?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 21.08.2014, 22:27   #10
Lexus_
 
Регистрация: 20.08.2014
Сообщений: 5
По умолчанию

Чтобы текст со спикера поступал только в мою программу и никуда иначе без всяких телодвижений со стороны пользователя
Lexus_ вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
перенаправление вывода insmod Sam Gold Qt и кроссплатформенное программирование С/С++ 0 19.11.2012 12:55
Запуск консоли и перенаправление вывода ros.pro Общие вопросы Delphi 1 02.01.2012 18:49
Перенаправление стандартного ввода/вывода в файл Роман Радер Общие вопросы C/C++ 1 09.01.2010 18:34
Перенаправление ввода/вывода dudeboy Win Api 0 16.11.2009 11:36
перенаправление вывода на консоль в файл Ulex Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 3 26.01.2009 15:31