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

Вниз

Handle поля ввода чужого приложения   Найти похожие ветки 

 
Nostradamus   (2006-01-29 18:19) [0]

Имеется следующая проблема: нужен хэндл поля ввода чужого приложения, причем именно того контрола который последний имел фокус перед тем как юзер переключился на мою программу. Это должно работать с любой чужой прогой и любым контролом ввода текста т.е. Edit, Memo, Rich Edit, ComboBox и т.д.
Пробовал ставить хук на EN_KILLFOCUS и на WM_COMMAND - что-то ловилось, но толко не то что нужно :( Пробовал ставит следуюшие хуки: WH_CALLWNDPROCRET, WH_CALLWNDPROC, WH_GETMESSAGE, WH_MSGFILTER, WH_SYSMSGFILTER. Что характерно с WM_COMMAND оно таки работало, но только с котролами моей программы...
Такое ощущение, что я близок к правилному решению, но я к сожалению не могу доперет, что нужно изменить :(
Плюс когда я так делаю я не знаю как определить тип контрола хэндл которого я получаю
.

Заранее благодарен.

Вот как я делал:

function ShellHook(Code: Integer; ParamW: WPARAM; ParamL: LPARAM): LRESULT; stdcall;
var
pMsg : PHookMsg;
begin
pMsg := Pointer(ParamL);
if (pMsg^.Msg = WM_COMMAND)  then
 SendMessage(Data^.AppWnd, WM_USER, ParamW, pMsg^.LPARAM);
Result := CallNextHookEx(Data^.OldHook, Code, ParamW, ParamL)
end;

function SetShellHook(Wnd: HWND): BOOL; stdcall;
begin
 if Data <> nil then
 begin
   Data^.AppWnd := Wnd;
   Data^.OldHook := SetWindowsHookEx(WH_CALLWNDPROCRET, @ShellHook, HInstance, 0);
   Result := Data^.OldHook <> 0
 end
 else Result := False
end;


 
Nostradamus   (2006-01-30 13:11) [1]

Блин, не ужели нет ни у кого никаких идей?

После долгих проб и ошибок решил сделать по-другому:
Поставил хук WH_SHELL и ловлю им когда активируется чужое окно, там уже можно с помощью FindWindowEx или EnumChildWindows найти нужный мне контрол. Только теперь проблема определить
1. Поле ввода найденый котрол или нет и
2. Иммет ли он сейчас фокус

Думаю насчет фокуса должно получитсиа если буду хуком ловить WM_SETFOCUS,
а вот как определить действително ли контрол для ввода текса - ума не приложу.

Подскажите пожалуйста как решить эту проблему.
Буду рад если меня пошлют в MSDN :)

P.S. Может я не понятно объяснил задачу?


 
kaZaNoVa ©   (2006-01-30 13:14) [2]


> 1. Поле ввода найденый котрол или нет и

может тип какой-нить глянуть?


 
Nostradamus   (2006-01-30 13:20) [3]

В том то и дело, что не понятно куда глядеть :(
Можно получить имя класса (GetClassName), но оно ничего не даст :(


 
Игорь Шевченко ©   (2006-01-30 13:29) [4]

AttachThreadInput + GetFocus не поможет ?


 
Nostradamus   (2006-01-30 13:40) [5]

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


 
Nostradamus   (2006-01-30 13:44) [6]

Остаётся вопрос как определить тип контрола?


 
Игорь Шевченко ©   (2006-01-30 13:50) [7]


> как определить тип контрола?


GetClassName.

А если не секрет, в связи с чем такая задача возникла ?


 
Nostradamus   (2006-02-01 12:37) [8]

Огромное спасибо!!! AttachProcessInput оказалось именно то, что нужно.
Определять тип контрола мне уже не нужно - я придумал как без этого обойтись.

> А если не секрет, в связи с чем такая задача возникла ?

Делаю программу которая должна ускорять ввод часто повторяющихся кусков текста, т.е. как скажем в Ворде автозамена и шаблоны, только должно работать везде где можно вводить текст.



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

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

Наверх




Память: 0.48 MB
Время: 0.036 c
4-1138547949
Nostradamus
2006-01-29 18:19
2006.04.16
Handle поля ввода чужого приложения


2-1143297744
KING
2006-03-25 17:42
2006.04.16
Нормализация БД


2-1143821900
Delphi_is_cool
2006-03-31 20:18
2006.04.16
Создание кнопки на GroupBox


8-1131809965
Jimmy
2005-11-12 18:39
2006.04.16
Сохранение bmp файла из image с нужным dpi


11-1124895800
shalex
2005-08-24 19:03
2006.04.16
Не могу установить компоненты от 5-й версии